|
문서의 AcroForm /XFA entry 안에 emit할 named XFA(XML Forms Architecture) packet을 등록합니다. PDF 1.7 §12.7.6 + §12.7.8은 AcroForm이 static /Fields array와 함께(또는 대신) /XFA array를 가질 수 있게 하여 hybrid AcroForm + XFA workflow 또는 pure dynamic XFA form을 가능하게 합니다
Delphi 구문:
procedure AddXFAPacket(const PacketName: AnsiString; const XMLBytes: TBytes);
procedure ClearXFAPackets;
function XFAPacketCount: Integer;
설명
AddXFAPacket을 한 번 호출할 때마다 named packet 하나가 등록됩니다. 일반적인 이름은 XFA 3.3 specification 및 PDF 1.7 §12.7.8 Table 234 기준으로 다음과 같습니다
template - form layout + scripts (the largest packet in most XFA documents).
datasets - data binding (the XML payload the template renders against).
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에서 등록된 각 packet은 하나의 indirect FlateDecode-compressed stream object가 되며, AcroForm /XFA array는 registration order대로 packet-name PDF string과 stream reference를 번갈아 배치하므로 layout은 byte-deterministic합니다. ClearXFAPackets는 등록된 모든 packet을 제거합니다(여러 문서에서 THotPDF instance를 재사용할 때 유용). XFAPacketCount는 현재 count를 반환합니다
Container-level support only
HotPDF는 XFA XML을 parse하지 않고, XFA dynamic-layout engine을 구현하지 않으며, XFA template 내부의 FormCalc 또는 JavaScript를 실행하지 않고, template structure를 validate하지 않습니다. 호출자가 XFA XML을 직접 작성하며(일반적으로 Adobe LiveCycle Designer를 사용하거나 XFA 3.3 specification에 맞춰 직접 작성), HotPDF는 byte를 그대로 emit합니다
XFA engine이 있는 consumer reader(오래된 Acrobat / Reader, FormsCentral, 일부 kiosk product)는 form을 렌더링합니다. XFA engine이 없는 reader(2017년 이후 Adobe Reader DC, 대부분의 open-source reader)는 문서가 hybrid AcroForm + XFA workflow인 경우 fallback AcroForm field를 표시합니다
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 form을 명시적으로 금지합니다(dynamic-layout engine은 deterministic하게 archive할 수 없음). ISO 15930 prepress workflow는 interactive form 전체를 거부합니다. AddXFAPacket은 비어 있지 않은 PDFACompliance 또는 PDFXCompliance 아래에서 관련 spec reference와 함께 즉시 raise합니다. Duplicate packet name은 raise합니다. 빈 PacketName 또는 빈 XMLBytes도 raise합니다. RequirePDFVersion(pdf15)는 document version을 자동으로 bump합니다
AcroForm dictionary emission
AcroForm dict는 /Fields에 하나 이상의 entry가 있거나 하나 이상의 XFA packet이 등록된 경우 emit됩니다. Packet을 등록하지 않는 pre-v2.119.51 caller는 byte-identical /AcroForm output을 유지합니다
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
The array /XFA form must open and close with xdp:xdp wrapper packets, as the example now shows (ISO 32000-1 §12.7.8). Related XFA APIs: SetXFADocument writes the whole XFA/XDP document as a single /XFA stream, mutually exclusive with AddXFAPacket; XFANeedsRendering sets the Catalog /NeedsRendering flag (ISO 32000-1 §7.7.2) so a viewer regenerates a dynamic XFA form on first open; AddXFASignaturePacket embeds a caller-generated XAdES / XML-DSig signature as the signature packet. HotPDF never generates or parses the signature - the caller produces it with an XML cryptographic library over the XFA datasets.
XFA-to-AcroForm flattening
ApplyXFAAsAcroForm은 caller-supplied XDP/XFA byte를 native AcroForm widget과 단순 page graphic으로 current page에 map합니다. FlattenLoadedXFA는 embedded /XFA packet을 이미 가진 loaded PDF에 대해 같은 conversion을 수행합니다. 생성된 widget을 read-only로 만들려면 Editable=False를 전달하고, map할 수 없었던 element는 XFAFlattenWarnings에서 확인하십시오
참조: AcroForm Support, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField
|