THotPDF.AddXFAPacket / ClearXFAPackets / XFAPacketCount

THotPDF XFA forms container (v2.119.51)

 

RegisterAcroFormFont  AcroForm Support

문서 AcroForm의 /XFA 항목에 넣을 이름 있는 XFA(XML Forms Architecture) 패킷을 등록합니다. PDF 1.7 §12.7.6 및 §12.7.8에 따르면 AcroForm은 /XFA 배열을 정적 /Fields 배열과 함께(또는 그 대신) 가질 수 있으며, 이를 통해 AcroForm과 XFA를 결합한 하이브리드 워크플로우나 순수 동적 XFA 폼을 구성할 수 있습니다.

 

Delphi syntax:

procedure AddXFAPacket(const PacketName: AnsiString; const XMLBytes: TBytes);

procedure ClearXFAPackets;

function XFAPacketCount: Integer;

 

Description

AddXFAPacket을 호출할 때마다 이름 있는 패킷이 하나씩 등록됩니다. 일반적인 이름은 다음과 같습니다(XFA 3.3 명세 및 PDF 1.7 §12.7.8 Table 234 기준):

 

template - 폼 레이아웃과 스크립트(대부분의 XFA 문서에서 가장 큰 패킷).

datasets - 데이터 바인딩(템플릿이 렌더링에 사용하는 XML 페이로드).

config - viewer configuration.

connectionSet - external data connections.

localeSet - locale-specific formatting rules.

stylesheet - XSLT or CSS styling.

xfdf - XFDF form data overlay.

xmpmeta - XMP metadata.

signature - signature-related XFA data.

sourceSet - source-side data definitions.

 

EndDoc 시점에 등록된 각 패킷은 FlateDecode로 압축된 간접 스트림 객체가 되고, AcroForm의 /XFA 배열에는 패킷 이름 PDF 문자열과 스트림 참조가 등록 순서대로 번갈아 들어갑니다. 따라서 레이아웃은 바이트 단위로 결정적(deterministic)입니다. ClearXFAPackets는 등록된 패킷을 모두 제거하며, 하나의 THotPDF 인스턴스를 여러 문서에 재사용할 때 유용합니다. XFAPacketCount는 현재 개수를 반환합니다.

 

Container-level support only

HotPDF는 XFA XML을 파싱하지 않고, XFA 동적 레이아웃 엔진을 구현하지 않으며, XFA 템플릿 안의 FormCalc나 JavaScript를 실행하지 않고, 템플릿 구조를 검증하지도 않습니다. XFA XML은 호출자가 직접 작성해야 하며(보통 Adobe LiveCycle Designer를 쓰거나 XFA 3.3 명세를 보고 직접 작성), HotPDF는 그 바이트를 그대로 출력합니다.

 

XFA 엔진이 있는 리더(구형 Acrobat / Reader, FormsCentral, 일부 키오스크 제품)는 폼을 렌더링합니다. XFA 엔진이 없는 리더(2017년 이후의 Adobe Reader DC, 대부분의 오픈 소스 리더)는 문서가 AcroForm + XFA 하이브리드인 경우 대체용 AcroForm 필드를 표시합니다.

 

PDF/A and PDF/X compliance gates

ISO 19005-1 §6.4.2, ISO 19005-2 §6.4.2, ISO 19005-3 §6.4.2는 모두 XFA 폼을 명시적으로 금지합니다(동적 레이아웃 엔진은 결정적으로 아카이빙할 수 없기 때문). ISO 15930 프리프레스 워크플로우는 인터랙티브 폼 자체를 허용하지 않습니다. AddXFAPacket은 PDFACompliance나 PDFXCompliance가 비어 있지 않으면 해당 명세 참조와 함께 즉시 예외를 발생시킵니다. 패킷 이름이 중복되거나, PacketName 또는 XMLBytes가 비어 있을 때도 예외가 발생합니다. RequirePDFVersion(pdf15)가 문서 버전을 자동으로 올립니다.

 

AcroForm dictionary emission

AcroForm 딕셔너리는 다음 둘 중 하나에 해당할 때 출력됩니다. /Fields에 항목이 하나 이상 있거나, 또는 XFA 패킷이 하나 이상 등록된 경우입니다. 패킷을 등록하지 않는 v2.119.51 이전 호출자는 /AcroForm 출력이 바이트 단위로 동일하게 유지됩니다.

 

Typical workflow (pure XFA dynamic form)

 

PDF.BeginDoc;

TemplateBytes := TFile.ReadAllBytes('form-template.xml');

DataBytes     := TFile.ReadAllBytes('form-data.xml');

PDF.AddXFAPacket('xdp:xdp', BytesOf('<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">'));

PDF.AddXFAPacket('template', TemplateBytes);

PDF.AddXFAPacket('datasets', DataBytes);

PDF.AddXFASignaturePacket(SigBytes); { caller-generated XAdES }

PDF.AddXFAPacket('/xdp:xdp', BytesOf('</xdp:xdp>'));

PDF.EndDoc;

 

XDP wrapper, single-stream, dynamic, and signed XFA

/XFA 배열 형식은 예제에서 보듯 xdp:xdp 래퍼 패킷으로 시작하고 끝나야 합니다(ISO 32000-1 §12.7.8). 관련 XFA API는 다음과 같습니다. SetXFADocument는 XFA/XDP 문서 전체를 단일 /XFA 스트림으로 기록하며 AddXFAPacket과 함께 사용할 수 없습니다. XFANeedsRendering은 Catalog의 /NeedsRendering 플래그(ISO 32000-1 §7.7.2)를 설정해 뷰어가 처음 열 때 동적 XFA 폼을 다시 생성하도록 합니다. AddXFASignaturePacket은 호출자가 생성한 XAdES / XML-DSig 서명을 signature 패킷으로 임베드합니다. HotPDF는 서명을 생성하거나 파싱하지 않으며, 호출자가 XFA datasets에 대해 XML 암호화 라이브러리로 직접 만들어야 합니다.

 

XFA-to-AcroForm flattening

ApplyXFAAsAcroForm은 호출자가 제공한 XDP/XFA 바이트를 현재 페이지의 네이티브 AcroForm 위젯과 단순한 페이지 그래픽으로 변환합니다. FlattenLoadedXFA는 이미 /XFA 패킷이 임베드된 로드된 PDF에 대해 같은 변환을 수행합니다. Editable=False를 전달하면 생성되는 위젯이 읽기 전용이 되며, 매핑하지 못한 요소는 XFAFlattenWarnings에서 확인할 수 있습니다.

 

See also: AcroForm Support, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField