Dve forme mogu sadržati ista polja, ali se ponašati potpuno različito. AcroForm čuva svoja polja kao obične PDF objekte koji se nalaze na vrhu stvarnog sadržaja stranice, pa ih svaki kompatibilni čitač može iscrtati. Dinamička XFA forma skoro ništa ne čuva kao PDF: polja, raspored, pa čak i geometrija stranice nalaze se u XML paketu, a vidljive stranice se kreiraju prilikom otvaranja pomoću layout engine-a koji je samo Adobe široko distribuirao. Ako taj fajl prosledite web pregledaču, arhivskom rendereru ili ekstraktoru teksta, nećete dobiti formu. Dobićete jednu sivu stranicu sa tekstom „Please wait... If this message is not eventually replaced by the proper contents of the document, your PDF viewer may not be able to display this type of document.” Svako ko je obrađivao državnu dokumentaciju ili papire za osiguranje prepoznaje tu stranicu na prvi pogled.
Ovaj privremeni tekst (placeholder) nije greška u dokumentu. To je upravo ono što format propisuje da se dogodi kada XFA procesor nije prisutan, a od 2026. godine to opisuje skoro svaki čitač van desktop verzije Acrobat-a. Zato je praktičan korak konverzija dinamičke forme u običan AcroForm pre nego što stigne do bilo kog daljeg sistema. HotPDF, losLab-ova PDF biblioteka za Delphi i C++Builder, vrši tu konverziju u kodu, ponovo gradeći XML formu kao izvorna polja na izvornim stranicama.
Zašto ova dva modela ne mogu da koegzistiraju
AcroForm je definisan u standardu ISO 32000-1 §12.7. Svako polje je PDF objekat sa widget anotacijom i tokom prikaza (appearance stream), stranica je stvarni PDF sadržaj, a podaci se nalaze na vrhu. XFA to izvrće: forma je XML dokument, XDP paket sačuvan u unosu /XFA u AcroForm rečniku, dok PDF stranice dinamičke forme sadrže samo tekst upozorenja „Please wait” i ništa više, jer stvarni sadržaj nikada nije serijalizovan kao PDF. Čitač obrađuje fajl prema jednom ili drugom modelu. Ako ignorišete unos /XFA, videćete praznu ljušturu; ako ga poštujete bez XFA engine-a, videćete upozorenje. Standard ISO 32000-2 je okončao ovu debatu uklanjanjem XFA iz PDF-a 2.0, što je glavni razlog zašto je „konverzija dok je još uvek moguća” prešla iz specifičnog slučaja u rutinsku politiku obrade.
Pre nego što bilo šta konvertujete, klasifikujte to, jer ne prikazuje svaki XFA fajl pomenuto upozorenje. Statičke XFA forme isporučuju unapred renderovane PDF stranice pored XML-a, tako da se prikazuju svuda i ponašaju se neispravno samo kada se popune. Dinamičke forme isporučuju samo privremeni tekst i neupotrebljive su dok se ne konvertuju. Ono čemu treba verovati jeste dokument, a nikada ekstenzija ili pošiljalac. Fajl koji prikazuje stvarni sadržaj u čitaču koji nije Adobe, a i dalje sadrži unos /XFA, jeste statički ili hibridni; fajl koji prikazuje stranicu sa upozorenjem je dinamički. Zabeležite u koju kategoriju je svaki učitani fajl svrstan. Ove dve vrste se kasnije kvare na različite načine, pa se prijava o praznoj arhiviranoj formi rešava za nekoliko sekundi ako u dnevniku unosa već piše „dinamički XFA, konvertovan, 47 polja mapirano, 2 upozorenja”.
Konverzija učitanog XFA dokumenta u izvorna polja
Konverzija se vrši nad dokumentom koji je već u memoriji. Funkcija FlattenLoadedXFA analizira XFA šablon i njegove pakete podataka, raspoređuje formu i ponovo je gradi kao AcroForm polja na stvarnim PDF stranicama:
var
Pdf: THotPDF;
MappedCount, I: Integer;
Warnings: TStrings;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.LoadFromFile('dynamic_xfa.pdf');
MappedCount := Pdf.FlattenLoadedXFA(True); // True = fields stay editable
Warnings := Pdf.XFAFlattenWarnings;
for I := 0 to Warnings.Count - 1 do
Log('XFA flatten warning: ' + Warnings[I]); // unmapped elements
Pdf.SaveLoadedDocument('native_acroform.pdf');
Log(Format('Mapped %d fields', [MappedCount]));
finally
Pdf.Free;
end;
end;
Povratna vrednost i lista upozorenja su izlazni rezultati, a ne samo informacije za otklanjanje grešaka (debug noise), tako da sačuvajte oba. Konverzija po svojoj prirodi gubi informacije: XFA skriptovanje, izračunata polja i dinamičko ponašanje podformi nemaju AcroForm ekvivalent, a XFAFlattenWarnings navodi svaki element šablona koji nije mapiran. Ako arhivirate konvertovani fajl bez njegove liste upozorenja, jednog dana ćete gledati u prazno polje sa ukupnim iznosom u arhiviranoj kopiji bez ikakvog zapisa o tome zašto se to desilo. Zastavica Editable kontroliše da li će nova polja ostati popunjiva. Prosledite True kada ljudi nastavljaju da rade sa formom nakon toga, ili zaključajte vrednosti kada je cilj zamrznuti zapis.
Provera konverzije je delom vizuelna, a delom strukturna, i potrebne su vam obe polovine. Strukturni deo je jednostavan: potvrdite da broj polja odgovara vrednosti MappedCount. Vizuelni deo je onaj koji otkriva stvarna oštećenja. Otvorite izvornu formu u desktop verziji Acrobat-a (što je i dalje jedini čitač koji pokreće XFA engine) pored konvertovanog fajla u običnom čitaču, i uporedite vrednosti i raspored na najmanje jednom popunjenom uzorku po šablonu. Datum koji je XFA engine prikazao kao 2026-06-11 može u AcroForm kopiji završiti kao sirova, neformatirana vrednost, i to će samo vaše oči moći da primete.
Kada je ulazni podatak XDP paket
Ne počinje svaki posao od popunjenog PDF-a. Ponekad dobijate samostalni XDP paket, izvezen iz alata za dizajniranje formi ili predat od strane partnerskog sistema. Funkcija ApplyXFAAsAcroForm preskače korak učitavanja i primenjuje paket direktno na trenutni dokument:
XDPBytes := TFile.ReadAllBytes('benefit-claim.xdp');
MappedCount := Pdf.ApplyXFAAsAcroForm(XDPBytes, True);
Ista grupa poziva radi i u suprotnom smeru, za ređe slučajeve kada morate da generišete XFA umesto da ga čitate. AddXFAPacket prilaže pojedinačne imenovane pakete kao što su 'xdp' ili 'config'. Funkcija SetXFADocument instalira kompletan sadržaj u jednom pozivu. ClearXFAPackets briše registraciju kako biste mogli da počnete ispočetka, a AddXFASignaturePacket ugrađuje XAdES podatke za tokove rada koji direktno potpisuju XML podatke forme. Generisanje XFA in 2026 je specifična potreba, skoro uvek nametnuta od strane nekog nasleđenog sistema koji odbija bilo šta drugo, ali kada to ugovor zahteva, ovi pozivi to svode na konfiguracioni izbor umesto korišćenja posebnog alata.
Drugo značenje pojma „flatten”
Reč „flatten” (spljoštiti/oblikovati) često unosi zabunu u razgovore, jer označava i jednu potpuno drugu operaciju: trajno urezivanje izgleda AcroForm polja u tok sadržaja stranice dok ne nestanu svi interaktivni objekti. HotPDF danas nema API za to, i to je dobro znati odmah na početku projekta. Ono što vam biblioteka umesto toga pruža jeste zaključavanje na nivou polja kada se polje kreira, podržano dozvolama dokumenta:
// Lock the value at field creation: read-only text field
Pdf.CurrentPage.AddTextField('CaseNumber', 'BC-2026-0117',
Rect(50, 700, 220, 720), 0, [ffReadOnly]);
// Belt and suspenders: restrict form filling document-wide
Pdf.ActivateProtection := True;
Pdf.CryptKeyLength := aes256;
Pdf.OwnerPassword := 'records-owner';
Pdf.ProtectOptions := [prPrint, prInformationCopy, prExtractContent];
// fill permission withheld: prFillAnnotations is absent from the set
Budite načisto sa tim šta time dobijate, a šta ne. Polje koje je samo za čitanje (read-only) je i dalje objekat forme. Ono se pojavljuje u panelu polja u čitaču, njegova vrednost je čitljiva preko API-ja forme, a alat koji ponovo upisuje fajl može ponovo obrisati zastavicu „read-only”. Zastavice dozvola podižu nivo bezbednosti, ali zavise od toga da li čitač želi da ih poštuje, što je ograničenje koje ISO 32000-1 jasno navodi. Kada regulator insistira na tome da arhivirani zapis uopšte ne sadrži objekte forme, jedino pravo rešenje sa HotPDF-om danas jeste rekonstrukcija dokumenta: pročitajte vrednosti, a zatim ih iscrtajte kao običan TextOut sadržaj na novoj stranici, umesto da koristite „read-only” zastavice kao zamenu za flattening. Jedna stvar koju treba zapamtiti kod dozvola jeste da CryptKeyLength mora biti podešen pre poziva BeginDoc; ostatak je detaljno opisan u našem članku o AES-256 enkripciji i dozvolama.
Šta XFA znači za usklađenost sa arhivskim standardima
Standardi PDF/A i PDF/X u potpunosti odbacuju XFA. Proces koji šalje dokumente u arhivu prema standardu ISO 19005 stoga mora prvo izvršiti konverziju, a redosled nije podložan pregovorima: učitavanje, FlattenLoadedXFA, čuvanje, a zatim pokretanje arhivskog generisanja ili validacije nad dobijenim AcroForm rezultatom. Nemojte tretirati konverziju kao dokaz usklađenosti. Ona ispravlja model forme, ali ostavlja fontove, boje i metapodatke tačno onakvim kakvi su bili, pa validirajte izlaz pomoću alata veraPDF pre nego što mu verujete. Kada se forma prebaci na AcroForm stranu, njeno ponašanje dobija sopstveni skup kontrola. JavaScript okidači, akcije slanja i skripte za validaciju pokriveni su u članku o HotPDF AcroForm poljima i akcijama.
Registracija XFA, konverzija i API-ji forme koji su ovde prikazani dolaze sa HotPDF komponentom za Delphi i C++Builder, čija dokumentacija prati razvoj funkcija XFA kroz novija izdanja.