블로그

엔지니어를 위한 PDF/A와 Factur-X 설명 (법률 용어 없이)

PDF/A 프로파일이 실제로 무엇을 제약하는지, 왜 Factur-X가 2026년에 EU에서 의무가 되는지, JSON 렌더러에서 컴플라이언스를 달성하기 위한 가장 작은 실용 파이프라인.

엔지니어이고 「인보이스가 다음 분기까지 PDF/A-3와 Factur-X여야 한다」는 말을 막 들었으며, 유일한 컨텍스트가 법무 부서의 누군가가 그 말을 한 것이라면, 이 글은 당신을 위한 것입니다.

표준화 문서 톤을 잘라내고 이 프로파일이 실제로 무엇을 제약하는지, 왜 정부가 의무화를 시작했는지, 구조화 데이터 렌더러에서 컴플라이언트 PDF를 발행하기 위한 가장 작은 실용 파이프라인을 설명합니다.

PDF/A를 두 단락으로

PDF는 유연한 형식입니다. 너무 유연 — 같은 PDF 사양으로 JavaScript 임베딩, 50년 후에는 존재하지 않을 외부 리소스 링킹, 가역 암호화로 콘텐츠 암호화, 외부 폰트 참조, 그리고 문서를 자체 포함되지 않게 하는 백 가지 다른 일을 할 수 있습니다.

PDF/A (「A」는 Archival)는 50년 후에도 동일하게 렌더링되는 것을 막는 부분을 금지하는 PDF의 프로파일입니다. 고수준 규칙:

  • 모든 폰트가 임베디드되어야 함.
  • JavaScript 없음, 외부 링크 없음, 오디오/비디오 없음.
  • 암호화 없음.
  • 모든 투명도가 평탄화되거나 프로파일 버전에서 지원되어야 함.
  • 색상은 디바이스 독립적이어야 함 (ICC 프로파일 필요).
  • 모든 콘텐츠가 파일 안에 — 네트워크 의존 참조 없음.

여러 버전이 있으며, 각각 새 기능에 대한 허용 추가:

프로파일연도추가 사항
PDF/A-1b2005원본 베이스라인 — 가장 엄격
PDF/A-2b2011JPEG2000, 투명도, 레이어 허용
PDF/A-3b2012임의의 파일 첨부 허용 (Factur-X의 기반)
PDF/A-42020ISO 32000-2 (PDF 2.0) 베이스, 단순화된 컴플라이언스 레벨

「b」 접미사는 「basic」 컴플라이언스 (시각적 충실도)를 의미합니다. 「u」 (유니코드 매핑) 및 「a」 (접근성 태그) 변형도 있지만, 대부분의 인보이스/영수증 워크플로우에서는 「b」가 원하는 것입니다. 세무 보존은 시각적 재현성을 신경 쓰며, 스크린 리더 시맨틱은 신경 쓰지 않습니다.

실용적 결론: 렌더러가 PDF/A-3b를 지원한다고 말하면, 그것은 단일 설정 플래그 ({ profile: "PDF/A-3b" } 또는 동등)이어야 합니다. 이후 변환을 위해 두 번째 도구 (Ghostscript, qpdf, Acrobat)를 실행해야 한다면, 그것은 ops에 고려할 워크플로우 갭입니다.

왜 PDF/A-3가 특히 중요한가: 전자세금계산서의 운반자이기 때문

PDF/A-3는 세계를 바꾸는 한 가지 기능을 추가했습니다: PDF 내의 임의의 파일 첨부.

지루하게 들립니다. 그렇지 않습니다. 그것은 지금 유럽에서 전개되는 전자세금계산서 의무의 전체 기술 기반입니다.

아키텍처: 둘 다인 단일 PDF 파일

  1. 사람이 읽을 수 있는 인보이스 (시각 레이아웃, 합계, 브랜딩) — 사람이 읽는 부분.
  2. 기계가 읽을 수 있는 XML 인보이스 — 세무 당국 소프트웨어가 파싱하는 부분.

둘 다 한 파일 안에, 둘 다 같은 인보이스를 표현하며, PDF/A-3 래퍼는 파일이 수십 년 동안 파싱 가능하게 유지되도록 보장합니다.

두 가지 주요 XML 형식:

  • Factur-X (프랑스) — UN/CEFACT Cross Industry Invoice 기반 XML 프로파일
  • ZUGFeRD (독일) — Factur-X와 실질적으로 동일 (두 표준은 2018년에 기술적으로 통합)
  • EN 16931 — 두 구현이 따르는 유럽 규범

대부분의 워크플로우에서 「Factur-X」와 「ZUGFeRD」는 호환 가능한 용어입니다 — 스키마 공유, 임베딩 메커니즘 공유, 한쪽에 컴플라이언트한 단일 PDF는 일반적으로 다른 쪽에도 컴플라이언트합니다.

의무 사항, 어디서, 언제

2026 Q2/Q3 롤아웃을 계획하는 엔지니어를 위한 비포괄적 스냅샷:

국가상태필수 형식
독일B2B 수신 의무 2025-01-01부터; 2027년부터 발행도EN 16931 (ZUGFeRD / Factur-X / XRechnung)
프랑스대기업 발행 의무 2026-09; 중소기업 2027-09Chorus Pro 경유 Factur-X
이탈리아2019년부터 B2B 의무SDI 경유 FatturaPA
폴란드2024-07부터 의무KSeF
스페인2026년부터 의무 (B2B)FACe 경유 Facturae
벨기에2026-01부터 의무Peppol BIS 3

패턴: 모든 EU 회원국이 2024–2027 타임라인에서 EN 16931 컴플라이언트 전자세금계산서의 어떤 변형을 구현하고 있습니다. 고객이 이 시장 중 어느 곳에서든 운영한다면, PDF 생성기는 시각 인보이스와 함께 첨부된 XML을 발행해야 합니다.

한국 팀을 위한: 한국 전자세금계산서 제도 (2011년 의무화)는 엄격한 PDF/A-3 + XML을 법적으로 요구하지 않지만, 글로벌 확장 시 같은 메커니즘으로 EN 16931 호환 형식을 생성할 수 있다는 것이 강력히 권장됩니다. Peppol도 2024년부터 한국에서 추진되고 있어 향후 B2B 거래에서 구조화된 인보이스 데이터 교환이 일반화될 전망입니다.

가장 작은 실용 파이프라인

표준화 문서가 처방하는 것을 잊으세요. 엔지니어 관점:

   ┌─────────────────────┐
   │  인보이스 데이터       │  (어딘가에 이미 JSON 객체)
   └─────────┬───────────┘


   ┌─────────────────────┐
   │ EN 16931 XML 빌드   │  (결정론적 매핑; 검증된 라이브러리 존재)
   └─────────┬───────────┘


   ┌─────────────────────┐
   │ PDF/A-3b 렌더링 +   │
   │ XML 첨부             │  (gPdf로의 단일 API 호출 — 또는 다른 곳에서 두 단계)
   └─────────┬───────────┘


   ┌─────────────────────┐
   │  Chorus Pro / SDI / │
   │  Peppol 등으로 전달  │
   └─────────────────────┘

비자명한 두 단계:

단계 1: XML 빌드

이것은 짜증나지만 기계적입니다. 인보이스 데이터 (라인, 세금, 합계, 당사자)를 EN 16931 XML 필드 이름에 매핑합니다. 여러 Java/Node/Python 라이브러리가 이를 수행합니다 — 언어로 「factur-x library」를 검색하세요. XML 스키마 사양을 진정으로 즐기지 않는 한 처음부터 작성하지 마세요.

단계 2: PDF/A-3 렌더링 및 XML 첨부

여기서 렌더러 선택이 중요합니다.

내장 지원 없음: 일반 PDF를 렌더링한 다음 PDF/A-3로 변환하고 XML을 임베디드 파일로 첨부하는 도구로 후처리합니다. 일반적인 스택: Ghostscript + qpdf, 또는 Aspose 같은 유료 도구. 두 단계 추가, 두 실패 지점 추가, 후처리가 시각 레이아웃을 드리프트하지 않도록 해야 합니다.

내장 지원 있음 (gPdf의 접근): 한 번의 호출.

curl -X POST https://gpdf.com/api/v1/e-invoice/render \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  --data '{
    "document": {
      "pages": [{ "size": "a4", "elements": [...] }]
    },
    "einvoice": {
      "format": "factur-x",
      "profile": "BASIC",
      "xml": "<rsm:CrossIndustryInvoice>...</rsm:CrossIndustryInvoice>"
    }
  }' \
  --output invoice-with-einvoice.pdf

이것이 전체 파이프라인입니다. 렌더러는 PDF/A-3b를 발행하고, XML을 factur-x.xml (또는 zugferd-invoice.xml, 둘 다 모든 소비자에게 인식됨)로 첨부하고, 바이트를 반환합니다.

일반적인 함정

사람들이 어렵게 배우는 몇 가지:

「PDF/A」와 「PDF/A 컴플라이언트 폰트로」는 같지 않다

PDF/A-3 파일은 사용된 글리프의 완전한 커버리지로 모든 폰트가 임베디드되어야 합니다. 인보이스에 외국 고객 이름이 있고 렌더러가 완전히 임베디드 가능하지 않은 폰트로 폴백하면, 검증 도구가 거부할 것입니다. 렌더러가 PDF/A 모드에서 CJK 폰트를 임베디드하는지 확인하세요 — 많은 것이 기본적으로 그렇지 않습니다.

시각적 + XML이 일치해야 한다

XML 인보이스와 시각적 인보이스는 같은 인보이스를 나타내야 합니다. 세무 감사관은 그것들을 diff할 것입니다. 코드가 total: 119.00으로 XML을 발행하고 시각적 PDF가 합계: 120.00을 표시하면 (반올림 버그나 오래된 템플릿 때문), 파일에 세금 불일치가 있습니다. 둘 다 같은 source-of-truth에서, 이상적으로는 같은 코드 경로에서 생성하세요.

EN 16931의 「프로파일」 레벨

Factur-X에는 프로파일이 있습니다: MINIMUM, BASIC, EN 16931, EXTENDED. XML에 얼마나 많은 데이터가 있는지가 다릅니다. 고객이 구체적으로 더 요구하지 않는 한 BASIC을 사용하세요 — 세금 코드, 라인 항목, 당사자, 합계를 다루며, B2B 인보이스의 ~95%에 충분합니다.

제출 전 검증

항상 생성된 PDF를 PDF/A 검증기 (veraPDF가 오픈 소스 표준)에 대해 검증하고 세무 당국에 제출하기 전에 XML을 EN 16931 스키마에 대해 검증하세요. Chorus Pro / SDI에 대한 실패한 제출은 규제 기관에서의 신뢰성 메트릭에 카운트됩니다.

TL;DR

PDF/A는 자체 포함 문서 프로파일입니다. PDF/A-3는 파일을 첨부할 수 있게 합니다. Factur-X / ZUGFeRD는 「PDF/A-3 안에 첨부된 EN 16931 XML」입니다. EU 전체의 전자세금계산서 의무는 이 조합을 2025–2027년의 사실상 B2B 인보이스 형식으로 만듭니다.

렌더러가 PDF/A-3 + Factur-X를 단일 설정 플래그로 처리한다면, 마이그레이션은 기계적입니다. 그렇지 않다면, 멀티스텝 ops 파이프라인을 구축하는 것입니다. gPdf의 /api/v1/e-invoice/render는 단일 플래그 버전입니다 — API 레퍼런스에 전체 스키마가 있거나, Playground에서 샘플 렌더링을 시도하세요.