Techninis straipsnis

PDF anotacijų importavimas ir eksportavimas kaip XFDF Delphi aplinkoje

HotPDF eksportuoja ir importuoja PDF anotacijas kaip XFDF per dvi funkcijas, kurios veikia su šiuo metu įkeltu dokumentu: ExportLoadedAnnotationsToXFDF ir ImportLoadedAnnotationsFromXFDF. XFDF yra XML anotacijų mainų formatas, standartizuotas kaip ISO 19444-1, ir ši pora leidžia Delphi arba C++Builder programai perduoti savo komentarus „Acrobat“ ar trečiosios šalies peržiūros įrankiui bei pasiimti pažymėtus rezultatus atgal, visiškai neperrašant puslapio turinio, ant kurio randasi anotacijos

Įsivaizduokite dvi kryptis, kurias tai išsprendžia. Peržiūrėtojas atidaro jūsų sugeneruotą ataskaitą programoje „Acrobat“, uždeda raudoną rodyklę ant netinkamai sulygiuotos figūros, apibrėžia neteisingą sumą bei įrašo pastabą paraštėje, o tada eksportuoja komentarus į nedidelį XFDF failą. Arba atvirkščiai: jūsų programa pati kuria žymas ir jums reikia jas nusiųsti kažkam, kieno įrankis nėra HotPDF. Bet kuriuo atveju anotacijos keliauja kaip XML, kurį supranta abi pusės, o PDF puslapiai išlieka baitas po baito tokie, kokie buvę

Kuo skiriasi FDF ir XFDF?

FDF ir XFDF perneša tuos pačius duomenis dviem skirtingomis sintaksėmis, ir šis skirtumas tampa svarbus tą akimirką, kai nusprendžiate, kurį failą perduoti kitam įrankiui. FDF yra senesnis formų duomenų formatas, apibrėžtas pačioje PDF specifikacijoje: jis naudoja PDF objektų sintaksę, todėl FDF failas atrodo kaip supaprastintas PDF ir jam perskaityti reikalingas PDF suprantantis analizatorius. XFDF yra XML tų pačių duomenų išraiška, nepriklausomai standartizuota kaip ISO 19444-1, o tai reiškia, kad bet kuri XML biblioteka bet kurioje platformoje gali jį atidaryti, palyginti ar sugeneruoti. Abu formatai gali pernešti formos laukų reikšmes <fields> medyje, kurį reglamentune ISO 19444-1 6.3 punktas, ir anotacijas <annots> medyje; HotPDF padalija šias atsakomybes, nukreipdamas formų duomenis per ExportLoadedFormToXFDF ir palikdamas ExportLoadedAnnotationsToXFDF puslapio <annots> daliai. Kai keičiatės komentarais su interneto paslauga, „Java“ peržiūros serveriu ar scenarijumi, XFDF yra formatas, kuris nevers kitos pusės integruoti PDF analizatoriaus

Kaip eksportuoti PDF anotacijas kaip XFDF Delphi aplinkoje?

HotPDF eksportuoja anotacijas pereidama kiekvieną įkelto dokumento puslapį, sugeneruodama po one XFDF elementą kiekvienai palaikomai anotacijai ir grąžindama įrašytų anotacijų skaičių. Pirmiausia įkelkite PDF, tada iškvieskite ExportLoadedAnnotationsToXFDF su tiksliniu keliu. Sveikojo skaičiaus rezultatas yra serijomis išrikiuotų anotacijų skaičius; rezultatas lygus nuliui arba mažesnis reiškia, kad nieko nebuvo eksportuota ir failas nebuvo įrašytas, o tai yra signalas, kad dokumente nebuvo palaikomo potipio anotacijų

var
  Pdf: THotPDF;
  Written: Integer;
begin
  Pdf := THotPDF.Create(nil);
  try
    if Pdf.LoadFromFile('report-reviewed.pdf', '') > 0 then
    begin
      // Write one XFDF element per supported annotation on every page
      Written := Pdf.ExportLoadedAnnotationsToXFDF('comments.xfdf');
      if Written <= 0 then
        ShowMessage('No supported annotations were found');
    end;
  finally
    Pdf.Free;
  end;
end;

Gautas XFDF yra paprastas, skaitomas XML. HotPDF įrašo <xfdf> šaknį ISO 19444-1 vardų srityje, <annots> konteinerį ir po vieną vaikinį elementą kiekvienai anotacijai su jos nuliu pagrįstu puslapio indeksu, spalva bei geometrija kaip atributais arba vaikiniais elementais. Linija su geltonu užpildu ir atvira rodyklės galvute, esanti šalia užpildyto daugiakampio, yra paverčiama tokiu XML formatu

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/">
  <annots>
    <line page="0" start="72,700" end="220,700"
          color="#FF0000" interior-color="#FFFF00"
          head="OpenArrow" tail="None">
      <contents-richtext>Baseline looks off</contents-richtext>
    </line>
    <polygon page="0" color="#0000FF" interior-color="#CCE5FF">
      <vertices>72,120;180,120;180,200;72,200</vertices>
    </polygon>
  </annots>
</xfdf>

Kaip anotacijų potipiai susiejami su XFDF elementais

Kiekvienas anotacijos potipis susiejamas su konkrečiu ISO 19444-1 elementu pagal jo paties geometrijos taisykles, ir HotPDF seka šiomis struktūromis, užuot kūrusi savas. Linijų anotacijos turi start ir end atributus, kuriuose saugomos dviejų galinių taškų koordinačių poros, paimtos tiesiai iš anotacijos L masyvo, o LE linijų galų stiliai tampa head bei tail atributais. Daugiakampio ir polilinijos anotacijos perkelia savo taškų sąrašą į vaikinį elementą <vertices> kaip kabliataškiais atskirtas x,y poras, o ne atributą, nes skaitytuvas, kuris tikisi vaikinio elemento, tyliai atmes kitose vietose paslėptus taškus. Rašalo anotacijos, kurios gali turėti kelis atskirus potėpius, įterpia <inklist> elementą su vienu <gesture> vaikiniu elementu kiekvienam potėpiui, todėl kelių potėpių parašas išlieka kaip atskiri judesiai, o ne vienas sulietas vaizdas

Formatas tekstas (rich text), spalvos ir rėmelių stiliai išlieka kartu su geometrija. Pastabos formatuotas tekstas įrašomas kaip vaikinis elementas <contents-richtext>; vidinis užpildas, kurį PDF saugo IC masyve, perduodamas kaip interior-color atributas #RRGGBB formatu; o rėmelio plotis, brūkšninis raštas bei debesėlio rėmelio efektas susiejami su width, dashes, style bei intensity atributais, todėl debesėlio kontūro išnaša vis tiek išlieka debesėlio formos. HotPDF taip pat išlaiko iškylantįjį langą, prikabintą prie žymėjimo anotacijos, importuodama iškylančio lango geometrija ir jo atvirą ar uždarą būseną į anotacijos Popup žodyną, bei perneša tekstinių anotacijų atvirumo ir peržiūros būsenas, todėl peržiūrėtas dokumentas išlaiko ne tik savo formas, bet ir darbo eigos metaduomenis, kuriais pasitiki peržiūrėtojai

XFDF importavimas atgal į įkeltą dokumento failą

HotPDF importuoja XFDF išanalizuodama XML, sukurdama naują anotaciją kiekvienam elementui per NewLoadedAnnotation, prikabindama ją prie elemento nurodyto puslapio ir grąžindama pridėtų anotacijų skaičių. Darbo eiga yra simetriška eksportui: įkelkite bazinį PDF, iškvieskite ImportLoadedAnnotationsFromXFDF su peržiūrėtojo failu, tada išsaugokite įkeltą dokumentą, kad išsaugotumėte naujas žymas. Jei failo trūksta arba XML neanalizuojamas, funkcija grąžina nulį ir įkeltas dokumentas lieka nepaliestas

var
  Pdf: THotPDF;
  Added: Integer;
begin
  Pdf := THotPDF.Create(nil);
  try
    if Pdf.LoadFromFile('report.pdf', '') > 0 then
    begin
      Added := Pdf.ImportLoadedAnnotationsFromXFDF('comments.xfdf');
      if Added > 0 then
        Pdf.SaveLoadedDocument('report-annotated.pdf');
    end;
  finally
    Pdf.Free;
  end;
end;

Kadangi kiekvienas XFDF elementas nurodo savo puslapio indeksą, anotacijos patenka į tuos puslapius, kuriuose jos buvo sukurtos, net ir importuojant kelis failus iš eilės; tai leidžia saugiai surinkti komentarus iš daugiau nei vieno peržiūrėtojo į tą patį įkeltą dokumentą prieš jį išsaugant. Žemiau pateiktame pavyzdyje du peržiūrėtojai sujungiami į vieną kopiją. Norėdami kurti ir redaguoti pačius anotacijų objektus kode, o nesikeisti jais failais, žiūrėkite, kaip HotPDF kuria ir redaguoja PDF anotacijų objektus tiesiogiai iš Delphi

var
  Pdf: THotPDF;
  Total, I: Integer;
  Files: array[0..1] of string;
begin
  Files[0] := 'alice-comments.xfdf';
  Files[1] := 'bob-comments.xfdf';
  Pdf := THotPDF.Create(nil);
  try
    if Pdf.LoadFromFile('master.pdf', '') > 0 then
    begin
      Total := 0;
      for I := Low(Files) to High(Files) do
        Inc(Total, Pdf.ImportLoadedAnnotationsFromXFDF(Files[I]));
      if Total > 0 then
        Pdf.SaveLoadedDocument('master-merged.pdf');
    end;
  finally
    Pdf.Free;
  end;
end;

Kas sėkmingai juda pirmyn ir atgal, o kas ne

HotPDF perkelia pirmyn ir atgal anotacijų potipius, kuriems ISO 19444-1 suteikia vietą, ir sąmoningai praleidžia kitus, užuot išvedusi tai, ką skaitytuvas galėtų neteisingai interpretuoti. Palaikomas rinkinys apima žymėjimo tipus, kurie dominuoja tikrame peržiūros darbe: tekstines pastabas, laisvą tekstą, liniją, kvadratą, apskritimą, daugiakampį, poliliniją, keturis teksto žymėjimo tipus (paryškinimą, pabraukimą, perbraukimą ir banguotą pabraukimą), antspaudą, rašalą bei stogelį, taip pat failo priedą, garsą, nuasmeninimą ir nuorodą — iš viso aštuoniolika potipių. Anotacija, kurios potipis nepatenka į šį sąrašą, eksportuojant yra praleidžiama, ir kadangi ji yra praleidžiama, o ne įrašoma tuščia, ji nepadidina kokybės ir funkcijos grąžinamo skaičiaus

Formatas tekstas yra sąžininga išlyga. HotPDF išsaugo <contents-richtext> kūną, todėl stilingas tekstas ir paprastas turinys nukeliauja, tačiau XFDF perneša komentaro tekstą ir stiliaus žymėjimą, o ne atvaizduotos išvaizdos srautą, todėl gaunanti programa iš naujo nupiešia iškylantįjį langą su savo šriftais bei maketu, užuot atgaminusi tikslius HotPDF pikselius. Vertinkite šį perkėlimą pirmyn ir atgal kaip tikslų turiniui ir ketinimui, o ne ekrano atvaizdavimui iki pikselio. Jei jūsų suformatuotas turinys randasi XFA formos duomenyse, o ne anotacijų srautuose, taisyklės skiriasi, ir straipsnis apie tai, kaip HotPDF apdoroja XFA exData, formatuotą tekstą bei nuorodas, aprašo šį atskirą kelią

Simbolių lygio apdorojimas yra griežtesnis, nei atrodo, o tai yra būtent tai, ko norite. Rašydama tekstą HotPDF taiko ISO 19444-1 standarto 5.8.2 punkto simbolių apsaugos taisykles, koduodama XML reikšmingus simbolius bei kontrolinius baitus, todėl komentaras, kuriame yra ampersandas, kampinis skliaustas ar eilutės lūžis, sukuria taisyklingos formos XML, kurį priima bet kuris reikalavimus atitinkantis analizatorius, ir atvirkščiai atkuria tas pačias taisykles importo metu. Štai kodėl pastaba, įklijuota iš skaičiuoklės, su visais skyrybos ženklais grįžta nepažeista, užuot sugadinusi failą

Anotacijų mainai yra tik viena dalis to, ką atlieka įkelto dokumento API, ir ji derinama su kitomis dalimis: importuoti peržiūrėtojo XFDF, koreguoti puslapius arba redaguoti dokumento metaduomenis, suplotinti arba pakeisti failo teises, o tada eksportuoti naują XFDF kitam etapui. Viskas platinama standartiniame HotPDF komponente, skirtame Delphi ir C++Builder, kurio žinyne aprašomas visas anotacijų potipių palaikymas bei susijusios formų duomenų XFDF funkcijos