コンテンツにスキップ

コンプライアンス: PDF/R-1 バリデーター、Arlington 文法、ライフサイクルツール

NextPDF\Compliance は、完成した PDF を読み取り、規範上の契約からの逸脱を報告するバイトストリームバリデーターと文法クロスチェックを提供します。バリデーターが検出結果ゼロを返すのは、実装済みの箇条について チェック済み であることを示す結果であり、包括的な認証ではありません。

Terminal window
composer require nextpdf/core:^3

このモジュールは、3 つの部分で構成されています。

PdfRValidator は、候補となる ISO 23504-1:2020 (PDF/R-1) バイトストリームを検証します。これは、ライターの内部状態ではなく、生のバイトに対して動作します。ライターが出力しようとする内容と、仕様が要求する内容とのずれを検出します。これは最終チェックです。実装されている箇条のセットは v5.1.0 クラスターです。§5 バージョン識別コメント、§6.2.2/§6.2.3 ヘッダー許可リスト、§6.2.4 世代番号 0 およびオブジェクトストリームの禁止、§6.5.7 コンテンツストリーム演算子許可リスト (qQcmDo のみ)、§6.6.1 画像 XObject キー許可リスト、§6.4.3 Info ディクショナリキー許可リスト、および §6.3 Catalog キー許可リストです。§6.7 のインクリメンタル更新と §6.8 の暗号化は、初期クラスターでは明示的に対象外であり、claims.json でもそのように宣言されています。バリデーターは最初の検出結果で例外を発生させません。すべての逸脱を 1 回のパスで収集するため、呼び出し元は完全な差分を確認できます。

PdfRConformancePolicy は、PDF/R-1 周辺の 推奨されるが情報提供にとどまる 範囲に対するイミュータブルなポリシーです。規範的な §6 の下限が、構成可能になることはありません。このポリシーが制御するのは、§A.5 の実装上限に関する推奨事項、§6.6.1 のマルチストリップ非推奨、および下流の PDF/A 再分類に向けた §A.6 の XMP 要件のみです。

ArlingtonValidator は、上流の PDF Association Arlington PDF モデルをレポート専用モードで駆動します。現在のサイクルでは常に助言的です。validateReportOnly() は例外をスローしません。3 つのモードにわたって段階的に縮退します。リファレンスチェッカーのバイナリがある場合は、構造化された検出結果を解析します。ピン留めされた文法のみがある場合は、文法ピンが読み込まれたことを証明する info 検出結果を 1 件出力します。文法がない場合は、空のリストを返します。WaiverRegistry を使用すると、オーケストレーターは監査証跡を保持しながら、許容可能と判明している不一致を抑制できます。

この誠実性ルールは、CSS サポートマトリックスや適合性モジュールと共通です。箇条が Verified となるのは、合格するテストが存在し、規範的な箇条が引用されている場合のみです。実装されているものの、専用の合格フィクスチャがない箇条は Claimed となります。対象外の箇条は、曖昧なまま放置されるのではなく、明示的に記載されます。検出結果ゼロの PdfRValidator の結果がアサートするのは、実際にチェックする箇条のみです。実装していない §6.7 や §6.8 については、いかなる主張も行いません。

種別主なメンバー
NextPDF\Compliance\Validator\PdfRValidatorfinal classvalidate(string $pdfBytes): list<PdfRValidationFinding>
NextPDF\Compliance\Validator\PdfRValidationFindingfinal readonly classstring $clause, 'error'|'warning'|'info' $severity, string $message
NextPDF\Compliance\Profile\PdfRConformancePolicyfinal readonly class__construct(bool $enforceA5ImplementationLimits = true, bool $rejectMultiStripPages = false, bool $requireXmpForA6Compatibility = false); lax(), strictArchival()
NextPDF\Compliance\Validator\ArlingtonValidatorfinal classvalidateReportOnly(string $pdfPath): list<ArlingtonFinding>
NextPDF\Compliance\Validator\WaiverRegistryfinal classisWaived(string $validator, string $ruleId, string $scopeKey): bool
<?php
declare(strict_types=1);
use NextPDF\Compliance\Validator\PdfRValidator;
$validator = new PdfRValidator();
$findings = $validator->validate(file_get_contents('candidate.pdf'));
if ($findings === []) {
// Zero divergences from the §6 clauses PdfRValidator implements.
// This is NOT a PDF/R-1 certificate — §6.7 and §6.8 are not checked.
echo "No PDF/R-1 §6 divergences detected (implemented clause set).\n";
} else {
foreach ($findings as $f) {
echo "[{$f->severity}] §{$f->clause}: {$f->message}\n";
}
}
<?php
declare(strict_types=1);
use NextPDF\Compliance\Validator\ArlingtonValidator;
use NextPDF\Compliance\Validator\ArlingtonGrammarLoader;
use NextPDF\Compliance\Validator\WaiverRegistry;
$validator = new ArlingtonValidator(
waivers: new WaiverRegistry(/* loaded waiver entries */),
grammar: new ArlingtonGrammarLoader(/* pinned submodule path */),
adapter: null, // grammar-only mode when the reference checker is absent
);
// Advisory by contract — never throws on findings.
$findings = $validator->validateReportOnly('artifact.pdf');
foreach ($findings as $finding) {
// Each finding pins the Arlington grammar commit SHA for provenance.
logger()->info('arlington', [
'rule' => $finding->ruleId,
'severity' => $finding->severity,
'grammarSha' => $finding->grammarSha,
]);
}
  • PdfRValidator は正規表現ベースであり、完全なパーサーではありません。 対象は NextPDF\Writer\PdfRWriter の決定論的な出力です。そのライターのドリフト検出器として機能します。汎用的な PDF パーサーではありません。
  • 検出結果ゼロ ≠ 完全な PDF/R-1 適合性。 §6.7 (インクリメンタル更新) と §6.8 (暗号化) は v5.1.0 クラスターでは実装されておらず、claims.json で対象外と宣言されています。クリーンな結果は、あくまで「実装された箇条のセットに逸脱がない」ことを示すものとして扱い、それ以上の意味は持たせないでください。
  • Arlington は助言的です。 validateReportOnly() は、現在のサイクルではビルドを失敗させることはありません。CI はこのアーティファクトを消費しますが、ゲートには使用しません。
  • PDF/A ICC 検証はここにはありません。 ISO 19005-4:2020 §6.2.2 OutputIntent ICC 検証は、Core の Compliance モジュールではなく、Enterprise の PdfAManager (nextpdf/pro) に存在します。Core の PDF/A サーフェスは ConformanceMode ディスクリミネーターのみです。
  • 免除は監査証跡を保持します。 免除されたルールは検出結果リストから抑制されますが、免除エントリは 理由 の記録として残ります。

PdfRValidator::validate() は、バイトストリームを境界付きの正規表現で走査する単一の線形パスです。コストはドキュメントサイズに比例して増加しますが、モジュールの予算内に十分収まります。文法のみモードの ArlingtonValidator では、読み込み証明の検出結果は O(grammar-rule-count) です。リファレンスチェッカーの実行パスはサブプロセスであり、NextPDF ではなく上流のツールによって境界付けられます。これは帯域外の CI ステップです。

これらのバリデーターは、信頼できない PDF バイトを読み取ります。PdfRValidator はキー抽出の前に括弧で囲まれたリテラルと 16 進リテラルを除去するため、細工された Creator 文字列が偽の /Name キーを注入することはできません (ISO 32000-1:2008 §7.3.4.2 エスケープ処理)。Arlington アダプターは、上流のチェッカーを境界付きのサブプロセスとして実行します。タイムアウトや実行エラーが発生した場合は、部分的な出力を信頼するのではなく、「検出結果なし」として扱います。PDF 解析の攻撃対象領域については、プロジェクトの脅威モデルを参照してください。

規格箇条Compliance モジュールの動作内容ステータス
ISO 23504-1:2020 (PDF/R-1)§6.5.7PdfRValidator{q,Q,cm,Do} コンテンツストリーム演算子許可リストを強制Verified (ユニット + 標準プロファイル + 統合テストが合格)
ISO 23504-1:2020 (PDF/R-1)§6.4.3PdfRValidator が Info ディクショナリキー許可リストを強制Verified (テストで裏付け済み)
ISO 23504-1:2020 (PDF/R-1)§6.7、§6.8v5.1.0 クラスターでは未実装明示的な対象外 (claims.json で宣言)
ISO 32000-2:2020 (PDF 2.0)§7.5.2Catalog キー許可リストの走査Claimed (正規表現による走査、構造的)
ISO 19005-4:2020 (PDF/A-4)§6.7.3Conformance モジュールを介した識別スキーマの認識相互参照 (/specifications/pdfa4/ を参照)

サポートは適合性ではありません。 検出結果を返さない PdfRValidator の実行が証明するのは、入力が バリデーターが実装している §6 の箇条から逸脱しなかったことです。そのファイルが適合する PDF/R-1 ファイルであることまではアサートしません。§6.7 と §6.8 はチェックされません。Arlington のクロスチェックは助言的であり、適合性をアサートすることはありません。PDF/A-4 については、権威あるバリデーターは veraPDF であり、帯域外で実行されます。veraPDF オラクルとそのオプトインゲートについては、適合性モジュールを参照してください。

引用は、NextPDF コンプライアンスコーパスの内容を言い換えたものです。完全な 64 文字の reference_id ダイジェストは、ページのフロントマターと _normative-evidence-conf.md に記録されています。