콘텐츠로 이동

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 등급 기능입니다. 코어 전용 설치에서는 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 메타데이터를 선택된 변형(기본 4, 4e, 4f)에 맞춰 정렬된 상태로 유지합니다. 기본 프로파일은 해당 파트의 요구사항에 따라 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|nullConformanceMode::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";

다음은 nextpdf/pro가 설치되어 있고, verapdf가 파일이 준수한다고 보고하는 호스트에서 예상되는 STDOUT입니다:

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

코어 전용 호스트에서는 프로그램이 STDERR에 PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro를 출력한 뒤 0이 아닌 코드로 종료합니다. verapdf가 문제를 보고하면 프로그램은 veraPDF FAILED — output is not PDF/A-4 conforming을 출력한 뒤 0이 아닌 코드로 종료합니다. 이 문구는 판정을 veraPDF에 귀속시킵니다 — NextPDF는 PDF/A-4 준수를 주장하지 않습니다.

  • Pro 게이트. 코어 전용 설치에서는 enablePdfA()InvalidConfigException을 던집니다. 메시지는 security.pdfacomposer 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 기본은 태깅을 선택 사항으로 취급합니다. 접근 가능하면서 동시에 보존용인 산출물을 만들려면 태그 모드와 PDF/A를 별도로 활성화합니다. PDF/UA-2 레시피를 참조합니다.
  • 게이트는 검증기입니다. save()가 성공했다는 것은 아티팩트가 내보내졌다는 의미일 뿐, 파일이 준수한다는 의미는 아닙니다. 검증기가 통과 판정을 내리기 전에는 PDF/A-4 준수를 단언하지 않습니다.

OutputIntent는 하나의 ICC 프로파일 스트림(sRGB의 경우 수백 KB)과 XMP 패킷을 추가합니다. 문서가 base-14가 아닌 글꼴을 사용할 때는 글꼴 내장이 크기를 좌우합니다. 일반적인 보존용 문서의 경우 이 레시피는 2000 ms / 128 MB 예산 내에 머무릅니다. 의미론적 재현성 프로파일이 적용됩니다. 검증기 지향 산출물은 원시 바이트가 아니라 구조적 AST와 메타데이터로 비교됩니다.

보존용 출력은 설계상 수명이 길고 자체 완결적입니다. 콘텐츠에 포함된 모든 개인 데이터는 아카이브 수명 동안 유지됩니다. 내장 ICC 프로파일과 메타데이터는 파일과 함께 이동합니다. 아카이브하기 전에 보존 및 최소화 정책을 적용해야 합니다. PDF/A-4에는 편집(redaction) 의미론이 없습니다.

안전한 텔레메트리 및 로그 정리

섹션 제목: “안전한 텔레메트리 및 로그 정리”

이 레시피는 고정된 진행 상황 줄만 기록합니다. veraPDF 출력에는 콘텐츠 조각이 포함될 수 있으므로, 민감한 콘텐츠가 있는 문서의 경우 검증기 로그를 공유 로그 싱크에서 제외해야 합니다.

PDF/A-4는 보존 충실도 프로파일이며 무결성 또는 진위성 제어가 아닙니다. 이 프로파일은 파일에 서명하거나 변조 증거를 제공하지 않습니다. 출처가 중요할 때는 서명과 결합해야 합니다. 별도의 레시피가 서명을 다룹니다. 암호화는 명세상 PDF/A와 상호 배타적입니다.

이 레시피는 암호화 연산을 수행하지 않습니다. FIPS 모드는 이 동작을 변경하지 않습니다. PDF/A-4는 암호화를 금지하므로 어떤 암호도 선택되지 않습니다.

진술명세reference_id (참조 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)가 그 판정을 내립니다. 그 판정을 빌드 게이트로 삼습니다.