Tehnički članak

XFA u AcroForm izravnavanje u Delphiju koristeći HotPDF

Dva obrasca mogu nositi ista polja a da se uopće ne ponašaju ni približno slično. AcroForm zadržava svoja polja kao najobičnije PDF objekte smještene povrh onog stvarnog sadržaja same stranice, pa ga stoga i baš svaki usklađeni čitač uredno i iscrtava. Dinamički XFA obrazac ne zadržava gotovo ništa kao PDF: sama polja, raspored, pa čak i geometrija stranice žive u jednom XML paketu, a vidljive stranice pri otvaranju u stvarnom vremenu generira pogonski mehanizam za raspored kojeg je u širokoj primjeni dosad uspio isporučiti samo Adobe. Proslijedite li takvu datoteku kakvom web pregledniku, alatu za renderiranje arhiva ili pak programu za izdvajanje teksta, obrazac jednostavno nećete ni dobiti. Dobit ćete samo jednu jedinu sivu stranicu na kojoj piše "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." ("Molimo pričekajte... Ako se ova poruka na kraju ne zamijeni odgovarajućim sadržajem dokumenta, vaš PDF preglednik možda ne može prikazati ovu vrstu dokumenta."). Svatko onaj tko se susreo s probavljanjem vladine ili osiguravajuće papirologije ovakvu će stranicu bez problema znati prepoznati na prvu

Rezervirano mjesto (placeholder) nije nekakva pogreška (corruption). To je točno ono što ovaj format precizira da bi se u tom trenutku i trebalo dogoditi u odsustvu i izostanku nekog XFA procesora, a što po onom stanju od 2026. godine obuhvaća gotovo pa i baš svaki onaj preglednik izuzev samog stolnog Acrobata. Tako da praktičan potez ovdje predstavlja baš konverzija ovakvog dinamičkog obrasca u nekakav onaj uobičajeniji po vrsti čisti i ravan AcroForm prije njegovog dolaska na kakvu mu god nizvodnu lokaciju. HotPDF, ta losLab PDF biblioteka za Delphi i C++Builder aplikacije, vrši taj zahvat same pretvorbe na programskoj razini unutar samog koda tako na taj način iznova obnavljajući dotični XML obrazac pretvarajući to sve potom skupa samo u nekakva izvorna polja na pripadajućim mu isto izvornim stranicama

Zašto ta dva modela ne mogu koegzistirati

AcroForm definiran je u sklopu specifikacije ISO 32000-1 §12.7. Svako polje je i sam zaseban PDF objekt unutar kojeg obitava widget oznaka i onaj jedan niz izgleda (appearance stream), stranica predstavlja autentični PDF sadržaj, a s njome se potom onda povrh svega i podaci tako isto i poslužuju. XFA u pravilu stoji sasvim dijametralno tom: obrazac je prije svega XML dokument sa samo u tom vidu pohranjenim jednim XDP paketom baš unutar za njega ostavljenog onog pri dodijeljenom mu /XFA upisu na razini AcroForm rječnika, pa i usput same PDF stranice kod jedne dinamične forme tada jedino u sebi čuvaju i drže tog za takve to rezervirano im namješteno pa usput jedino samo još to uz nju mu dodijeljeno joj baš tek "Please wait" mjesto i ništa joj to u tom više osim s toga na njoj to tu dodano istom baš tu, budući da stvarni sadržaj nikada u suštini ni po naravi isto onda pa to a s nije niti do bio serijaliziran kao onom PDF ispisu to to takvo usput. Čitač obradi datoteku kao jedan ili drugi model. Ignoriranje /XFA upisa i vidjet ćete praznu ljušturu; uvažavanje bez XFA mehanizma i vidjet ćete upozorenje. ISO 32000-2 okončao je raspravu izbacivanjem XFA iz PDF 2.0, što je glavni razlog zašto se "konverzija dok još uvijek možemo" pretvorila iz graničnog slučaja u rutinsku politiku prihvaćanja

Prije konverzije bilo čega, klasificirajte to, jer ne pokazuje svaka XFA datoteka rezervirano mjesto. Statični XFA obrasci isporučuju unaprijed renderirane PDF stranice pokraj XML-a, tako da se prikazuju svugdje i loše se ponašaju samo kada su ispunjeni. Dinamični obrasci isporučuju samo rezervirano mjesto i neupotrebljivi su dok ne budu pretvoreni. Ono čemu trebate vjerovati jest dokument, nikada ekstenzija ili pošiljatelj. Datoteka koja renderira stvarni sadržaj u pregledniku koji nije od Adobea, ali i dalje nosi upis za /XFA jest statična ili hibridna; datoteka koja prikazuje stranicu upozorenja jest dinamična. Zabilježite u koju kantu je svaka ulazna datoteka sletjela. Ove dvije vrste se kvare na različite načine kasnije, i tiket o praznom arhiviranom obrascu se zatvara u sekundama kada ulazni dnevnik već ispisuje "dynamic XFA, converted, 47 fields mapped, 2 warnings" (dinamički XFA, pretvoren, 47 preslikanih polja, 2 upozorenja)

Pretvaranje učitanog XFA dokumenta u nativna polja

Konverzija se izvršava na dokumentu koji se već nalazi u memoriji. FlattenLoadedXFA analizira XFA predložak te njegove pakete podataka, polaže obrazac, te ga nanovo obnavlja u obliku nativnih 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 vrijednost i lista upozorenja predstavljaju stvarni izlaz, a ne buku pri otklanjanju grešaka, pa zadržite oboje. Konverzija gubi informacije po svojoj prirodi: XFA skriptiranje, izračunata polja, i ponašanje dinamičnih pod-obrazaca nemaju AcroForm ekvivalent, a XFAFlattenWarnings imenuje svaki element predloška koji se nije preslikao. Ako arhivirate pretvorenu datoteku bez njezine liste upozorenja, jednog dana ćete zuriti u praznu kućicu sa zbrojevima u arhiviranoj kopiji bez zapisa o tome zašto se to dogodilo. Zastavica Editable kontrolira hoće li nova polja ostati popunjiva. Proslijedite True kada ljudi i dalje rade s obrascem nakon toga, i zaključajte vrijednosti kada je cilj zamrznut zapis

Provjera konverzije je djelomično vizualna, a djelomično strukturalna, i trebaju vam obje polovice. Strukturalna polovica je laka: potvrdite da broj polja odgovara MappedCount. Vizualna polovica je ona koja hvata stvarnu štetu. Otvorite izvorni obrazac u stolnom Acrobatu, i dalje jedinom pregledniku koji pokreće XFA mehanizam, pokraj pretvorene datoteke u običnom čitaču, i usporedite vrijednosti i raspored na barem jednom ispunjenom uzorku po predlošku. Datum koji je XFA mehanizam prikazao kao 2026-06-11 može sletjeti u AcroForm kopiju kao sirova, neformatirana vrijednost, i samo će to vaše oči uloviti

Kada je ulaz jedan XDP paket

Ne počinje svaki posao sa ispunjenog PDF-a. Ponekad ćete dobiti XDP paket sam po sebe, izvezen iz alata za dizajniranje obrasca ili predan od strane partnerskog sustava. ApplyXFAAsAcroForm izostavlja korak učitavanja i primjenjuje paket izravno na trenutni dokument:

XDPBytes := TFile.ReadAllBytes('benefit-claim.xdp');
MappedCount := Pdf.ApplyXFAAsAcroForm(XDPBytes, True);

Ista ta grupa poziva također radi i u drugom smjeru, za rjeđi slučaj u kojem morate emitirati XFA umjesto konzumirati ga. AddXFAPacket prilaže pojedinačne imenovane pakete kao što su 'xdp' ili 'config'. SetXFADocument instalira kompletan jednotočni teret u jednom pozivu. ClearXFAPackets briše registraciju kako biste mogli započeti ispočetka, i AddXFASignaturePacket ugrađuje XAdES materijal za radne procese koji izravno potpisuju podatke XML obrasca. Proizvodnja XFA u 2026. godini je nišna potreba, gotovo uvijek prisiljena od strane jednog naslijeđenog potrošača koji odbija sve ostalo, ali kada ugovor izričito navodi, ovi pozivi svode to na izbor konfiguracije umjesto zasebnog alata

Drugo značenje od "spljošti/izravnaj"

Riječ "flatten" (spljoštiti/izravnati) spotiče mnogo razgovora, jer ona potpuno imenuje drugu operaciju: spaljivanje izgleda AcroForm polja u tok sadržaja stranice dok više ne ostane interaktivnih objekata. HotPDF danas nema API za to, i želite to znati sada, a ne na pola projekta. Ono što vam biblioteka daje umjesto toga je zaključavanje na razini polja kada je polje stvoreno, 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 jasni o tome što vam to donosi a što ne donosi. Read-only (samo za čitanje) polje je i dalje objekt obrasca. Ono se pojavljuje u panelu za polja u pregledniku, njegova vrijednost je čitljiva kroz API obrasca, i alat koji ponovno ispisuje datoteku može ponovno očistiti read-only zastavicu. Zastavice dozvola podižu letvicu ali ovise o tome hoće li preglednik odabrati da ih poštuje, ograničenje koje ISO 32000-1 navodi sasvim jasno. Kada regulator inzistira da arhivirani zapis uopće ne sadrži nikakve objekte obrasca, iskren odgovor uz HotPDF danas jest ponovna izgradnja dokumenta: pročitajte vrijednosti, zatim ih nacrtajte kao običan TextOut sadržaj na svježoj stranici, umjesto da maskirate zastavice read-only kao izravnavanje. Jedna stvar koju trebate zapamtiti na ruti dozvola je da CryptKeyLength mora biti postavljen prije BeginDoc; ostatak je u našem članku o AES-256 enkripciji i dozvolama

Što XFA znači za arhivsku usklađenost

PDF/A i PDF/X oboje izravno odbijaju XFA. Cjevovod koji hrani ISO 19005 arhivu stoga mora prvo pretvoriti, i redoslijed nije predmet pregovora: učitati, FlattenLoadedXFA, spremiti, zatim pokrenuti generiranje arhiva ili validaciju na rezultatu AcroForm-a. Ne tretirajte konverziju kao dokaz usklađenosti. Ono popravlja model obrasca i ostavlja fonte, boje, i metapodatke točno onakvima kakvi su bili, stoga validirajte izlaz uz veraPDF prije nego mu povjerujete. Jednom kada obrazac bude na strani AcroForm-a, njegovo ponašanje dobiva svoj vlastiti skup kontrola. JavaScript okidači, akcije za podnošenje, i skripte za validaciju su pokriveni u našem članku o HotPDF AcroForm poljima i akcijama

Ovdje prikazani XFA registracija, konverzija, i API-ji obrazaca dolaze s HotPDF komponentom za Delphi i C++Builder, čija dokumentacija prati skup značajki XFA kako je rastao kroz nedavna izdanja