|
Rejestruje nazwany pakiet XFA (XML Forms Architecture) do emisji wewnątrz wpisu AcroForm /XFA dokumentu. PDF 1.7 §12.7.6 + §12.7.8 pozwala AcroForm przenosić tablicę /XFA obok statycznej tablicy /Fields albo zamiast niej, co umożliwia hybrydowe przepływy AcroForm + XFA albo czyste dynamiczne formularze XFA.
Delphi syntax:
procedure AddXFAPacket(const PacketName: AnsiString; const XMLBytes: TBytes);
procedure ClearXFAPackets;
function XFAPacketCount: Integer;
Opis
Każde wywołanie AddXFAPacket rejestruje jeden nazwany pakiet. Typowe nazwy (według specyfikacji XFA 3.3 i PDF 1.7 §12.7.8 Table 234):
template - układ formularza + skrypty (największy pakiet w większości dokumentów XFA).
datasets - powiązanie danych (payload XML, względem którego renderuje template).
config - konfiguracja przeglądarki.
connectionSet - zewnętrzne połączenia danych.
localeSet - reguły formatowania zależne od locale.
stylesheet - stylowanie XSLT albo CSS.
xfdf - nakładka danych formularza XFDF.
xmpmeta - metadane XMP.
signature - dane XFA związane z podpisem.
sourceSet - definicje danych po stronie źródła.
Przy EndDoc każdy zarejestrowany pakiet staje się jednym pośrednim obiektem strumienia skompresowanego FlateDecode, a tablica AcroForm /XFA przeplata ciągi PDF z nazwami pakietów z referencjami strumieni w kolejności rejestracji, więc układ jest deterministyczny bajtowo. ClearXFAPackets usuwa wszystkie zarejestrowane pakiety (przydatne przy ponownym używaniu instancji THotPDF w wielu dokumentach). XFAPacketCount zwraca bieżącą liczbę.
Tylko obsługa na poziomie kontenera
HotPDF nie parsuje XML XFA, nie implementuje dynamicznego silnika układu XFA, nie wykonuje FormCalc ani JavaScript wewnątrz template XFA i nie waliduje struktury template. Wywołujący sam tworzy XML XFA (zwykle przez Adobe LiveCycle Designer albo ręcznie według specyfikacji XFA 3.3), a HotPDF emituje bajty bez zmian.
Czytniki konsumenckie z silnikiem XFA (starszy Acrobat / Reader, FormsCentral, niektóre produkty kioskowe) renderują formularz; czytniki bez silnika XFA (Adobe Reader DC od 2017 roku, większość czytników open-source) wyświetlają fallbackowe pola AcroForm, jeśli dokument jest hybrydowym przepływem AcroForm + XFA.
Bramki zgodności PDF/A i PDF/X
ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 jawnie zabraniają formularzy XFA (dynamiczny silnik układu nie jest deterministycznie archiwizowalny). Przepływy prepress ISO 15930 całkowicie odrzucają formularze interaktywne. AddXFAPacket natychmiast zgłasza wyjątek przy dowolnym niepustym PDFACompliance albo PDFXCompliance z właściwą referencją specyfikacji. Zduplikowane nazwy pakietów zgłaszają wyjątek. Pusty PacketName albo pusty XMLBytes zgłasza wyjątek. RequirePDFVersion(pdf15) automatycznie podnosi wersję dokumentu.
Emisja słownika AcroForm
Słownik AcroForm jest emitowany, gdy albo /Fields ma co najmniej jeden wpis, albo zarejestrowano co najmniej jeden pakiet XFA. Wywołujący sprzed v2.119.51, którzy nie rejestrują pakietów, zachowują bajtowo identyczne wyjście /AcroForm.
Typowy przepływ pracy (czysty dynamiczny formularz XFA)
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
Tablicowa forma /XFA musi zaczynać się i kończyć pakietami opakowującymi xdp:xdp, jak teraz pokazuje przykład (ISO 32000-1 §12.7.8). Powiązane interfejsy XFA: SetXFADocument zapisuje cały dokument XFA/XDP jako pojedynczy strumień /XFA, wykluczający się z AddXFAPacket; XFANeedsRendering ustawia flagę /NeedsRendering w katalogu (ISO 32000-1 §7.7.2), aby czytnik ponownie wygenerował dynamiczny formularz XFA przy pierwszym otwarciu; AddXFASignaturePacket osadza wygenerowany przez wywołującego podpis XAdES / XML-DSig jako pakiet signature. HotPDF nigdy nie generuje ani nie analizuje podpisu - wywołujący tworzy go za pomocą biblioteki kryptograficznej XML na danych XFA.
Spłaszczanie XFA do AcroForm
ApplyXFAAsAcroForm odwzorowuje bajty XDP/XFA podane przez wywołującego na bieżącej stronie jako natywne widżety AcroForm i proste elementy graficzne. FlattenLoadedXFA wykonuje tę samą konwersję dla wczytanego PDF z osadzonym pakietem /XFA. Przekaż Editable=False, aby ustawić widżety jako tylko do odczytu, i sprawdź XFAFlattenWarnings dla nieodwzorowanych elementów.
Zobacz też: AcroForm Support, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField
|