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.
레시피
섹션 제목: “레시피”- Core만 설치된 환경에서는 스택 트레이스 대신 명확한 메시지가 표시되도록 기능 레지스트리에서
security.pdfa를 확인합니다. - 문서를 생성하고 콘텐츠를 추가하기 전에
enablePdfA()를 호출합니다. - 메타데이터를 설정하고 콘텐츠를 작성합니다.
setEncryption()을 호출하지 마십시오. PDF/A는Encrypt키를 금지합니다. - 저장합니다.
save()실행 중에PdfAManager가 OutputIntent, 내장 ICC 프로필, XMP 확장 스키마를 예약합니다. - 출력 파일에 대해
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 veraPDFPremium 패키지가 없으면 스크립트는 실행 가능한 메시지와 함께 0이 아닌 코드로 종료하며 파일을 쓰지 않습니다.
예외 상황
섹션 제목: “예외 상황”- 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 (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 |
검증기가 적합성을 단언합니다. 라이브러리는 적합성을 목표로 한 출력을 생성하며, 오라클이 결정합니다.