콘텐츠로 이동

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을 던집니다.
  • 게이트 단계에서 사용할 수 있도록 PATH에 등록된 veraPDF.
  1. Core만 설치된 환경에서는 스택 트레이스 대신 명확한 메시지가 표시되도록 기능 레지스트리에서 security.pdfa를 확인합니다.
  2. 문서를 생성하고 콘텐츠를 추가하기 전에 enablePdfA()를 호출합니다.
  3. 메타데이터를 설정하고 콘텐츠를 작성합니다. setEncryption()을 호출하지 마십시오. PDF/A는 Encrypt 키를 금지합니다.
  4. 저장합니다. save() 실행 중에 PdfAManager가 OutputIntent, 내장 ICC 프로필, XMP 확장 스키마를 예약합니다.
  5. 출력 파일에 대해 verapdf --flavour 4를 실행합니다. 종료 코드가 0이 아니면 빌드를 실패 처리합니다. 검증기의 판정이 게이트입니다.
<?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 패키지가 없으면 스크립트는 실행 가능한 메시지와 함께 0이 아닌 코드로 종료하며 파일을 쓰지 않습니다.

  • Premium 게이트. Core만 설치된 환경에서 enablePdfA()InvalidConfigException을 던지며, 이는 security.pdfacomposer 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 (reference_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

검증기가 적합성을 단언합니다. 라이브러리는 적합성을 목표로 한 출력을 생성하며, 오라클이 결정합니다.