losLab PDF Library prenosi podatke obrazaca u i iz PDF-a na tri različita načina: FDF i XFDF za vrijednosti polja AcroForm-a, ista ta dva formata za komentare bilješki te cijeli XFA XDP paket zapisan izravno u obrazac. ExportFormDataToXFDF, ImportFormDataFromXFDF, ImportAnnotationsFromFDF, ExportAnnotationsToXFDF i SetXFAFromString su ulazne točke, a svaka od njih ima inačicu za datoteku i inačicu za niz znakova
Razlog za postojanje toliko mnogo metoda je taj što podaci PDF obrazaca nisu jednoznačni. Popunjeni AcroForm ima vrijednosti polja, može sadržavati i komentare pregleda, a naslijeđeni XFA obrazac ugrađuje cijeli XML opis aplikacije koji nema nikakve veze ni s jednim od toga. losLab PDF Library namjerno drži ta tri zadatka na zasebnim API-jima, jer bi njihovo spajanje nametnulo pogrešan model podataka na barem dva od njih. Odluka o tome koja vam obitelj metoda treba je prvi korak u dizajnu, a obično se donosi onog trenutka kada saznate što točno prima sustav s druge strane
Koja je razlika između FDF, XFDF i XFA podataka obrazaca?
FDF i XFDF nose iste podatke u dvije različite sintakse, a XFA je zaseban svijet. FDF je minijaturni dokument u PDF sintaksi (ISO 32000-2 §12.7.8): niz /Fields koji se sastoji od rječnika << /T (ime) /V (vrijednost) >>, sa znakovima izbjegnutim (escaped) točno onako kako se doslovni nizovi znakova izbjegavaju unutar PDF-a. XFDF is XML oblik istih podataka (ISO 19444), stablo <fields> koje Acrobat i većina pozadinskih sustava obrazaca čitaju i zapisuju izvorno. XFA nije ni jedno ni drugo: to je predložak XML Forms Architecture zajedno sa svojim podacima, pohranjen kao XML Data Package (XDP) na koji se PDF referencira iz /AcroForm/XFA. Odaberite FDF ili XFDF kada radite s vrijednostima polja, a za XFA posegnite samo kada održavate dokument koji je izvorno izrađen kao XFA obrazac
Unutar FDF-a i XFDF-a, losLab PDF Library povlači drugu liniju: vrijednosti polja nasuprot komentarima bilješki. Obitelj metoda za podatke obrazaca (ExportFormDataToFDF, ImportFormDataFromFDF, ExportFormDataToXFDF, ImportFormDataFromXFDF) čita i zapisuje podstablo /Fields i ne dira ništa drugo. Obitelj metoda za bilješke (ExportAnnotationsToFDF, ImportAnnotationsFromFDF, ExportAnnotationsToXFDF, ImportAnnotationsFromXFDF) umjesto toga čita i zapisuje podstablo /Annots, što je ono na što Acrobat misli pod Export Comments. To se dvoje nikada ne preklapa, tako da izvoz vrijednosti polja neće pokupiti zalutale bilješke o pregledu, a uvoz komentara neće poremetiti vrijednosti koje je korisnik već upisao. Ono što kontrola (widget) radi kada se na nju klikne ili kada se ponovno izračuna je treća stvar, koja je obrađena u popratnoj bilješci o interaktivnim radnjama obrazaca i JavaScriptu
Kako popuniti PDF obrazac iz FDF-a ili XFDF-a u Delphiju?
Učitajte dokument, pozovite jednu metodu uvoza i spremite. ImportFormDataFromXFDF i ImportFormDataFromFDF analiziraju dolazne podatke obrasca, povezuju svaki unos s poljem AcroForm-a prema njegovu punom nazivu, postavijaju vrijednost i vraćaju broj stvarno ažuriranih polja. Obje metode ažuriraju samo polja koja već postoje u ciljnom PDF-u; niti jedna ne stvara polje za naziv koji obrazac ne definira, što sprječava da zalutala ili zlonamjerna podatkovna datoteka potajno proširi vaš obrazac
Dva detalja odlučuju o tome hoće li netrivijalni podaci preživjeti put. Prvi je izbjegavanje znakova (escaping): FDF pohranjuje vrijednosti kao PDF doslovne nizove znakova, tako da vrijednost koja sadrži zagradu, obrnutu kosu crtu ili neispisivi bajt dolazi omotana u oktalno izbjegavanje definirano u ISO 32000-2 §7.3.4.2, a losLab PDF Library poništava to izbjegavanje pri uvozu kako bi se zagrade i kose crte vratile kao doslovni znakovi koje je korisnik upisao. Drugi je kodiranje: metode temeljene na datotekama zapisuju i čitaju XFDF i FDF kao UTF-8, što je ono što deklaracija XFDF obećava i što je svakoj ne-ASCII vrijednosti polja (ime s dijakritičkim znakovima, simbol valute, CJK adresa) potrebno kako bi prošla kroz proces bez oštećenja. Ako sami gradite XFDF, deklarirajte UTF-8 i pišite UTF-8, i uvoz će proći bez problema
Hijerarhijska polja, odabiri s više vrijednosti i obogaćeni tekst
Hijerarhijski nazivi polja prvo su mjesto gdje jednostavan izvoznik zakazuje. AcroForm se obraća ugniježđenom polju s točkastim punim nazivom kao što je Applicant.FullName, ali XFDF ne stavlja taj točkasti niz znakova u jedan atribut name; ISO 19444 ga ugnježđuje, kao <field name="Applicant"><field name="FullName">. losLab PDF Library dijeli točkasti naziv na ugniježđene elemente <field> pri izvozu i ponovno sastavlja ugniježđene elemente natrag u puni naziv pri uvozu, tako da oba smjera ostaju simetrična. Pri izvozu također preskače ne-terminalna roditeljska polja, jer roditeljski čvor u AcroForm-u nosi samo razinu imenovanja i nema vlastitu vrijednost; njegovo ispisivanje stvorilo bi prazan <value></value> koji ne odgovara stvarnom obrascu. Okviri popisa s višestrukim odabirom druga su zamka: polje izbora može sadržavati nekoliko odabranih vrijednosti odjednom, što XFDF izražava kao ponovljene elemente <value>, a FDF kao /V niz, a losLab PDF Library dijeli polje na više vrijednosti samo kada je riječ o stvarnom višestrukom odabiru, pa obično višeredno tekstualno polje zadržava svoje prijelome redaka umjesto da se pretvori u lažne vrijednosti
Obogaćeni tekst je treća i najčešća pogreška. Polje s oblikovanjem pohranjuje svoje označavanje u unosu RV kao XHTML podstablo, a XFDF ga prenosi u <value-richtext>. losLab PDF Library zapisuje to podstablo kao stvarni XML fragment umjesto da ga izbjegava (escape), tako da nizvodni alat čita pravi obogaćeni tekst umjesto niza vidljivih oznaka; pri uvozu čuva sirovo podstablo RV i dalje primjenjuje obični <value> na V. Kada polje nudi oboje, obična vrijednost pobjeđuje za V, a obogaćeni tekst ide uz nju u RV, što je pravilo interoperabilnosti koje sprječava da uvoz obogaćenog teksta tiho prepiše vrijednost koju je drugi alat već postavio. Kada vaš obogaćeni tekst postoji radi prijenosa strukture dokumenta pomoćnoj tehnologiji, tretirajte ga na isti način na koji biste tretirali redoslijed čitanja o kojem se raspravlja u bilješci o označenom PDF-u i strukturi pristupačnosti
Kako prenijeti komentare bilješki natrag i naprijed kao FDF ili XFDF?
Komentari putuju kroz obitelj metoda za bilješke, a podržani podskup je namjerno malen. ExportAnnotationsToXFDF i ImportAnnotationsFromXFDF, zajedno sa svojim FDF pandanima, prenose tekstualno označavanje s poljima koja doista prolaze kroz dvosmjerni proces bez problema: podtip bilješke, njezin pravokutnik, njezin indeks stranice koji počinje od 0, autor u T, predmet u Subj, običan sadržaj Contents i boja, koja mapira PDF-ov DeviceRGB trojac /C u i iz XFDF atributa #RRGGBB. Uvoz prihvaća samo poznate nazive elemenata i preskače svaki unos čija je stranica izvan raspona ili čiji pravokutnik nedostaje, tako da ručno uređeni ili strani XFDF ne može ubaciti neispravnu bilješku u dokument. Ono što ovaj podskup još ne prenosi vrijedi jasno reći: sadržaj obogaćenog teksta (RC), skočni prozori (popups), quadpoints, popisi tinte (ink lists), vrhovi (vertices) i ugrađeni tokovi izgleda (appearance streams) trenutačno su izvan opsega, tako da geometrija isticanja i prilagođeni izgledi pečata neće preživjeti ovaj put. Da biste potvrdili što je stvarno uvezeno, prođite kroz bilješke na stranici ili šire stablo elemenata obrađeno u pretraživanju teksta i nabrajanju elemenata stranice
Zapisivanje cijelog XFA XDP paketa pomoću SetXFAFromString
XFA je iznimka, a SetXFAFromString je način na koji zapisujete cijeli paket odjednom. Metoda prima potpuni XML Data Package, dokument <xdp:xdp> sa svojim predlošcima i paketima skupova podataka, te ga pohranjuje kao tok na koji se referencira iz /AcroForm/XFA. losLab PDF Library stvara AcroForm spremnik na zahtjev kada ga dokument nema, tako da ne morate dodavati privremeno polje samo da biste imali kamo smjestiti XFA, i odbacuje svako analizirano XFA stanje koje je držao kako bi kasnije čitanje odražavalo paket koji ste upravo zapisali umjesto zastarjele priručne memorije. Budući da je XFA paket XML i nije nužno UTF-8, knjižnica otkriva UTF-16 oznaku redoslijeda bajtova (BOM) i ispravno dekodira paket prije analize, što je važno za pakete koje proizvode alati koji zadano koriste UTF-16
Nakon što je paket na mjestu, GetXFAFormFieldValue i SetXFAFormFieldValue pristupaju pojedinačnim poljima putem njihove staze Scripting Object Model. losLab PDF Library prihvaća standardne SOM korijene kao i gole relativne staze, pa se form1.FullName, $data.form1.FullName i xfa.datasets.data.form1.FullName svi razrješavaju na isti podatkovni čvor, a strana predloška prihvaća $template i xfa.template na isti način. Ta je tolerancija važna kada SOM staze generira drugi sustav koji uvijek ispisuje puni naziv
var
Lib: TPDFlib;
const
Xdp =
'<?xml version="1.0" encoding="UTF-8"?>' +
'<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">' +
' <template xmlns="http://www.xfa.org/schema/xfa-template/3.3/">' +
' <subform name="form1">' +
' <field name="FullName"><ui><textEdit/></ui></field>' +
' </subform>' +
' </template>' +
' <xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">' +
' <xfa:data><form1><FullName>Alice Example</FullName></form1></xfa:data>' +
' </xfa:datasets>' +
'</xdp:xdp>';
begin
Lib := TPDFlib.Create;
try
Lib.SetXFAFromString(Xdp, 0); // creates the AcroForm container if none exists
// read back through the data DOM with an SOM path
if Lib.GetXFAFormFieldValue('form1.FullName') = 'Alice Example' then
Lib.SetXFAFormFieldValue('form1.FullName', 'Bob Example');
Lib.SaveToFile('xfa-packet.pdf');
finally
Lib.Free;
end;
end;
Iskreni sažetak je da vrijednosti polja u potpunosti prolaze kroz dvosmjerni proces kroz FDF i XFDF, uključujući hijerarhiju, višestruki odabir i obogaćeni tekst; komentari bilješki prolaze kroz proces kao definirani podskup tekstualnog označavanja s jasnim prazninama; a XFA se zapisuje i čita kao cijeli paket s pristupom putem SOM staza na razini pojedinog polja na vrhu. Uskladite format s primateljem, deklarirajte UTF-8 za sve što sami gradite i zapamtite da metode uvoza dodiruju samo polja i bilješke koje već odgovaraju dokumentu. Ovdje opisane metode za podatke obrazaca, bilješke i XFA dio su losLab PDF Library za Delphi i C++Builder, čija referentna dokumentacija sadrži potpuni popis parametara za svaku ulaznu točku izvoza i uvoza