송장과 전자 송장
Spec: EN 16931-1:2026, BT-24 EN 16931-1:2026 BT-24 Spec: Factur-X 1.08 Factur-X 1.08 Spec: ISO 32000-2:2020, §14.13 ISO 32000-2:2020 §14.13 Evidence: Mixed evidence
한눈에 보기
섹션 제목: “한눈에 보기”현대적인 송장은 하나의 파일 안에 두 문서를 담습니다. 사람이 읽는 페이지와 세무 시스템이 파싱하는 기계 판독 가능 XML 페이로드입니다. 이 페이지에서는 하이브리드 송장 시나리오를 의무 사항부터 출력까지 차례로 살펴봅니다 — ZUGFeRD와 Factur-X가 실제로 무엇을 요구하는지, NextPDF가 구조화된 페이로드를 어떻게 첨부하고 확인하는지, 그리고 적합성이 엔진이 아니라 여러분의 책임이 되는 경계가 어디인지 다룹니다.
이것이 중요한 이유
섹션 제목: “이것이 중요한 이유”여러 관할권에서는 이제 기업 간(B2B) 또는 기업·정부 간(B2G) 청구에 구조화된 송장을 의무화하고 있습니다. 함정은 하이브리드 송장이 화면에서는 완벽해 보여도 여전히 거부될 수 있다는 점입니다. 거부는 픽셀이 아니라 임베드된 XML 때문에 발생합니다. 구조화된 페이로드에 사양 식별자가 빠져 있거나, 잘못된 프로파일을 선언했거나, 잘못된 관계로 첨부되어 있으면 수신 플랫폼은 이를 실패로 처리합니다. 여러분 쪽에서는 이 실패가 대개 조용히 일어나고, 며칠 뒤 지급이 묶인 상태로 드러납니다.
파일을 생성하는 계층에서 이를 한 번에 바로잡는 것이, 정산된 송장을 하나씩 확인하며 문제를 발견하는 것보다 훨씬 비용이 적습니다.
요약하자면
섹션 제목: “요약하자면”- 규정을 준수하는 하이브리드 송장은 연관 파일로 임베드된 적합한 XML 페이로드를 담은 PDF/A 캐리어입니다. 캐리어 메타데이터는 반드시 프로파일을 선언해야 합니다.
- 수락 여부를 가장 자주 좌우하는 단일 필드는 BT-24, 즉 사양 식별자입니다. EN 16931 비즈니스 규칙 BR-1은 모든 송장이 이 값을 포함하도록 요구합니다. 이 값은 정확한 프로파일을 가리키는 URN입니다 — 예를 들어 EN 16931(COMFORT) 프로파일의
urn:cen.eu:en16931:2017가 그것입니다. - NextPDF의 역할은 호출자가 제공한 XML의 임베딩과 구조적 검증입니다. 송장 내용을 작성하지 않으며 세무 당국 검증기가 아닙니다.
- 발행자는 여전히 법적·재정적 정확성에 대한 책임을 집니다. 깨끗한 검증 결과는 그 판단에 대한 하나의 입력일 뿐, 인증서가 아닙니다.
NextPDF 의 접근 방식
섹션 제목: “NextPDF 의 접근 방식”NextPDF는 구조화된 송장을 단일 기능이 아니라 계층 간 계약으로 취급합니다. 코어 엔진은 인터페이스(임베더, 프로파일 디스크립터, 검증기)를 정의하고, Premium 등급이 구현체를 제공합니다. 이 분리는 의도적입니다. 공개 인터페이스가 코어에 고정되어 있으므로, 호출 지점과 테스트는 뒤에 어떤 등급이 있든 관계없이 동일한 방식으로 프로파일과 결과를 다룹니다.
흐름은 네 단계로 이루어지며, 각 단계가 앞 단계에 의존하므로 순서가 중요합니다.
- Author the invoice XML You (or your ERP) produce a UN/CEFACT CII or Peppol UBL payload. NextPDF never synthesizes invoice content.
- Produce the PDF/A carrier A PDF/A-3 or PDF/A-4f document is the human-readable face and the conformant container the standard requires.
- Embed the payload The embedder attaches the XML as an associated file with the correct AFRelationship, and injects the Factur-X XMP profile declaration.
- Validate, then ship A structural pass checks the root, the required sections, and BT-24 against the declared profile before the file leaves your system.
임베더 계약은 바이트를 입력받아 바이트를 출력합니다. PDF/A 캐리어와 XML 페이로드가 들어가면 하이브리드 PDF 바이트가 나옵니다. 어떤 것이든 첨부되기 전에, XML은 DOCTYPE를 거부하고, 입력 크기를 제한하며, XML 1.0에서 금지된 제어 문자를 거부하는 강화된 보호 장치를 통해 파싱됩니다. 이는 XML 외부 엔티티(XXE) 공격과 Billion-Laughs 공격을 구조적으로 제거합니다. 송장 XML은 흔히 여러분의 신뢰 경계 밖에서 들어오기 때문입니다.
프로파일 디스크립터는 다운스트림 시스템이 묻는 네 가지 질문에 답합니다. 정규 프로파일 URN, 어설션할 BT-24 값, 로그에 쓸 안정적인 이름, 그리고 패리티 테스트가 결과를 묶을 수 있게 하는 등급 중립적 판별자입니다. 디스크립터는 빈틈을 솔직하게 드러냅니다. ZUGFeRD MINIMUM 프로파일은
BT-24 사양 식별자를 담지 않으며, 디스크립터는 이를 꾸며내지 않고 null을 반환합니다.
그렇기 때문에 MINIMUM과 BASIC WL도
EN 16931에 적합하지 않습니다. 엔진은 카디널리티의 실상을 숨기지 않고
인코딩합니다.
증거가 보여주는 것
섹션 제목: “증거가 보여주는 것”위 동작은 세 가지 근거에 기반하며, 각각 서로 다른 종류의 증거를 제공합니다.
표준이 의무를 정합니다.
Spec: EN 16931-1:2026, BR-1 EN 16931-1:2026 BR-1 사양
식별자를 모든 송장에 필수로 요구합니다. Factur-X
기술 부록은 EN 16931 프로파일의 urn:cen.eu:en16931:2017을 포함해 프로파일별 URN 값을 고정합니다. 캐리어 자체는
PDF의 관심사입니다. Spec: ISO 32000-2:2020, §9 ISO 32000-2:2020 §9 는 모든 폰트가
임베드되어 있을 때 가장 예측 가능하고 신뢰할 수 있는 렌더링이 이루어진다고 설명합니다. 이는
10년 뒤에도 읽을 수 있어야 하는 송장이 판독기의 폰트 환경에 의존해서는 안 되기 때문에 직접 관련됩니다.
코드가 계약을 담고 있습니다. Evidence: Code-backed 코어의 EmbedderInterface, ProfileInterface, 그리고 ValidatorInterface는 실제 등급 중립 인터페이스입니다. ProfileType::isEn16931Conformant()는 MINIMUM / BASIC WL 배제를 타입 시스템에 인코딩합니다. ValidationResult는 isValid가 “오류 발견 없음”과 “치명적 규칙 위반 없음”의 논리곱인 불변 DTO입니다.
Premium 등급의 동작은 역량 수준에서 문서화되어 있습니다: Evidence: Standard-backed 임베더는 호출자가 제공한 ZUGFeRD 2.4 / Factur-X 1.08 CII 또는 Peppol UBL XML을 PDF/A-4f 또는 PDF/A-3b 캐리어에 올바른 연관 파일 관계로 첨부합니다. 검증기는 EN 16931 의미 모델과 BT-24 식별자를 확인합니다. Schematron 단계는 XSLT로 컴파일된 CEN 규칙 세트를 실행합니다. 이 과정 어느 것도 송장 내용을 생성하거나 수정하지 않습니다.
실제 예시
섹션 제목: “실제 예시”아래 코드는 접합부를 보여주기 위한 예시일 뿐, 복사해 바로 쓰는 통합 코드는 아닙니다. 캐리어 구성과 임베더는 Premium 등급에서 제공되며, XML은 여러분이 제공합니다.
<?php
declare(strict_types=1);
use NextPDF\Contracts\EInvoice\ProfileType;use NextPDF\Contracts\EInvoice\ValidatorContext;use NextPDF\Contracts\EInvoice\ValidatorInterface;use NextPDF\Contracts\EInvoice\EmbedderInterface;use NextPDF\Contracts\EInvoice\EmbedderOptions;use Psr\Log\LoggerInterface;
/** * Validate first, embed second, never ship an invalid payload. * * @param non-empty-string $carrierPdf PDF/A-3 or PDF/A-4f carrier bytes * @param non-empty-string $ciiXml Caller-authored UN/CEFACT CII XML * * @return non-empty-string Hybrid invoice bytes, ready to deliver */function buildHybridInvoice( ValidatorInterface $validator, EmbedderInterface $embedder, LoggerInterface $logger, string $carrierPdf, string $ciiXml,): string { // STRICT mode: a missing BT-24 is a hard error, not a warning. $context = new ValidatorContext( profile: ProfileType::EN16931, strictMode: true, );
$result = $validator->validate($ciiXml, $context);
if (!$result->isValid) { foreach ($result->getErrors() as $finding) { $logger->error('invoice.structural_finding', [ 'message' => $finding->message, ]); }
// A failed structural check is your signal to stop, not to ship. throw new \RuntimeException('Invoice XML failed structural validation.'); }
$options = new EmbedderOptions(profile: ProfileType::EN16931);
return $embedder->embed($carrierPdf, $ciiXml, $options);}순서가 핵심입니다. 검증은 거부된 송장과 지연된 지급보다 비용이 훨씬 낮으므로, 페이로드가 첨부되기 전에 실행됩니다.
흔한 오해
섹션 제목: “흔한 오해”가장 값비싼 오해는 *“NextPDF가 내 송장을 규정 준수하게 만들어 준다”*라는 것입니다. 그렇지 않으며, 이 페이지는 그 점을 분명히 합니다. 엔진은 여러분이 작성한 XML을 임베드하고 구조적으로 확인합니다. 구조 검사를 통과했다는 것은 페이로드가 EN 16931이 기대하는 형태를 갖추고, 여러분이 요청한 프로파일을 선언한다는 뜻입니다. 송장이 법적으로 충분하거나, 세무 당국의 승인을 받았거나, 어떤 정산 플랫폼에서든 수락이 보장된다는 뜻이 아닙니다. 국가별 확장과 정산 전송은 엔진 수준에서 범위를 벗어납니다. EN 16931-1 자체가 표현하듯, 코어 모델은 규정 준수를 뒷받침하는 데 필요한 정보를 담고 있습니다. 발행자는 관련 법규를 충족할 책임이 있습니다.
두 번째, 더 조용한 함정은 표준 지원이 그 표준에 대한 적합성을 뜻하지 않는다는 점입니다. 적합성은 최종 파일과 검증기의 속성이지, 그것을 생성한 라이브러리의 속성이 아닙니다.
한계와 경계
섹션 제목: “한계와 경계”- NextPDF는 송장 내용을 작성하거나 수정하지 않습니다. 호출자가 유효한 XML을 제공하고 송장 발행자로 남습니다. 발견 목록이 비어 있어도 적합하지 않은 페이로드가 적합해지지는 않습니다.
- 구조화된 임베딩과 Schematron 검증은 Premium 등급의 역량입니다. 코어는 계약을 정의하고, 구현체에는 상용 패키지가 필요합니다. 아래 경계를 참조하십시오.
- 검증기는 EN 16931 의미 모델과 ZUGFeRD / Factur-X / UBL 컨테이너만 확인합니다. 이는 세무 당국 검증기가 아닙니다. SDI, Chorus Pro, XRechnung 전송은 전송 수준에서 범위를 벗어납니다.
- MINIMUM과 BASIC WL 프로파일은 EN 16931에 적합하지 않으며 BT-24 사양 식별자를 담지 않습니다 — 이는 엔진의 한계가 아니라 표준의 카디널리티를 반영한 설계상의 결과입니다.
- Schematron 엔진은
ext-xsl이 필요합니다. 규칙 세트는 빌드 시점에 컴파일됩니다. 런타임은 네트워크 및 파일 시스템 리소스 로딩이 비활성화된 상태에서 사전 컴파일된 XSLT만 실행합니다. - 이 페이지는 동작을 역량 수준에서 설명하며, 특정 당국이나 플랫폼의 수락을 단언하지 않습니다.
| Edition | Availability |
|---|---|
| Core | 코어는 계층 간 계약( |
| Pro | Factur-X 1.08 CII를 PDF/A 캐리어에 임베딩하고 EN 16931 프로파일 디스크립터를 사용할 수 있습니다. |
| Enterprise | Peppol BIS 3.0 UBL 임베딩, XRechnung B2G CIUS, COMPAT/STRICT XML 검증, 그리고 인프로세스 Schematron 규칙 엔진을 추가합니다. |
관련 문서
섹션 제목: “관련 문서”- 아카이빙 및 PDF/A — 왜 송장 캐리어가 PDF/A 파일인지, 그리고 그것이 장기 가독성에 대해 무엇을 보장하는지.
- 통합 결정 가이드 — 송장 처리 파이프라인에 어떤 에코시스템 패키지가 적합한지(대기열 기반 생성, 프레임워크 브리지 또는 Connect).
- 프로덕션에서 NextPDF 운영하기 — 송장이 대량으로 흐를 때 검증 발견 사항과 실패를 관찰하는 방법.
용어집
섹션 제목: “용어집”- 하이브리드 송장 — 사람이 읽을 수 있는 페이지이면서 동시에 기계가 판독할 수 있는 임베드된 XML 송장 페이로드를 포함한 단일 PDF 파일.
- ZUGFeRD / Factur-X — 동일한 하이브리드 송장 방식을 가리키는 독일어 및 프랑스어 명칭: PDF/A 캐리어에 임베드된 UN/CEFACT 산업 간 송장(CII) XML 페이로드.
- EN 16931 — 전자 송장의 코어 요소에 대한 의미 데이터 모델을 정의하는 유럽 표준.
- BT-24(사양 식별자) — 값이 송장이 적합한 정확한 프로파일을 명명하는 URN인 EN 16931 비즈니스 용어. 비즈니스 규칙 BR-1에 의해 요구됩니다.
- 프로파일 — 적합성 수준(MINIMUM, BASIC WL, BASIC, EN 16931, EXTENDED, XRECHNUNG)이라고도 합니다. 송장이 반드시 포함해야 하는 비즈니스 용어를 결정합니다.
- 연관 파일 — 보이는 문서와의 관계를 설명하는 선언된 관계(AFRelationship)와 함께 PDF 내부에 첨부된 파일; 송장 XML을 운반하는 메커니즘.
- Schematron — EN 16931 비즈니스 규칙을 표현하는 데 사용되는 규칙 언어. NextPDF는 XSLT로 컴파일된 CEN 규칙 세트를 실행합니다.