PDF는 PDF/A-3을 만족하거나 만족하지 않습니다. 그렇다면 같은 파일을 왜 두 개의 검증기로 검사해야 할까요?
실무적인 이유는 분명합니다. PDF/A 사양은 매우 크기 때문에 올바르게 구현된 두 엔진도 경계 조건에서 다른 판단을 내릴 수 있습니다. 감사에 제출할 워크플로라면 단일 엔진의 “Pass”는 초록불이 아니라 노란불입니다.
PDF/A는 하나의 단순 알고리즘이 아닙니다
PDF/A는 ISO 19005의 여러 파트에 걸쳐 있습니다. PDF/A-1, PDF/A-2, PDF/A-3, PDF/A-4가 있고 b, a, u, e, f 같은 준수 수준도 있습니다. 그 아래에는 PDF 본문 사양인 ISO 32000도 있습니다. 해석해야 할 규범 문서는 수천 페이지 규모입니다.
차이가 자주 나는 영역은 다음과 같습니다.
- PDF/A-2/3의 transparency: 특정 조건에서 허용되지만 조건의 경계를 다르게 해석할 수 있습니다.
- ICC color profile: 필수인지 권장인지에 대한 엄격도가 다를 수 있습니다.
- PDF/A-3 embedded file metadata:
AFRelationship,/AFreference, XMP가 정확히 맞아야 합니다. - Font subsetting: CID font와 부분 subset은 전형적인 edge case입니다.
이것이 항상 버그라는 뜻은 아닙니다. 복잡한 표준을 독립적으로 구현하면 자연스럽게 생기는 차이입니다. 규제가 강한 산업에서 독립 확인을 요구하는 이유도 여기에 있습니다.
Reference engine과 second opinion
veraPDF는 PDF Association이 관리하는 reference implementation입니다. veraPDF가 “Pass”라고 하면 PDF/A에서 얻을 수 있는 가장 강한 단일 엔진 신호입니다.
하지만 가장 강한 단일 신호도 감사 증거 자체는 아닙니다. 은행, 의료 기록 보관소, 공공 기록 시스템, 장기 아카이브는 종종 두 번째 엔진을 요구합니다.
- 수신자가 내부적으로 다른 validator를 사용할 수 있습니다.
- 한 엔진의 버그는 같은 엔진을 두 번 실행해도 발견되지 않습니다.
- compliance에서는 두 개의 독립 확인이 익숙한 원칙입니다.
gPdf는 veraPDF와 함께 Rust + WebAssembly로 작성한 자체 엔진을 실행합니다. 같은 사양의 독립 구현입니다. 둘 다 pass하면 결론이 훨씬 강해지고, 결과가 다르면 조사할 지점이 명확해집니다.
한 URL에서 두 개의 report
gpdf.com/validator/에서 무료로 사용할 수 있습니다. 로그인 없이 파일을 업로드하면 veraPDF와 gPdf edge engine이 병렬로 실행되고 두 report가 나란히 표시됩니다.
대표적인 사용 방식:
- PDF/A를 보내기 전: 업로드하고 두 “Pass”를 확인한 뒤 JSON report를 QA evidence로 보관합니다.
- 한 엔진만 실패: report를 비교합니다. XMP,
/AFreference, attachment metadata 문제가 흔합니다. - 둘 다 실패: 생성 소스를 수정해야 합니다.
- archive batch audit: 샘플 PDF를 검증하고 결과를 audit workpaper에 첨부합니다.
업로드한 파일은 저장되지 않습니다. Cloudflare Workers에서 메모리로 처리되고 report 생성 후 폐기됩니다.
전자 송장에도 같은 원칙이 적용됩니다
Factur-X / ZUGFeRD는 PDF/A-3 shell뿐 아니라 내장된 EN 16931 CII XML도 검증해야 합니다. gPdf validator는 XML 쪽에 Mustang을 사용하고 PDF/A report와 함께 결과를 보여줍니다.
핵심은 특정 도구를 의심하는 것이 아니라 독립 구현으로 증거를 강하게 만드는 것입니다.
TL;DR
단일 엔진 “Pass”는 노란불입니다. 두 독립 엔진의 “Pass”는 훨씬 강한 증거입니다. validator에 파일을 올리고 두 report를 QA나 감사 자료에 첨부하세요. gPdf API가 만든 PDF라면 validator는 compliance claim의 공개 영수증입니다.