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上にあること。
- ケイパビリティレジストリで
security.pdfaを確認し、Core のみのインストールではスタックトレースではなく、明確なメッセージを返すようにします。 - ドキュメントを作成し、コンテンツを追加する前に
enablePdfA()を呼び出します。 - メタデータを設定し、コンテンツを書き込みます。
setEncryption()は呼び出さないでください。PDF/A はEncryptキーを禁止しています。 - 保存します。
save()の実行中に、PdfAManagerが OutputIntent、埋め込み ICC プロファイル、および XMP 拡張スキーマをスケジュールします。 - 出力に対して
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 veraPDFPremium パッケージが存在しない場合、スクリプトは対処方法が分かるメッセージを出してゼロ以外で終了し、ファイルを書き込みません。
エッジケース
「エッジケース」という見出しのセクション- Premium ゲート。 Core のみのインストールでは、
enablePdfA()はInvalidConfigExceptionをスローし、その例外でsecurity.pdfaと対処方法であるcomposer require nextpdf/proが示されます。先にレジストリを確認してください。 - 暗号化の競合。 PDF/A ドキュメントで
setEncryption()、useAesGcm()、またはsetPublicKeyEncryption()を呼び出すと、呼び出し順にかかわらず非互換性の例外が発生します。PDF/A はトレーラーのEncryptキーを禁止しています。 - 適合性のバリアント。
PdfAVersionをenablePdfA()に渡すと、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 |
適合性はバリデーターが判定します。ライブラリは適合を意図した出力を生成し、判定はオラクルが行います。