コンテンツにスキップ

PDF/A-4 出力を生成し、veraPDF オラクルでゲートする

このレシピでは、Premium の PdfAManager を使って PDF/A-4 出力を生成し、veraPDF を実行して、その判定をビルドゲートとして扱います。ライブラリはアーティファクトを生成し、適合性はバリデーターが判断します。このレシピは examples/32-pdfa4-icc.php に沿っています。

  • Core がインストール済みであること: composer require nextpdf/core:^3
  • Premium がインストール済みであること: composer require nextpdf/pro。PDF/A-4 は Premium ティアの機能です(ADR-011)。Premium がない場合、enablePdfA() はアップグレード手順を示して InvalidConfigException をスローします。
  • ゲートステップで使うため、veraPDF が PATH 上にあること。
  1. ケイパビリティレジストリで security.pdfa を確認し、Core のみのインストールではスタックトレースではなく、明確なメッセージを返すようにします。
  2. ドキュメントを作成し、コンテンツを追加する前に enablePdfA() を呼び出します。
  3. メタデータを設定し、コンテンツを書き込みます。setEncryption() は呼び出さないでください。PDF/A は Encrypt キーを禁止しています。
  4. 保存します。save() の実行中に、PdfAManager が OutputIntent、埋め込み ICC プロファイル、および XMP 拡張スキーマをスケジュールします。
  5. 出力に対して verapdf --flavour 4 を実行します。終了コードがゼロ以外の場合は、ビルドを失敗させます。バリデーターの判定がゲートです。
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
use NextPDF\Exception\InvalidConfigException;
use NextPDF\Support\CapabilityRegistry;
$out = __DIR__ . '/archival.pdf';
// Step 1 — probe before activating a Premium-gated feature.
$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);
}
try {
$doc = Document::createStandalone();
// Step 2 — enable PDF/A-4 before content. Defaults to PdfA4.
$doc->enablePdfA();
// Step 3 — metadata and content. No setEncryption() on a PDF/A document.
$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);
// Step 4 — save. PdfAManager emits OutputIntent + ICC + XMP here.
$doc->save($out);
} catch (InvalidConfigException $e) {
fwrite(STDERR, "PDF/A-4 activation failed: {$e->getMessage()}\n");
exit(1);
}
// Step 5 — the gate. veraPDF, not the library, asserts conformance.
$exitCode = 0;
$output = [];
exec('verapdf --flavour 4 ' . escapeshellarg($out), $output, $exitCode);
if ($exitCode !== 0) {
fwrite(STDERR, "veraPDF FAILED — output is not PDF/A-4 conforming\n");
fwrite(STDERR, implode("\n", $output) . "\n");
exit(1);
}
echo "veraPDF PASS — archival.pdf is reported PDF/A-4 conforming by veraPDF\n";

veraPDF が合格と判定した場合:

veraPDF PASS — archival.pdf is reported PDF/A-4 conforming by veraPDF

Premium パッケージが存在しない場合、スクリプトは対処方法が分かるメッセージを出してゼロ以外で終了し、ファイルを書き込みません。

  • Premium ゲート。 Core のみのインストールでは、enablePdfA()InvalidConfigException をスローし、その例外で security.pdfa と対処方法である composer require nextpdf/pro が示されます。先にレジストリを確認してください。
  • 暗号化の競合。 PDF/A ドキュメントで setEncryption()useAesGcm()、または setPublicKeyEncryption() を呼び出すと、呼び出し順にかかわらず非互換性の例外が発生します。PDF/A はトレーラーの Encrypt キーを禁止しています。
  • 適合性のバリアント。 PdfAVersionenablePdfA() に渡すと、4e または 4f を指定できます。デフォルトは 4 です。
  • ゲートはエンジンではなくバリデーターです。 save() が成功したことは、NextPDF が PDF/A-4 に必要なアーティファクトを出力したことを意味します。それだけでは適合性を証明しません。veraPDF が適合性を判定し、このレシピではその判定をゲートとします。バリデーターが合格と判定するまで、ファイルが PDF/A-4 に適合しているとは述べないでください。
記述仕様条項リファレンス ID
PDF/A-4 ファイルでは、埋め込み ICC プロファイルを参照する PDF/A OutputIntent によって色特性を指定 できます(デバイス非依存の色を直接指定する方法もあります。§6.2.4.1)。ISO 19005-4§6.2.3
PDF/A-4 では暗号化が禁止されています。ISO 19005-4§6.6.4
PDF/A-4 は XMP メタデータに pdfaid 識別情報を保持します。ISO 19005-4§6.7.5

適合性はバリデーターが判定します。ライブラリは適合を意図した出力を生成し、判定はオラクルが行います。