콘텐츠로 이동
getnextpdf.com

아카이브와 PDF/A

Spec: ISO 19005-4:2020, PDF/A-4Spec: ISO 19005-2, PDF/A-2

PDF/A는 문서가 수십 년 뒤, 아직 존재하지도 않는 소프트웨어에서도 읽히고 충실하게 재현되어야 할 때 선택하는 형식입니다. 이 페이지는 그 보장이 실제로 어디까지 미치는지, NextPDF가 어떻게 적합한 파일을 생성하는지, 그리고 팀이 흔히 예상하지 못하는 부분을 설명합니다. PDF/A를 생성하는 것과 파일이 PDF/A임을 증명하는 것은 서로 다른 작업입니다. 두 번째 작업은 여전히 사용자의 몫입니다.

아카이브 의무는 조용하지만 가차 없습니다. 파일이 오늘은 멀쩡해 보이므로 그대로 보관됩니다. 임베드되지 않은 글꼴, 장치 종속 색상, 암호화된 트레일러 같은 문제는 몇 년 뒤에야, 원래 환경이 사라지고 문서가 어떻게 보여야 했는지 아무도 복원할 수 없을 때 드러납니다. 그때 치르는 대가는 단순한 재렌더링 비용이 아닙니다. 기록 자체가 더 이상 신뢰할 수 없게 됩니다.

PDF/A는 바로 그런 유형의 실패를 제거하기 위해 존재합니다. 하지만 “우리는 PDF/A 라이브러리를 사용했다”는 것은 “이 파일이 적합하다”는 것과 같지 않습니다. 둘을 혼동하면 아카이브에는 보존된 것처럼 보일 뿐인 문서가 쌓입니다.

  • PDF/A의 목적은 시간이 지나도 충실하고 자기 완결적이며 장치 독립적인 재현입니다 — 문서를 만든 도구와 무관하게 문서의 정적인 시각적 외관을 보존합니다(ISO 19005-2 Introduction).
  • 이를 위해서는 구체적인 제약이 필요합니다: 모든 글꼴 임베드, 장치 독립적 색상(직접 지정하거나 출력 인텐트를 통해; ISO 19005-4 §6.2.4.1), 그리고 트레일러에 암호화 없음.
  • NextPDF는 명시적 옵트인 모드를 통해 PDF/A를 생성하며, 적합하지 않은 파일을 조용히 내놓는 대신 호환되지 않는 작업을 거부합니다.
  • 적합성은 생성기가 단언하는 것이 아니라 검사 도구가 결정합니다. 표준이 의도한 보존 성공조차 주변 아카이브 환경과 절차에 달려 있습니다(ISO 19005-4 Introduction). 출력물 검증은 여전히 사용자가 수행해야 하는 단계입니다.

NextPDF는 PDF/A를 후처리 필터가 아니라 문서가 들어가는 모드로 취급합니다. 이 모드는 옵트인입니다. 한번 켜지면, 적합성을 깨뜨릴 수 있는 작업으로부터 문서를 능동적으로 보호합니다. 설계 원칙은 빠른 실패(fail-fast)입니다. 아카이브용처럼 보이지만 실제로는 아닌 파일을 돌려주는 것보다, 암호화된 PDF/A 요청을 명확히 거부하는 편이 낫습니다.

이 시나리오에는 네 단계가 있으며, 세 번째 단계는 팀이 흔히 건너뛰는 단계입니다.

  1. Compose for permanenceEmbed every font, use device-independent colour or an output intent, and avoid features the chosen PDF/A part forbids.
  2. Enable the PDF/A modeOpt in explicitly to the target conformance level. The mode now guards the document against incompatible operations.
  3. Validate independentlyRun a conformance checker. A passing report — not the producing library — is the evidence the archive needs.
  4. Preserve with procedureStore under records-management policy. The standard itself notes archival success depends on the environment, not the file alone.
아카이브 시나리오의 처음부터 끝까지: 엔진은 적합한 후보를 생성하고 적합성을 깨뜨리는 작업을 거부하며, 독립적인 검증기가 아카이브에 실제로 중요한 판정을 내립니다.

옵트인은 단순한 플래그가 아니라 실제 가드입니다. PDF/A 모드가 활성화된 상태에서 호환되지 않는 작업 — AES-GCM이나 표준 암호화 핸들러를 켜는 것 — 이 시도되면, 엔진은 타입이 지정된 비호환 오류를 발생시킵니다. 이 가드는 어느 순서에서도 작동합니다: PDF/A를 켠 뒤 암호화를 요청하든, 암호화를 요청한 뒤 PDF/A를 켜든 마찬가지입니다. 어느 쪽이든 결과는 명확한 거부입니다. ISO 19005는 적합한 파일의 트레일러에 Encrypt 키를 두는 것을 금지하며, 엔진은 이를 권고가 아니라 구속력 있는 요구 사항으로 취급합니다.

이 모드는 내부 상태도 정확하게 유지합니다. 특정 파트(예: PDF/A-3 바이트 충실 레벨 대 PDF/A-4)에 대해 PDF/A를 활성화하면 문서의 적합성 판별자가 그에 맞게 설정됩니다. 그러면 파트에 의존하는 라이터 측 게이트가 오래된 기본값이 아니라 올바른 값을 보게 됩니다. 바로 이런 내부 일관성이 검증기의 파일 통과 여부를 좌우합니다.

아래 코드는 그 접점에서 가드가 어떻게 작동하는지를 보여 줍니다. 이 PDF/A 모드 자체는 Premium 등급 기능입니다. 적합성 검사는 별도의 독립적인 단계입니다.

<?php
declare(strict_types=1);
use NextPDF\Contracts\PdfDocumentInterface;
use NextPDF\Security\Exception\IncompatiblePdfAModeException;
/**
* Produce an archival candidate, then prove it independently.
*
* The engine refuses conformance-breaking combinations; it does NOT
* certify the result. A validator does that.
*
* @param PdfDocumentInterface $doc A document with all fonts embedded
* @param object $pdfaLevel The target PDF/A version (Premium enum)
*
* @return string The archival candidate's bytes — not yet a verified PDF/A
*/
function buildArchivalCandidate(
PdfDocumentInterface $doc,
object $pdfaLevel,
): string {
try {
// Opt in explicitly. From here the mode guards the document.
$doc->enablePdfA($pdfaLevel);
} catch (IncompatiblePdfAModeException $e) {
// e.g. encryption was already requested — refused, not silently
// downgraded into a non-conforming "archival" file.
throw new \RuntimeException(
'PDF/A and encryption are mutually exclusive for a conforming '
. 'file; resolve before archiving.',
previous: $e,
);
}
$bytes = $doc->getPdfData();
// The step teams skip: this is a CANDIDATE. Run an independent
// conformance validator before treating it as a preserved record.
return $bytes;
}

반환문에 달린 주석이 핵심입니다. 함수 이름도 의도적으로 *후보(candidate)*라고 말합니다. 엔진은 적합하도록 의도된 결과물을 생성했습니다. 검사기만이 “적합해야 한다”는 의도를 증거로 바꿉니다.

한 가지 오해가 아카이브를 보존되지 않은 문서로 채웁니다: “라이브러리가 PDF/A라고 하니, 따라서 그 파일은 PDF/A다.” 그 판정은 라이브러리의 몫이 아닙니다. 생성기는 적합하도록 의도한 파일을 내놓고도 여전히 규범적 요구 사항을 놓칠 수 있습니다. 적합성은 검증 도구가 표준에 대해 결정합니다. 감사인이나 미래의 독자가 의존하는 것은 바로 그 결정입니다. 생성 라이브러리의 의도를 증거로 취급하는 것이 핵심적인 오류입니다.

두 번째이면서 더 미묘한 함정은 PDF/A만으로 문서가 보존된다고 가정하는 것입니다. 표준 자체가 아카이브의 성공을 주변 환경과 절차에 결부시킵니다. 관리 규율이 없는 저장소에 놓인 적합한 파일은 여전히 위험에 노출되어 있습니다. 형식은 필요조건이지 충분조건이 아닙니다.

  • NextPDF는 적합한 후보를 생성할 뿐, 적합성을 인증하지는 않습니다. 독립적인 검증기를 실행하십시오. 증거는 생성 라이브러리가 아니라 통과 보고서에서 나옵니다.
  • PDF/A 적합성 모드는 Premium 등급 기능입니다. Core는 일반 PDF 2.0을 내놓고 실행 가능한 업그레이드 경로를 안내합니다. PDF/A 보장을 제공하지 않습니다. 아래 경계를 참고하십시오.
  • PDF/A와 암호화는 적합한 파일에 대해 상호 배타적입니다. 엔진은 조용히 품질을 낮추는 대신 그 조합이 어떤 순서로 시도되더라도 거부합니다.
  • 엔진은 제공되지 않은 글꼴을 임베드하거나 사용자가 제공한 장치 종속 색상을 고칠 수 없습니다. 영속성을 위한 구성, 즉 임베드된 글꼴과 장치 독립적 색상은 입력 측의 책임입니다.
  • 아카이브의 내구성은 파일 단독이 아니라 프로세스에 달려 있습니다. ISO 19005는 조직의 보존 및 기록 관리 절차를 성공적인 보존의 일부로 삼습니다.
  • 이 페이지는 표준 기반이며 Premium 표면의 동작 수준을 다룹니다. 어떤 인증도 주장하지 않고, 어떤 인증도 부여하지 않습니다.
PDF/A archival conformance — edition availability
EditionAvailability
Core

Core는 일반 PDF 2.0만 생성합니다. enablePdfA()는 실행 가능한 상용 패키지를 가리키는 업그레이드 오류를 발생시킵니다. Core 전용 PDF/A 보장은 없습니다.

Pro

PDF/A 적합성 모드(바이트 충실 PDF/A-3 레벨 및 PDF/A-4 포함)를 암호화 비호환 가드와 함께 사용할 수 있습니다.

Enterprise

구조적 PDF/A 적합성 정책과 보고서를 추가합니다(여전히 인증이 아니라 구조 검사입니다 — 최종 판정은 검증기와 사용자의 컴플라이언스 팀에 있습니다).

  • 글꼴: 어려운 부분 — 겉보기에는 올바른 글꼴이 어떻게 여전히 파일을 비적합 상태로 만들거나 검색 불가능하게 만들 수 있는지.
  • 골든 파일 테스트 — 고정된 참조 출력이 아카이브 보장을 조용히 깨뜨리는 바이트 드리프트를 어떻게 포착하는지.
  • 인보이스와 전자 인보이싱 — 가장 가까운 관련 주제: 하이브리드 인보이스 캐리어는 그 자체가 PDF/A 파일입니다.
  • PDF/AISO 19005 계열: 장기 보존을 위한 제약된 PDF 프로파일로, 생성 도구와 무관하게 문서의 정적인 외관을 시간이 지나도 재현하도록 설계되었습니다.
  • 적합성 레벨 / 파트 — 특정 PDF/A 변종(예: PDF/A-2, PDF/A-3, PDF/A-4 및 그 하위 레벨); 각각 사용 가능한 PDF 기능을 제약합니다.
  • 출력 인텐트 — 장치 종속 색상을 장치 독립적으로 해석할 수 있게 해 주는 임베드된 색상 특성화 프로파일.
  • 장치 독립적 색상 — 렌더링 장치와 무관하게 일관되게 재현되도록 지정된 색상으로, PDF/A 요구 사항입니다.
  • 적합성 검사기 / 검증기 — 표준의 규범적 요구 사항에 대해 파일을 판정하는 독립적인 소프트웨어이며, 적합성 판정의 출처입니다.
  • 아카이브 후보 — 적합하도록 의도하여 생성한 파일로, 독립적인 검증기가 실제로 적합함을 확인하기 전 상태입니다.