Enterprise エディション
検証 — 詳細リファレンス
Validation モジュールは、生の PDF バイト列に対して事前構築済みの読み取り専用構造コンプライアンスポリシーを実行します。Compliance::assess() はちょうど 1 つの CompliancePolicy を適用し、深刻度で分割された検出結果と必須の法的免責事項を伴う ComplianceReport を返します。ポリシーは PDF/A-4(および e と f のバリアント)、PAdES baseline 構造、eIDAS 構造プロファイル、LTV/DSS の健全性、ZUGFeRD / Factur-X、FDA 21 CFR Part 11、SEC Rule 17a-4 WORM アーカイブ向けに同梱されています。すべてのポリシーは純粋関数です。バイトを入力し、検出結果を出力します。Validation はドキュメントを変更することは決してなく、暗号的な検証を行うことも決してありません。
提供状況とライセンス
「提供状況とライセンス」という見出しのセクションこのケイパビリティは NextPDF Enterprise(nextpdf/enterprise)に同梱され、Enterprise ティアのライセンスエンベロープで有効化されます。そのエンタイトルメントを持たないデプロイメントは、このケイパビリティのクラスをロードしません。エディションを比較してライセンスを取得。
Validation/Evidence サーフェスは、enterprise.compliance.evidence ケイパビリティによってライセンスされます。エンタイトルメントが拒否された場合は、暗黙的に機能を縮退させるのではなく、機能を拒否します。
| Tier | 検証サーフェス |
|---|---|
| Core | インプロセスのバイトストリームバリデーターと文法のクロスチェック。検出結果ゼロという結果はチェックされた結果であり、認証ではない。 |
| Pro | e-invoice レイヤーでのインプロセスの EN 16931 / Factur-X / ZUGFeRD 検証。事前構築済みの PDF/A-4、PAdES、LTV、FDA、SEC ポリシーは提供しない。 |
| Enterprise | PDF/A-4、PAdES、LTV、ZUGFeRD、FDA Part 11、SEC 17a-4 向けの事前構築済み構造ポリシーと統一されたレポート(このモジュール)。 |
Enterprise Compliance の外部サイドカーゲートウェイは、独立した別個のモジュールです。
公開 API サーフェス
「公開 API サーフェス」という見出しのセクションcomposer require nextpdf/enterprise:^3| Symbol | Parameters | Default behavior | Returns | Throws or fails with | Notes |
|---|---|---|---|---|---|
Compliance::__construct | ?ClockInterface $clock = null | クロックが注入されない場合はシステムクロック | — | — | DI フレンドリーなインスタンス形式。クロックが validatedAt を刻印 |
Compliance::run | string $pdfData, CompliancePolicy $policy, array $context = [] | ちょうど 1 つのポリシーを適用し、実時間の所要時間を測定 | ComplianceReport | カスタムポリシーの例外を伝播。組み込みポリシーは throw せずに検出結果を収集 | インスタンスメソッド |
Compliance::assess(静的) | string $pdfData, CompliancePolicy $policy, array $context = [] | デフォルトインスタンスを構築し run() に委譲 | ComplianceReport | run() と同じ | ゼロ設定の高速パス |
Policies::pdfA4 / ::pdfA4e / ::pdfA4f(静的) | — | ISO 19005-4:2020 に従う PDF/A-4 構造ポリシー | CompliancePolicy | — | e は 3D/リッチメディア注釈を許可。f は埋め込みファイル関係チェックを追加 |
Policies::padesBaseline(静的) | — | PAdES B-B 構造チェック | CompliancePolicy | — | 構造のみ。暗号的な検証はなし |
Policies::eidasQualified(静的) | — | eIDAS ラベル付きプロファイル下での PAdES 構造チェック | CompliancePolicy | — | 適格性は TSP と適格証明書に依存 |
Policies::ltvHealth(静的) | — | DSS 構造健全性チェック | CompliancePolicy | — | DSS の存在はアクティブなオブジェクトグラフから解決、フェイルクローズド |
Policies::zugferd(静的) | string $profile = 'BASIC' | プロファイルエイリアスを正規化し ZUGFeRD バリデーターを構築 | CompliancePolicy | \ValueError(未知のプロファイル) | プロファイル: MINIMUM, BASIC, BASIC_WL, EN16931, EXTENDED |
Policies::fdaPart11(静的) | — | FDA 21 CFR Part 11 構造ポリシー | CompliancePolicy | — | 監査証跡ハッシュチェーンの整合性を含む 7 つの構造チェック |
Policies::sec17a4 / ::sec17a4Compatible / ::sec17a4Structural / ::sec17a4PreSign(静的) | — | 指定された厳格度での SEC 17a-4 WORM ポリシー | CompliancePolicy | — | 厳格度は WormComplianceLevel にマップ |
CompliancePolicy(インターフェース) | — | 1 つの標準に対するストラテジーコントラクト | — | — | getName(), getIdentifier(), getStandardReference(), validate()。顧客が実装可能 |
ComplianceReport | 読み取り専用値オブジェクト | 検出結果は構築時に深刻度で分割 | — | — | passes(), fails(), totalFindings(), getDisclaimer()。public な findings, errors, warnings, infos, policyName, policyId, standard, validatedAt, durationMs |
ComplianceFinding | Severity $severity, string $ruleId, string $message, string $clause = '', string $suggestion = '' | 条項参照と是正ヒントを伴う 1 つのルール結果 | — | — | 静的な error() / warning() / info()。isError() |
Severity(enum) | 文字列バックの 3 ケース | Error, Warning, Info | — | — | Error のみがレポートを失敗させる |
WormComplianceLevel(enum) | 文字列バックの 4 ケース | Full, Compatible, Structural, PreSign | — | — | requiresSignature(), requiresDocMdp(), requiresLtv(), maxDocMdpLevel() |
PdfAPolicy, PadesValidator, LtvHealthCheck, ZugferdValidator, Sec17a4WormPolicy, Fda\FdaPart11Policy | クラスごとのコンストラクタ | それぞれ 1 つの標準に対して CompliancePolicy を実装 | validate() からの list<ComplianceFinding> | — | Policies 経由で取得。Sec17a4WormPolicy::getLevel() は設定された厳格度を公開 |
Fda\FdaSigningIntent(enum) | 文字列バックの 6 ケース | Authoring, Review, Approval, Certification, Verification, Rejection | — | — | toPdfReasonString() は正規の /Reason 文字列を生成 |
Fda\FdaAuditEvent::__construct | DateTimeImmutable $timestamp, string $actor, FdaSigningIntent $action, string $documentHash, string $certificateSerial, string $previousEventHash = '' | 構築時に SHA-256 チェーンハッシュを計算 | — | InvalidArgumentException(タイムスタンプが UTC でない) | public な eventHash。toXmpRdf() は 1 つの XMP リストアイテムをシリアライズ |
Fda\FdaAuditTrail::addEvent | FdaAuditEvent $event | チェーンリンクが証跡の末尾と一致するときにイベントを追加 | self | InvalidArgumentException(ハッシュチェーンの破損) | createEvent(), verifyChain(), getLastEventHash(), getEvents(), embedInMetadata() も提供 |
Fda\FdaSignatureEnforcer::configureSeedValue | FdaSigningIntent $intent, string $tsaUrl | FDA 制約付きの署名シード値設定を構築 | SeedValueConfig | — | FDA の理由セット、タイムスタンプ、SHA-256 以上のダイジェストを要求 |
Fda\FdaSignatureEnforcer::applyTo | SequentialSigner $signer, SigningStrategy $strategy, string $signerName, FdaSigningIntent $intent, string $tsaUrl, string $fieldName = '', ?string $reason = null | Pro の SequentialSigner に FDA 制約付き署名者を追加 | SequentialSigner | — | 制約を生成される署名フィールドにシリアライズ |
namespace NextPDF\Enterprise\Validation;
final readonly class Compliance{ public function __construct(?ClockInterface $clock = null);
/** @param array<string, mixed> $context */ public function run(string $pdfData, CompliancePolicy $policy, array $context = []): ComplianceReport;
/** @param array<string, mixed> $context */ public static function assess(string $pdfData, CompliancePolicy $policy, array $context = []): ComplianceReport;}final class Policies{ public static function pdfA4(): CompliancePolicy; // also pdfA4e(), pdfA4f() public static function padesBaseline(): CompliancePolicy; public static function eidasQualified(): CompliancePolicy; public static function ltvHealth(): CompliancePolicy; public static function zugferd(string $profile = 'BASIC'): CompliancePolicy; public static function fdaPart11(): CompliancePolicy; public static function sec17a4(): CompliancePolicy; // also sec17a4Compatible(), sec17a4Structural(), sec17a4PreSign()}interface CompliancePolicy{ public function getName(): string;
public function getIdentifier(): string;
public function getStandardReference(): string;
/** * @param array<string, mixed> $context * @return list<ComplianceFinding> */ public function validate(string $pdfData, array $context = []): array;}
final readonly class ComplianceReport{ public const string LEGAL_DISCLAIMER;
public function passes(): bool;
public function fails(): bool;
public function totalFindings(): int;
public function getDisclaimer(): string;}挙動コントラクト
「挙動コントラクト」という見出しのセクションCompliance::assess()(静的)と Compliance::run()(インスタンス。注入可能な Psr\Clock\ClockInterface を伴う)は、ちょうど 1 つのポリシーを適用し、ComplianceReport を返します。外部から観測可能なルール:
- 純粋な読み取り専用。 すべての
CompliancePolicy::validate()は純粋関数です。バイトを入力し、検出結果を出力します。ポリシーが PDF バイト列を変更することは決してありません。このアーキテクチャ上の不変条件により、検証は自動修正および Evidence モジュールとは区別された状態に保たれます。 - 深刻度ゲート。
ComplianceReport::passes()はerrors === []の場合にのみ true になります。警告と情報がレポートを失敗させることは決してありません。fails()はその補集合です。 - 必須の免責事項。
ComplianceReport::getDisclaimer()は、定数の法的免責事項テキストを返します。これをユーザー向けの出力に表示することが、コントラクトによって必須とされています。 - レポートの来歴。 レポートには、ポリシーからのポリシー名、識別子、標準参照、注入されたクロックまたはシステムクロックからの検証タイムスタンプ、測定された所要時間(ミリ秒)が含まれます。
- 収集し、中断しない。 組み込みポリシーは、適用可能なすべてのチェックを実行し、最初のエラーで停止するのではなくすべての検出結果を収集します。
- カタログ到達可能な DSS のみ。
LtvHealthCheckは、アクティブなオブジェクトグラフ(アクティブなトレーラー、次に/Rootカタログ、次に/DSSとそのサブキー)から DSS の存在を解決します。コメント、文字列、孤立オブジェクト、または置き換えられたリビジョンに植え込まれたマーカーバイトはカウントされません。パース不能な入力は DSS なしとして扱われるため、チェックはフェイルクローズドになります。このチェックは構造的であり、埋め込まれた OCSP/CRL データを暗号的に検証することはありません。 - 構造的な署名チェック。
Policies::padesBaseline()とPolicies::eidasQualified()は、PAdES 構造を PDF レベルでのみ検証します。eIDAS 下での適格性は TSP と適格証明書に依存しており、これらはこのモジュールの対象外です。 - 規制業界向けポリシーは構造的。
FdaPart11Policyは、署名の存在、/Reasonの意図、/Mの署名時刻、/Nameの識別情報、JavaScript の不在、FDA 監査証跡の名前空間、ハッシュチェーンの整合性をチェックします。Sec17a4WormPolicyは最大 13 の WORM ルールをチェックし、WormComplianceLevelが厳格度を選択します。Fullは DocMDP レベル 1 を要求し、Compatibleはレベル 2 を受け入れ、Structural/PreSignは署名、DocMDP、DSS のルールをスキップします。いずれのポリシーも法的なコンプライアンスを確立するものではありません。 - ZUGFeRD のコンテキスト。
Policies::zugferd()は、常に PDF レベルの要件をチェックします。呼び出し元が$contextに['xml' => $xmlData]を渡した場合にのみ請求書 XML を検証します。それ以外の場合は情報検出結果zugferd-xml-skippedを発行します。 - 改ざん検知可能な監査証跡。
FdaAuditTrailは追記専用の SHA-256 ハッシュチェーンです。addEvent()は破損したリンクを拒否し、verifyChain()はすべてのハッシュを再導出し、embedInMetadata()は証跡をhttp://ns.nextpdf.dev/fda/1.0/の下の XMP に PDF/A 拡張スキーマとともに書き込みます。
エッジケースと障害モード
「エッジケースと障害モード」という見出しのセクション- PDF でない入力や空の入力は、組み込みポリシーでは例外ではなくエラー検出結果を生み出します。常に
passes()を確認し、免責事項を表示してください。 Policies::zugferd()はプロファイルエイリアス(BASIC_WL、EN16931、EN_16931)を正規化します。未知のプロファイルは、いかなる検証も実行される前のファクトリ時に\ValueErrorを発生させます。- CRL はあるが OCSP レスポンスがない DSS は、失効マテリアルチェックを満たします。検出結果は許容される代替を記載します。どちらも存在しない場合はエラーになります。
/VRIディクショナリまたは/Certs配列の欠落は、エラーではなく警告を生成します。レポートはそれでもパスできます。FdaAuditEventは、UTC でないタイムスタンプを構築時にInvalidArgumentExceptionで拒否します。FdaAuditTrail::verifyChain()は、改ざんまたは並べ替えられたイベントに対して false を返します。throw することは決してありません。- カスタムの
CompliancePolicy実装はvalidate()から throw する場合があります。Compliance::run()はキャッチしないため、そのような例外は呼び出し元に伝播します。
FIPS モードの挙動
「FIPS モードの挙動」という見出しのセクションこのモジュールは、署名、暗号的な検証、鍵の保管を一切行いません。FIPS モードのアルゴリズムポリシーは、Security モジュールと Signature モジュールが管理します。FdaSignatureEnforcer のシード値は、FDA 制約付き署名フィールドを SHA-256、SHA-384、または SHA-512 のダイジェストメソッドに制約します。
これらのポリシーは、名前付き標準に照らして構造属性をチェックします。ISO/ETSI プロファイルに対する適合の判定は、最終ファイルと外部バリデーターの組み合わせの属性であり続けます。
| Behavior | Reference |
|---|---|
| 生成者ではなく標準に基づいて判定される適合性 | ISO 19005-4:2020 §5.2 |
| 長期検証のためのデジタル署名ディクショナリ / DSS | ISO 32000-2:2020 §12.8 |
DSS はドキュメントカタログの DSS キーが保持するディクショナリ | ISO 32000-2:2020 §12.8.4.3 |
| PAdES baseline 署名レベル | ETSI EN 319 142-1 §5.4.3 |
| EN 16931 プロファイルのセマンティックモデル(補足的な参照) | Factur-X 1.08 (EN 16931) |
FDA 21 CFR Part 11 および SEC 17a-4 ポリシーは、構造属性のみをチェックします。これらの規制は検証コーパスの範囲外であり、検証済みの適合性主張は付与されません。FDA の検出結果内の条項文字列(例えば §11.50、§11.10(e))は、製品が発行するルール参照です。EN 16931 の行は取得フロアを下回る補足的な参照であり、ハードな適合性主張ではありません。ある標準をサポートしていることは、その標準への適合を意味せず、適合は認証でもありません。NextPDF はいかなる認証も保有しておらず、いかなる認証も付与しません。このリファレンスは法的意見ではありません。法的な十分性については、お客様のコンプライアンスチームにご相談ください。
開発上の注意
「開発上の注意」という見出しのセクション- 検証はインプロセスかつローカルで実行され、ネットワーク I/O はありません。ポリシーが入力を変更することはできません。
- 信頼できないソースからの PDF バイト列を敵対的なものとして扱ってください。組み込みポリシーは任意のバイトに対して全域的であり、構造を解決できない箇所ではフェイルクローズドになります。
- レポートのすべてのユーザー向けレンダリングで
ComplianceReport::getDisclaimer()を表示してください。 - レポートと検出結果は、署名済みドキュメントや監査証跡メタデータに由来する個人データ(署名者名、証明書シリアル)を含む場合があります。保持と最小化の管理策はオペレーターが所有します。
- カスタムポリシーは
CompliancePolicyを実装します。シリアライズとキャッシュのために、getIdentifier()はすべてのポリシーにわたって一意に保ってください。 - このモジュールは暗号的な機能に関わります。ご自身のレビューではセキュリティ上重要なものとして扱ってください。
- 内部メカニズムの詳細はソースリポジトリの内部ドキュメントにとどまり、このマニュアルの対象外です。
公開範囲の境界
「公開範囲の境界」という見出しのセクションこのページは、外部から観測可能な挙動とサポートされる公開 API サーフェスのみを記述します。内部名前空間パス、ヘルパークラス、メカニズムのテーブル、ランブックのファイル名、チケットプレフィックスは対象外です。