losLab PDF biblioteka perkelia formos duomenis į PDF ir iš jo trimis skirtingais būdais: FDF ir XFDF „AcroForm“ laukų reikšmėms, tie patys du formatai anotacijų komentarams ir visas XFA XDP paketas, įrašomas tiesiai į formą. ExportFormDataToXFDF, ImportFormDataFromXFDF, ImportAnnotationsFromFDF, ExportAnnotationsToXFDF ir SetXFAFromString yra įėjimo taškai, ir kiekvienas iš jų turi failo variantą bei eilutės variantą
Priežastis, kodėl yra tiek daug metodų, yra ta, kad PDF formos duomenys nėra vienalytis dalykas. Užpildyta „AcroForm“ turi laukų reikšmes, ji taip pat gali turėti peržiūros komentarus, o pasenusi XFA forma įterpia visą XML programos aprašymą, kuris neturi nieko bendra su nei vienu iš jų. losLab PDF biblioteka šiuos tris klausimus sąmoningai laiko atskiruose API, nes juos sujungus bent dviem iš jūrų būtų primestas neteisingas duomenų modelis. Nuspręsti, kurios šeimos jums reikia, yra pirmasis projektavimo žingsnis, ir jis paprastai išsprendžiamas tą akimirką, kai sužinote, ką iš tikrųjų priima kitoje pusėje esanti sistema
Kuo skiriasi FDF, XFDF ir XFA formų duomenys?
FDF ir XFDF perneša tą pačią informaciją dviem skirtingomis sintaksėmis, o XFA yra atskiras pasaulis. FDF yra miniatiūrinis PDF sintaksės dokumentas (ISO 32000-2 §12.7.8): /Fields masyvas iš << /T (pavadinimas) /V (reikšmė) >> žodynų, su ekrano simboliais tiksliai taip pat, jak ir literal eilutės PDF viduje. XFDF yra XML to paties duomenų formato forma (ISO 19444), <fields> medis, kurį „Acrobat“ ir dauguma formų galinių programų nuskaito ir įrašo vietiniu būdu. XFA nėra nei vienas, nei kitas: tai „XML Forms Architecture“ šablonas su duomenimis, saugomas kaip „XML Data Package“ (XDP), į kurį PDF nurodo iš /AcroForm/XFA. Pasirinkite FDF arba XFDF, kai keičiatės laukų reikšmėmis, ir naudokite XFA tik tada, kai palaikote dokumentą, kuris iš pradžių buvo sukurtas kaip XFA forma
FDF ir XFDF ribose „losLab PDF Library“ nubrėžia antrąją liniją: laukų reikšmės prieš anotacijų komentarus. Formos duomenų šeima (ExportFormDataToFDF, ImportFormDataFromFDF, ExportFormDataToXFDF, ImportFormDataFromXFDF) skaito ir rašo /Fields pamedį ir nieko kito neliečia. Anotacijų šeima (ExportAnnotationsToFDF, ImportAnnotationsFromFDF, ExportAnnotationsToXFDF, ImportAnnotationsFromXFDF) vietoj to skaito ir rašo /Annots pamedį, kas „Acrobat“ programoje vadinama „Export Comments“. Šie du niekada nepersidengia, todėl eksportuojant laukų reikšmes nebus įtraukti nuklydę peržiūros užrašai, o importuojant komentarus nebus sutrikdytos reikšmės, kurias vartotojas jau įvedė. Tai, ką valdiklis (widget) daro jį spustelėjus ar perskaičiavus, yra visiškai trečias klausimas, aprašytas susijusiame straipsnyje apie interaktyvius formos veiksmus ir „JavaScript“
Kaip užpildyti PDF formą iš FDF arba XFDF Delphi aplinkoje?
Įkelkite dokumentą, iškvieskite vieną importavimo metodą ir išsaugokite. ImportFormDataFromXFDF ir ImportFormDataFromFDF išanalizuoja gaunamus formos duomenis, pagal pilną pavadinimą suderina kiekvieną įrašą su „AcroForm“ lauku, nustato reikšmę ir grąžina faktiškai atnaujintų laukų skaičių. Abu metodai atnaujina tik tuos laukus, kurie jau egzistuoja tiksliniame PDF; nei vienas iš jų nesukuria lauko pavadinimui, kurio forma neapibrėžia, o tai apsaugo nuo to, kad nuklydęs ar kenksmingas duomenų failas tyliai nepakeistų jūsų formos sudėties
Dvi detalės nusprendžia, ar sudėtingesni duomenys išgyvens šią kelionę. Pirmoji yra simbolių apsauga (escaping): FDF reikšmes saugo kaip PDF literal eilutes, so reikšmė, kurioje yra skliaustelis, atvirkštinis brūkšnys arba nespausdinamas baitas, atkeliauja supakuota aštuntainiu formatu, apibrėžtu ISO 32000-2 §7.3.4.2, o „losLab PDF Library“ importo metu šią apsaugą panaikina, kad skliausteliai ir brūkšniai sugrįžtų kaip literal simboliai, kuriuos įvedė vartotojas. Antroji yra kodavimas: failais pagrįsti metodai rašo ir skaito XFDF bei FDF kaip UTF-8, o tai yra tai, ką žada XFDF deklaracija ir ko reikia bet kuriai ne ASCII lauko reikšmei (vardui su diakritiniais ženklais, visiškai nemokamai valiutos simboliui, CJK adresui), kad ji būtų perkelta be sugadinimo. Jei patys kuriate XFDF, deklaruokite UTF-8 ir rašykite UTF-8, ir importas veiks sėkmingai
Hierarchiniai laukai, daugiareikšmiai pasirinkimai ir formatuotas tekstas (rich text)
Hierarchiniai laukų pavadinimai yra pirmoji vieta, kur suklumpa paprastas eksportuotojas. „AcroForm“ kreipiasi į įterptą lauką su taškais atskirtu pilnu pavadinimu, pavyzdžiui, Applicant.FullName, tačiau XFDF nededa tos taškais atskirtos eilutės į vieną vardo atributą; ISO 19444 jį įterpia kaip <field name="Applicant"><field name="FullName">. losLab PDF biblioteka eksportuojant padalija taškais atskirtą pavadinimą į įterptus <field> elementus, o importuojant vėl sujungia įterptus elementus atgal į pilną pavadinimą, todėl abi kryptys išlieka simetriškos. Eksportuojant ji taip pat praleidžia ne galinius tėvinius laukus, nes tėvinis mazgas „AcroForm“ sistemoje turi tik pavadinimo lygį ir neturi savo reikšmės; jį išvedus būtų sukurtas tuščias <value></value>, kuris neatitinka tikrosios formos. Daugiareikšmio pasirinkimo sąrašai yra antroji spąstų vieta: pasirinkimo laukas gali turėti kelias pasirinktas reikšmes vienu metu, ką XFDF išreiškia pasikartojančiais <value> elementais, o FDF — /V masyvu, ir losLab PDF biblioteka padalija lauką į kelias reikšmes tik tada, kai tai tikrai yra daugiareikšmio pasirinkimo laukas, todėl įprastas kelių eilučių tekstinis laukas išlaiko savo eilučių lūžius, užuot suskaidytas į netikras reikšmes
Formatuotas tekstas (rich text) yra trečioji dalis, ir tai yra ta vieta, kur žmonės klysta dažniausiai. Laukas su formatavimu savo žymėjimą saugo RV įraše kaip XHTML pamedį, o XFDF jį perneša <value-richtext>. losLab PDF biblioteka rašo šį pamedį kaip gyvą XML fragmentą, užuot jį apsaugojusi ekrano simboliais, todėl tolimesnė priemonė nuskaito tikrą formatuotą tekstą, o ne matomų žymų eilutę; importuojant ji išsaugo neapdorotą RV pamedį ir vis tiek pritaiko paprastą <value> laukui V. Kai laukas siūlo abu, paprasta reikšmė laimi laukui V, o formatuotas tekstas keliauja kartu RV, o tai yra suderinamumo taisyklė, neleidžianti formatuoto teksto importui tyliai perrašyti reikšmės, kurią kita priemonė jau nustatė. Kai jūsų formatuotas tekstas yra skirtas perduoti dokumento struktūrą pagalbinėms technologijoms, elkitės su juo taip pat, kaip elgtumėtės su skaitymo tvarka, aptarta pastaboje apie pažymėtą PDF ir prieinamumo struktūrą
Kaip perkelti anotacijų komentarus pirmyn ir atgal kaip FDF arba XFDF?
Komentarai keliauja anotacijų šeimoje, o palaikomas poaibis yra sąmoningai mažas. ExportAnnotationsToXFDF ir ImportAnnotationsFromXFDF, kartu su jų FDF atitikmenimis, perneša tekstinio stiliaus žymėjimą su laukais, kurie iš tikrųjų sėkmingai juda pirmyn ir atgal: anotacijos potipį, jos stačiakampį, jos 0 pagrindu veikiantį puslapio indeksą, autorių lauke T, temą lauke Subj, paprastą Contents ir spalvą, kuri susieja PDF /C DeviceRGB trejetą su XFDF #RRGGBB atributu ir atvirkščiai. Importavimas priima tik žinomus elementų pavadinimus ir praleidžia bet kokį įrašą, kurio puslapis yra už diapazono ribų arba kurio stačiakampio trūksta, todėl rankiniu būdu redaguotas arba svetimas XFDF negali įterpti sugadintos anotacijos į dokumentą. Verta aiškiai įvardyti tai, ko poaibis dar neperneša: formatuoto teksto turinys (RC), iškylantieji langai, keturkampiai, rašalo sąrašai, viršūnės ir iš anksto sugeneruoti išvaizdos srautai šiuo metu nepatenka į taikymo sritį, todėl paryškinimo geometrija ir pasirinktinės antspaudų išvaizdos šio kelio neišgyvens. Norėdami patikrinti, kas iš tikrųjų buvo įkelta, eikite per puslapio anotacijas arba platesnį elementų medį, aprašytą skyriuje teksto paieška ir puslapio elementų išvardijimas
var
Src, Dest: TPDFlib;
Xfdf: WideString;
begin
Src := TPDFlib.Create;
Dest := TPDFlib.Create;
try
Src.LoadFromFile('reviewed.pdf', '');
Xfdf := Src.ExportAnnotationsToXFDFString; // <annots> subset only
Dest.LoadFromFile('clean-copy.pdf', ''); // pages must line up by index
Dest.ImportAnnotationsFromXFDFString(Xfdf);
Dest.SaveToFile('clean-copy-commented.pdf');
finally
Dest.Free;
Src.Free;
end;
end;
Pilno XFA XDP paketo rašymas naudojant SetXFAFromString
XFA yra išskirtinis atvejis, ir SetXFAFromString yra būdas įrašyti viską iš karto. Metodas priima pilną XML duomenų paketą, <xdp:xdp> dokumentą su jo šablono ir duomenų rinkinių paketais, ir išsaugo jį kaip srautą, į kurį nurodo /AcroForm/XFA. losLab PDF biblioteka sukuria „AcroForm“ konteinerį pagal poreikį, kai dokumentas jo neturi, todėl jums nereikia pridėti nereikalingo lauko tik tam, kad XFA turėtų kur prisikabinti, ir ji atmeta bet kokią išanalizuotą XFA būseną, kurią turėjo, kad vėlesnis skaitymas atspindėtų paketą, kurį ką tik įrašėte, o ne pasenusią talpyklą. Kadangi XFA paketas yra XML ir nebūtinai UTF-8, biblioteka aptinka UTF-16 baitų tvarkos žymę ir teisingai iškoduoja paketą prieš analizuodama, o tai svarbu paketams, sukurtiems įrankiais, kurių numatytasis nustatymas yra UTF-16
Kai paketas yra vietoje, GetXFAFormFieldValue ir SetXFAFormFieldValue kreipiasi į atskirus laukus per jų Scripting Object Model kelią. losLab PDF biblioteka priima standartines SOM šaknis bei paprastus santykinius kelius, todėl form1.FullName, $data.form1.FullName ir xfa.datasets.data.form1.FullName visi nurodo tą patį duomenų mazgą, o šablono pusė taip pat priima $template ir xfa.template. Ši tolerancija yra svarbi, kai SOM kelius generuoja kita sistema, kuri visada išveda pilną pavadinimą
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;
Sąžininga santrauka
Sąžininga santrauka yra ta, kad laukų reikšmės visiškai juda pirmyn ir atgal per FDF ir XFDF, įskaitant hierarchiją, daugkartinį pasirinkimą ir formatuotą tekstą; anotacijų komentarai keliauja kaip apibrėžtas tekstinio žymėjimo poaibis su aiškiomis spragomis; o XFA yra įrašomas ir skaitomas kaip visas paketas su papildoma prieiga prie kiekvieno lauko per SOM. Suderinkite formatą su vartotoju, deklaruokite UTF-8 viskam, ką kuriate rankiniu būdu, ir prisiminkite, kad importavimo metodai liečia tik laukų ir anotacijų, kurios jau atitinka dokumentą, importavimą. Čia aprašyti formos duomenų, anotacijų ir XFA metodai yra losLab PDF Library, skirtos Delphi ir C++Builder, dalis, kurios žinyne pateikiamas visas kiekvieno eksporto ir importo įėjimo taško parametrų sąrašas