コンテンツにスキップ

PDF/A-4 アーカイブ出力を生成する

このレシピでは、Pro の PdfAManager を使って PDF/A-4(ISO 19005-4)のアーカイブ出力を生成します。保存時に、NextPDF は OutputIntent、埋め込み ICC プロファイル、識別メタデータを出力対象として登録します。NextPDF は適合を目的とした出力を生成しますが、適合性は独立したバリデーターが判定します。このレシピは examples/32-pdfa4-icc.php に沿っています。

Terminal window
composer require nextpdf/core:^3
composer require nextpdf/pro

PDF/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 44e4f)と整合した状態に保たれます。ベースプロファイルは、パート要件どおり、pdfa:conformance レターを出力しません。

API サーフェスは PHPDoc から生成されます。主なエントリーポイントは次のとおりです。

  • \NextPDF\Core\Document::createStandalone(): Document
  • Document::enablePdfA(?object $version = null): static
  • \NextPDF\Support\CapabilityRegistry::getInstance()->get('security.pdfa')->isAvailable(): bool
  • \NextPDF\Conformance\ConformanceMode::PdfA4 / PdfA4e / PdfA4f
  • ConformanceMode::pdfaPart(): 2|3|4|null および ConformanceMode::pdfaConformanceLetter(): string
examples/32-pdfa4-icc.php
<?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 conforming

Core のみのホストでは、プログラムは 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 の PdfAVersionenablePdfA() に渡すと、4e(エンジニアリング、3D)または 4f(ファイル添付)に対応できます。ベースプロファイルは pdfa:conformance レターを出力しません。4e/4fE/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 とメタデータで比較されます。

アーカイブ出力は、設計上、長期間保持され、自己完結しています。コンテンツ内の個人データは、アーカイブの存続期間にわたって保持されます。埋め込み ICC プロファイルとメタデータは、ファイルとともに移動します。アーカイブする前に、保持ポリシーと最小化ポリシーを適用してください。PDF/A-4 には墨消しのセマンティクスはありません。

このレシピが書き込むのは、固定の進捗行だけです。veraPDF の出力にはコンテンツの断片が含まれる場合があります。機密性の高いコンテンツを含むドキュメントでは、バリデーターのログを共有ログシンクに含めないようにしてください。

PDF/A-4 はアーカイブ忠実性のプロファイルであり、完全性や真正性の管理手段ではありません。ファイルへの署名や、改ざん検知を提供するものではありません。来歴が重要な場合は、署名と組み合わせてください。署名については、別のレシピで扱います。暗号化は仕様上、PDF/A と相互に排他的です。

このレシピは暗号操作を一切実行しません。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)が行います。その判定をビルドゲートとして使用してください。