Tehnični članek

Izmenjava podatkov obrazcev FDF, XFDF in XFA v Delphi

losLab PDF Library premika podatke obrazcev v PDF in iz njega na tri različne načine: FDF in XFDF za vrednosti polj AcroForm, ta ista dva formata za komentarje opomb ter celoten paket XFA XDP, zapisan neposredno v obrazec. ExportFormDataToXFDF, ImportFormDataFromXFDF, ImportAnnotationsFromFDF, ExportAnnotationsToXFDF in SetXFAFromString so vstopne točke, vsaka od njih pa ima različico datoteke in različico niza

Razlog za toliko metod je v tem, da podatki obrazca PDF niso ena sama stvar. Izpolnjen AcroForm vsebuje vrednosti polj, lahko vsebuje tudi komentarje pregledov, dedovani obrazec XFA pa vgrajuje celoten XML opis aplikacije, ki nima nobene zveze z nobenim od njiju. losLab PDF Library namensko ohranja te tri zadeve na ločenih vmesnikih API, saj bi njihovo združevanje vsililo napačen podatkovni model vsaj dvema od njih. Odločitev, katero družino potrebujete, je prva izbira pri načrtovanju in se običajno reši v trenutku, ko veste, kaj sprejemni sistem na drugi strani dejansko porabi

Kakšna je razlika med podatki obrazcev FDF, XFDF in XFA?

FDF in XFDF prenašata iste informacije v dveh različnih sintaksah, XFA pa je ločen svet. FDF je dokument v miniaturni sintaksi PDF (ISO 32000-2 §12.7.8): polje /Fields slovarjev << /T (ime) /V (vrednost) >>, pri čemer so nizi ubežni natanko tako, kot so dobesedni nizi ubežni znotraj PDF. XFDF je različica XML istih podatkov (ISO 19444), drevo <fields>, ki ga Acrobat in večina zalednih sistemov obrazcev bereta in pišeta izvorno. XFA ni nič od tega: je predloga XML Forms Architecture in njeni podatki, shranjeni kot XML Data Package (XDP), na katerega se PDF sklicuje iz /AcroForm/XFA. Izberite FDF ali XFDF, ko sodelujete pri vrednostih polj, in posezite po XFA le takrat, ko vzdržujete dokument, ki je bil prvotno ustvarjen kot obrazec XFA

Znotraj FDF in XFDF vleče losLab PDF Library drugo črto: vrednosti polj nasproti komentarjem opomb. Družina podatkov obrazcev (ExportFormDataToFDF, ImportFormDataFromFDF, ExportFormDataToXFDF, ImportFormDataFromXFDF) bere in piše poddrevo /Fields in se ne dotika ničesar dregega. Družina opomb (ExportAnnotationsToFDF, ImportAnnotationsFromFDF, ExportAnnotationsToXFDF, ImportAnnotationsFromXFDF) namesto tega bere in piše poddrevo /Annots, kar Acrobat označuje kot Izvozi komentarje. Ti dve področji se nikoli ne prekrivata, zato izvoz vrednosti polj ne bo zajel naključnih opomb pregleda, uvoz komentarjev pa ne bo motil vrednosti, ki jih je uporabnik že vpisal. Kaj gradnik naredi, ko je kliknjen ali ponovno izračunan, pa je spet tretja skrb, ki jo obravnava spremna opomba o interaktivnih dejanjih obrazcev in JavaScriptu

Kako napolniti obrazec PDF iz FDF ali XFDF v Delphi?

Naložite dokument, pokličete eno uvozno metodo in shranite. ImportFormDataFromXFDF in ImportFormDataFromFDF vsak razčleni dohodne podatke obrazca, poveže vsak vnos s poljem AcroForm po njegovem polnem kvalificiranem imenu, nastavi vrednost in vrne število dejansko posodobljenih polj. Obe metodi posodobita le polja, ki že obstajajo v ciljnem PDF; nobena ne izumi polja za ime, ki ga obrazec ne določa, PC prepričuje, da bi naključna ali sovražna podatkovna datoteka tiho povečala vaš obrazec

Dve podrobnosti odločata o tem, ali netrivialni podatki preživijo pot. Prva je ubežnost: FDF shranjuje vrednosti kot dobesedne nize PDF, zato vrednost, ki vsebuje oklepaj, poševnico nazaj ali nenatisljiv bajt, pride ovita v osmiško ubežnost, določeno v ISO 32000-2 §7.3.4.2, losLab PDF Library pa to ubežnost pri uvozu obrne, tako da se oklepaji in poševnice vrnejo kot dobesedni znaki, ki jih je uporabnik vtipkal. Druga je kodiranje: metode na osnovi datotek pišejo in berejo XFDF and FDF kot UTF-8, kar je tisto, kar obljublja deklaracija XFDF in kar potrebuje katera koli vrednost polja, ki ni ASCII (naglašeno ime, valutni simbol, naslov CJK), da bi se prenesla brez poškodb. Če sami zgradite XFDF, deklarirajte UTF-8 in pišite UTF-8, in uvoz se bo strinjal z vami

Hierarhična polja, večvrednostne izbire in bogato besedilo

Hierarhična imena polj so prvo mesto, kjer se preprost izvoznik zlomi. AcroForm nagovarja gnezdeno polje s pikčastim polnim naslovom, kot je Applicant.FullName, vendar XFDF tega pikčastega niza ne postavi v en sam atribut name; ISO 19444 ga ugnezdi kot <field name="Applicant"><field name="FullName">. losLab PDF Library ob izvozu razdeli pikčasti naslov na gnezdena elementa <field> in gnezdena elementa ob uvozu ponovno sestavi v polni naslov, tako da obe smeri ostaneta simetrični. Pri izvozu preskoči tudi nekončna starševska polja, ker starševsko vozlišče v AcroForm prenaša le poimenovalno raven in nima lastne vrednosti; njegovega oddajanje bi povzročilo prazen <value></value>, ki se ne ujema z dejanskim obrazcem. Seznami z večkratno izbiro so druga past: izbirno polje lahko drži več izbranih vrednosti hkrati, kar XFDF izraža kot ponavljajoče se elemente <value>, FDF pa kot polje /V, losLab PDF Library pa razdeli polje na več vrednosti le takrat, ko gre resnično za večkratno izbiro, tako da navadno večvrstično besedilno polje ohrani svoje prelomne vrstice, namesto da bi se razletelo v napačne vrednosti

Bogato besedilo je tretje in tisto, pri katerem se ljudje najpogosteje zmotijo. Polje z oblikovanjem shranjuje svoje oznake v vnosu RV kot poddrevo XHTML, XFDF pa ga prenaša v <value-richtext>. losLab PDF Library piše to poddrevo kot živi fragment XML, namesto da bi ga ubežal, tako da zaledno orodje bere pravo bogato besedilo namesto niza vidnih oznak; pri uvozu ohrani surovo poddrevo RV in še vedno uveljavi navadno <value> za V. Kjer polje ponuja oboje, navadna vrednost zmaga za V, bogato besedilo pa potuje zraven v RV, kar je pravilo za interoperabilnost, ki preprečuje, da bi uvoz bogatega besedila tiho prepisal vrednost, ki jo je drugo orodje že nastavilo. Če vaše bogato besedilo obstaja zato, da bi preneslo strukturo dokumenta podporni tehnologiji, ga obravnavajte enako kot vrstni red branja, obravnavan v opombi o označenem PDF in strukturi dostopnosti

Kako prenašati komentarje opomb v obe smeri kot FDF or XFDF?

Komentarji potujejo v družini opomb in podprta podmnožica je namerno majhna. ExportAnnotationsToXFDF in ImportAnnotationsFromXFDF s svojima ustreznikoma FDF prenašata besedilne oznake s polji, ki se dejansko čisto prenašajo v obe smeri: podtip opombe, njen pravokotnik, njen 0-indeksiran indeks strani, avtorja v T, zadevo v Subj, navadno vsebino Contents in barvo, ki preslika PDF-jevo trojico DeviceRGB /C v atribut XFDF #RRGGBB in iz njega. Uvoz sprejema le znana imena elementov in preskoči vsak vnos, katerega stran je izven dosega ali katerega pravokotnik manjka, tako da ročno urejen ali tuji XFDF ne more spustiti napačno oblikovane opombe v dokument. Tisto, česar podmnožica še ne prenaša, je vredno odkrito zapisati: bogate vsebine besedila (RC), pojavna okna, quadpointi, seznami črnil, oglišča in zapečeni tokovi videza so za zdaj izven obsega, zato geometrija poudarkov in videz žigov po meri ne bodo preživeli te poti. Da potrdite, kaj je dejansko prispelo, se sprehodite po opombah strani ali širšem drevesu elementov, zajetih v iskanju besedila in naštevanju elementov strani

Zapisovanje celotnega paketa XFA XDP s SetXFAFromString

XFA je izjemna vrednost in SetXFAFromString je način, kako zapisati celotno stvar naenkrat. Metoda vzame celoten XML Data Package, dokument <xdp:xdp> s predlogo in paketi podatkovnih nizov ter ga shrani kot tok, na katerega se sklicuje iz /AcroForm/XFA. losLab PDF Library ustvari vsebnik AcroForm na zahtevo, ko ga dokument nima, tako da vam ni treba dodati nepotrebnega polja le zato, da bi dali XFA mesto za obešanje, in zavrže vsako razčlenjeno stanje XFA, ki ga je hranil, tako da poznejše branje odraža paket, ki ste ga pravkar zapisali, namesto zastarelega predpomnilnika. Ker je paket XFA XML in ni nujno UTF-8, knjižnica zazna oznako vrstnega reda bajtov UTF-16 in pravilno dekodira paket pred razčlenjevanjem, kar je pomembno za pakete, ki jih ustvarijo orodja, ki privzeto uporabljajo UTF-16

Ko je paket na svojem mestu, GetXFAFormFieldValue in SetXFAFormFieldValue nagovarjata posamezna polja prek njihove poti Scripting Object Model. losLab PDF Library sprejema standardne korene SOM in tudi golo relativne poti, tako da se form1.FullName, $data.form1.FullName in xfa.datasets.data.form1.FullName vsi razrešijo v isto podatkovno vozlišče, stran s predlogo pa na enak način sprejema $template in xfa.template the same way. Ta toleranca je pomembna, ko poti SOM ustvari drug sistem, ki vedno oddaja polno kvalificirano obliko

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;

Iskren povzetek je, da se vrednosti polj v celoti prenašajo v obe smeri prek FDF in XFDF, vključno s hierarhijo, večkratno izbiro in bogatim besedilom; komentarji opomb potujejo kot določena podmnožica besedilnih oznak z jasnimi vrzelmi; in XFA se zapisuje in bere kot celoten paket z dostopom SOM na ravni posameznega polja na vrhu. Uskladite format s porabnikom, deklarirajte UTF-8 za vse, kar zgradite ročno, in ne pozabite, da se uvozne metode dotikajo le tistih polj in opomb, ki že ustrezajo dokumentu. Tukaj opisane metode za podatke obrazcev, opombe in XFA so del knjižnice losLab PDF Library za Delphi in C++Builder, katere referenca vsebuje celoten seznam parametrov za vsako vstopno točko izvoza in uvoza