PDF/A-4 アーカイブ出力を生成する
このレシピでは、Pro の PdfAManager を使って PDF/A-4(ISO 19005-4)のアーカイブ出力を生成します。保存時に、NextPDF は OutputIntent、埋め込み ICC プロファイル、識別メタデータを出力対象として登録します。NextPDF は適合を目的とした出力を生成しますが、適合性は独立したバリデーターが判定します。このレシピは examples/32-pdfa4-icc.php に沿っています。
インストール
「インストール」という見出しのセクションcomposer require nextpdf/core:^3composer require nextpdf/proPDF/A-4 は Pro ティアの機能です。Core のみのインストールでは、enablePdfA() は InvalidConfigException を発生させます。このメッセージには、不足している security.pdfa 機能と、対処方法である composer require nextpdf/pro が示されます。検証ステップには、PATH 上の PDF/A バリデーターが必要です。ここでは、--flavour 4 を指定した veraPDF を使用します。
概念の概要
「概念の概要」という見出しのセクションPDF/A-4 は、ISO 32000-2(PDF 2.0)を基盤とする ISO 19005-4 のアーカイブプロファイルです。適合ファイルでは、色が決定論的に扱われ、ファイル自体が自己完結します。埋め込み ICC 出力先プロファイルを参照する OutputIntent を宣言するため、外部リソースなしで色を再現できます(§6.2.3)。すべてのフォントプログラムが埋め込まれます(§6.2.10.4.1)。ドキュメントは、XMP 内に pdfaid 識別メタデータを保持します(§6.7.3)。ファイルは暗号化されません(§6.6.4 — PDF/A は Encrypt トレーラーキーを禁止しています)。
NextPDF は、型付きの ConformanceMode 列挙型で PDF/A をモデル化します。enablePdfA() は Pro の PdfAManager をインスタンス化し、デフォルトは ConformanceMode::PdfA4 です。マネージャーは、save() の実行中に OutputIntent、ICC ストリーム、XMP 拡張スキーマを出力対象として登録します。pdfaPart() と pdfaConformanceLetter() の判別子により、pdfaid:part / pdfaid:conformance メタデータは、選択したバリアント(base 4、4e、4f)と整合した状態に保たれます。ベースプロファイルは、パート要件どおり、pdfa:conformance レターを出力しません。
API サーフェス
「API サーフェス」という見出しのセクションAPI サーフェスは PHPDoc から生成されます。主なエントリーポイントは次のとおりです。
\NextPDF\Core\Document::createStandalone(): DocumentDocument::enablePdfA(?object $version = null): static\NextPDF\Support\CapabilityRegistry::getInstance()->get('security.pdfa')->isAvailable(): bool\NextPDF\Conformance\ConformanceMode::PdfA4/PdfA4e/PdfA4fConformanceMode::pdfaPart(): 2|3|4|nullおよびConformanceMode::pdfaConformanceLetter(): string
コードサンプル — クイックスタート
「コードサンプル — クイックスタート」という見出しのセクション<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Support\CapabilityRegistry;
$out = __DIR__ . '/output/32-pdfa4-icc.pdf';
// Probe before activating a Pro-gated feature so a Core-only install// gets an actionable message instead of a stack trace.$registry = CapabilityRegistry::getInstance();if (!$registry->get('security.pdfa')->isAvailable()) { fwrite(STDERR, "PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro\n"); exit(1);}
$doc = Document::createStandalone();$doc->enablePdfA(); // defaults to ConformanceMode::PdfA4$doc->setTitle('Archival Record 2026-0042');$doc->setLanguage('en');$doc->addPage();$doc->setFont('helvetica', '', 12);$doc->cell(0, 10, 'This document targets PDF/A-4.', newLine: true);$doc->save($out); // PdfAManager emits OutputIntent + ICC + XMP here
echo "Created: output/32-pdfa4-icc.pdf\n";コードサンプル — 本番
「コードサンプル — 本番」という見出しのセクションこれは自己完結型で、ハーネスから実行できるプログラムです。本番の呼び出し側は、バリデーターの判定をビルドゲートとして使用します。save() が成功すれば、NextPDF がアーティファクトを出力したことは証明されますが、適合性を証明できるのはバリデーターだけです。
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Exception\InvalidConfigException;use NextPDF\Support\CapabilityRegistry;
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: (__DIR__ . '/archival.pdf');
if (!CapabilityRegistry::getInstance()->get('security.pdfa')->isAvailable()) { fwrite(STDERR, "PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro\n"); exit(1);}
try { $doc = Document::createStandalone(); $doc->enablePdfA(); // ConformanceMode::PdfA4
$doc->setTitle('Archival Record 2026-0042'); $doc->setLanguage('en'); $doc->addPage(); $doc->setFont('helvetica', '', 12); $doc->cell(0, 10, 'Long-term archival record. PDF/A-4 (ISO 19005-4).', newLine: true);
// Do NOT call setEncryption(): PDF/A prohibits the Encrypt key and // the call raises an incompatibility exception in either order. $doc->save($out);} catch (InvalidConfigException $e) { fwrite(STDERR, "PDF/A-4 activation failed: {$e->getMessage()}\n"); exit(1);}
$exitCode = 0;$report = [];exec('verapdf --flavour 4 ' . escapeshellarg($out), $report, $exitCode);
if ($exitCode !== 0) { fwrite(STDERR, "veraPDF FAILED — output is not PDF/A-4 conforming\n"); fwrite(STDERR, implode("\n", $report) . "\n"); exit(1);}
echo "veraPDF PASS — archival.pdf is reported PDF/A-4 conforming\n";想定される STDOUT は、nextpdf/pro がインストールされ、ファイルを適合と判定する verapdf が存在するホストでは次のようになります。
veraPDF PASS — archival.pdf is reported PDF/A-4 conformingCore のみのホストでは、プログラムは STDERR に PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro を出力した後、非ゼロで終了します。verapdf が問題を報告した場合、プログラムは veraPDF FAILED — output is not PDF/A-4 conforming を出力した後、非ゼロで終了します。この文言は判定を veraPDF に帰属させています — NextPDF は PDF/A-4 への適合を主張しません。
エッジケースと注意点
「エッジケースと注意点」という見出しのセクション- Pro ゲート。 Core のみのインストールでは、
enablePdfA()はInvalidConfigExceptionをスローします。このメッセージには、security.pdfaと、対処方法であるcomposer require nextpdf/proが示されます。運用担当者にわかりやすいメッセージを返すため、先にレジストリを確認してください。 - 暗号化の競合。 PDF/A ドキュメントに対して
setEncryption()、useAesGcm()、またはsetPublicKeyEncryption()を呼び出すと、呼び出し順序に関係なく非互換例外が発生します。PDF/A-4 はEncryptトレーラーキーを禁止しています(ISO 19005-4 §6.6.4)。 - 適合バリアント。 Pro の
PdfAVersionをenablePdfA()に渡すと、4e(エンジニアリング、3D)または4f(ファイル添付)に対応できます。ベースプロファイルはpdfa:conformanceレターを出力しません。4e/4fはE/Fを設定します。ConformanceMode判別子はpdfaid:partの整合性を維持します。 - タグ付けは独立しています。 PDF/A-4 base ではタグ付けは任意です。アクセシブルかつアーカイブ可能な成果物を得るには、タグ付きモードと PDF/A を別々に有効にしてください。PDF/UA-2 のレシピを参照してください。
- ゲートはバリデーターです。
save()の成功は、アーティファクトが出力されたことを意味するだけで、ファイルが適合していることを意味しません。バリデーターが合格を返すまで、PDF/A-4 への適合を表明しないでください。
パフォーマンス
「パフォーマンス」という見出しのセクションOutputIntent は、1 つの ICC プロファイルストリーム(sRGB で数百 KB)と XMP パケットを追加します。ドキュメントが base-14 以外のフォントを使用する場合、サイズの大半はフォントの埋め込みが占めます。一般的なアーカイブドキュメントでは、このレシピは 2000 ms / 128 MB のバジェット内に収まります。セマンティック再現性プロファイルが適用されます。バリデーター志向の成果物は、生のバイトではなく、構造 AST とメタデータで比較されます。
セキュリティに関する注意事項
「セキュリティに関する注意事項」という見出しのセクションデータレジデンシーと PII の緩和策
「データレジデンシーと PII の緩和策」という見出しのセクションアーカイブ出力は、設計上、長期間保持され、自己完結しています。コンテンツ内の個人データは、アーカイブの存続期間にわたって保持されます。埋め込み ICC プロファイルとメタデータは、ファイルとともに移動します。アーカイブする前に、保持ポリシーと最小化ポリシーを適用してください。PDF/A-4 には墨消しのセマンティクスはありません。
安全なテレメトリーとログのスクラビング
「安全なテレメトリーとログのスクラビング」という見出しのセクションこのレシピが書き込むのは、固定の進捗行だけです。veraPDF の出力にはコンテンツの断片が含まれる場合があります。機密性の高いコンテンツを含むドキュメントでは、バリデーターのログを共有ログシンクに含めないようにしてください。
脅威モデル
「脅威モデル」という見出しのセクションPDF/A-4 はアーカイブ忠実性のプロファイルであり、完全性や真正性の管理手段ではありません。ファイルへの署名や、改ざん検知を提供するものではありません。来歴が重要な場合は、署名と組み合わせてください。署名については、別のレシピで扱います。暗号化は仕様上、PDF/A と相互に排他的です。
FIPS モードの動作
「FIPS モードの動作」という見出しのセクションこのレシピは暗号操作を一切実行しません。FIPS モードでも動作は変わりません。PDF/A-4 は暗号化を禁止しているため、暗号は選択されません。
| 記述 | 仕様 | 箇条 | リファレンス ID |
|---|---|---|---|
| PDF/A-4 では、埋め込み ICC プロファイルを参照する OutputIntent が必要です。 | ISO 19005-4 | §6.2.3 | |
| 色は出力先プロファイルを通じてデバイス非依存になります。 | ISO 19005-4 | §6.2.4.3 | |
| すべてのフォントプログラムが埋め込まれます。 | ISO 19005-4 | §6.2.10.4.1 | |
| ドキュメントは XMP 内に pdfaid 識別情報を保持します。 | ISO 19005-4 | §6.7.3 | |
| PDF/A-4 では暗号化が禁止されています。 | ISO 19005-4 | §6.6.4 | |
| 適合性を判定するのは、生成側ではなくバリデーターです。 | ISO 19005-4 | §6.7.3 |
NextPDF は、PDF/A-4 への適合を目的とした出力を生成します。**サポートは適合性ではなく、テスト済みのプロファイルは認証ではありません。**このレシピは適合性を主張しません。判定は独立したバリデーター(例: veraPDF)が行います。その判定をビルドゲートとして使用してください。