Tehnični članek

Uvoz in izvoz opomb PDF kot XFDF v Delphi

HotPDF izvozi in uvozi opombe PDF kot XFDF prek dveh funkcij, ki delujeta na trenutno naloženem dokumentu, ExportLoadedAnnotationsToXFDF in ImportLoadedAnnotationsFromXFDF. XFDF je XML format za izmenjavo opomb, standardiziran kot ISO 19444-1, in ta par omogoča programu za Delphi ali C++Builder, da preda svoje komentarje Acrobatu ali orodju za pregledovanje tretjih oseb ter prejme označene rezultate nazaj, vse to brez ponovnega pisanja vsebine strani, na kateri opombe sedijo

Predstavljajte si dve smeri, ki ju to rešuje. Pregledovalec odpre vaše ustvarjeno poročilo v Acrobatu, spusti rdečo puščico na napačno poravnano sliko, obkroži napačen seštevek in vpiše opombo na rob ter nato izvozi komentarje v majhno datoteko XFDF. Ali pa obratno: vaš program sam ustvari oznake in jih morate poslati nekomu, čigar orodje ni HotPDF. V obeh primerih opombe potujejo kot XML, ki ga razumeta obe strani, strani PDF pa ostanejo bajt za bajtom takšne, kot so bile

Kakšna je razlika med FDF in XFDF?

FDF in XFDF prenašata enak tovor v dveh različnih sintaksah in razlika postane pomembna v trenutku, ko se odločite, katero datoteko boste predali drugemu orodju. FDF je starejši format podatkov obrazcev (Forms Data Format), določen znotraj same specifikacije PDF: uporablja sintakso objektov PDF, zato je datoteka FDF videti kot okrnjen PDF in za branje potrebuje bralnik, ki prepozna PDF. XFDF je izraz teh istih podatkov v XML, standardiziran neodvisno kot ISO 19444-1, kar pomeni, da jo lahko odpre, primerja ali ustvari katera koli knjižnica XML na kateri koli platformi. Oba formata lahko prenašata vrednosti polj obrazca v drevesu <fields>, ki ga ureja klavzula 6.3 standarda ISO 19444-1, in opombe v drevesu <annots>; HotPDF razdeli te odgovornosti tako, da usmerja podatke obrazca prek ExportLoadedFormToXFDF in rezervira ExportLoadedAnnotationsToXFDF for the <annots> side. Ko izmenjujete komentarje s spletno storitvijo, strežnikom za pregledovanje Java ali skripto, XFDF je format, ki druge strani ne sili v vgradnjo parserja PDF

Kako izvoziti opombe PDF kot XFDF v Delphi?

HotPDF izvozi opombe tako, da prehodi vsako stran naloženega dokumenta, odda po en element XFDF za vsako podprto opombo in vrne število zapisanih opomb. Najprej naložite PDF, nato pokličite ExportLoadedAnnotationsToXFDF s ciljno potjo. Rezultat celotnega števila je število serijaliziranih opomb; rezultat nič ali manj pomeni, da ni bilo ničesar izvoženo in nobena datoteka ni bila zapisana, kar je vaš signal, da dokument ni vseboval opomb podprtega podtipa

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;

XFDF, ki pride ven, je preprost, berljiv XML. HotPDF zapiše koren <xfdf> v imenskem prostoru ISO 19444-1, vsebnik <annots> in po enega otroka na opombo z njenim 0-indeksiranim indeksom strani, barvo in geometrijo kot atributi ali podrejenimi elementi. Črta z rumenim polnilom in odprto konico puščice, ki sedi poleg polnjenega poligona, se serijalizira takole

<?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>

Kako se podtipi opomb preslikajo v elemente XFDF

Vsak podtip opombe se preslika v določen element ISO 19444-1 z lastno konvencijo geometrije, HotPDF pa sledi tem strukturam, namesto da bi si izmišljal svoje. Opombe črt prenašajo atributa start in end, ki držita koordinatna para obeh končnih točk, vzeta neposredno iz polja opombe L, slogi zaključkov črt LE pa postanejo atributa head in tail. Opombe poligonov in polilinij premaknejo svoj seznam točk v podrejeni element <vertices> kot s podpičjem ločene pare x,y in ne kot atribut, ker bo bralnik, ki pričakuje podrejeni element, tiho opustil točke, skrite kjer koli drugje. Opombe s črnilom (ink), ki lahko držijo več ločenih potez, ugnezdijo element <inklist> z enim podrejenim <gesture> na potezo, tako da večpotezni podpis preživi pot kot ločene kretnje in ne kot en združen blob

Ob geometriji preživijo tudi bogato besedilo, barva in oblikovanje robov. Bogato besedilno telo opombe je zapisano kot otrok <contents-richtext>; notranje polnilo, ki ga PDF shranjuje v polju IC, barva znotraj kroga, kvadrata, poligona ali konice črte ter polnilo redigirnega polja, se prenesejo kot atribut interior-color v obliki #RRGGBB; širina robu, vzorec črtic in učinek oblačnega robu pa se preslikajo v atribute width, dashes, style in intensity, tako da oblačno obrobni oblaček še vedno ostane oblačen na drugi strani. HotPDF prav tako ohrani pojavno okno (popup), pritrjeno na opombo z označbami, in uvozi geometrijo podrejenega pojavnega okna ter njegovo odprto ali zaprto stanje v slovar opombe Popup, prenaša pa tudi odprta in pregledovalna stanja besedilnih opomb, tako da pregledan dokument ohrani ne le svojih oblik, temveč tudi metapodatke poteka dela, na katere se zanašajo pregledovalci

Uvoz XFDF nazaj na naložen dokument

HotPDF uvozi XFDF tako, da razčleni XML, ustvari svežo opombo za vsak element prek NewLoadedAnnotation, jo pripne strani, ki jo poimenuje element, in vrne število dodanih opomb. Potek dela je simetričen z izvozom: naložite osnovni PDF, pokličite ImportLoadedAnnotationsFromXFDF z ocenjevalčevo datoteko, nato pa shranite naložen dokument, da ohranite nove označbe. Če datoteka manjka ali se XML ne razčleni, funkcija vrne nič in naložen dokument ostane nedotaknjen

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;

Ker vsak element XFDF poimenuje svoj lastni indeks strani, opombe pristanejo na straneh, na katerih so bile ustvarjene, tudi če uvozite več datotek zaporedoma, zaradi česar je varno zbrati komentarje več kot enega pregledovalca na isti naložen dokument pred enim samim shranjevanjem. Spodnji primer združuje dva pregledovalca v eno združeno kopijo. Za gradnjo in urejanje samih objektov opomb v kodi namesto izmenjave datotek si oglejte, kako HotPDF ustvari in ureja objekte opomb PDF neposredno iz 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;

Kaj se čisto prenese v obe smeri in kaj ne

HotPDF prenese v obe smeri tiste podtipe opomb, ki jim ISO 19444-1 ponuja dom, ostale pa namerno preskoči, namesto da bi oddal nekaj, kar bi bralnik napačno interpretiral. Podprt nabor obsega tipe označb, ki prevladujejo pri resnem pregledu: besedilne opombe, prosto besedilo, črto, kvadrat, krog, poligon, polilinijo, štiri tipe označevanja besedila (poudarek, podčrtano, prečrtano in valovito), žig, črnilo in caret, plus prilogo datoteke, zvok, redigiranje in povezavo, skupaj osemnajst podtipov. Opomba, katere podtip pade izven tega seznama, se ob izvozu preskoči, in ker je preskočena, namesto da bi bila zapisana prazna, ne napihne števila, ki ga vrne funkcija

Bogato besedilo je iskreno opozorilo. HotPDF ohrani telo <contents-richtext>, tako da oblikovano besedilo in navadna vsebina opravita pot, vendar XFDF prenaša besedilo in slogovne oznake komentarja ter ne upodobljenega toka videza, zato prejemna aplikacija ponovno nariše pojavno okno z lastnimi pisavami in postavitvijo, namesto da bi poustvarila natančne slikovne pike HotPDF. Obravnavajte prenos v obe smeri kot zvest vsebini in namenu ter ne kot zvest upodabljanju na zaslonu do zadnje slikovne pike. Če vaša oblikovana vsebina živi v podatkih obrazca XFA in ne v tokovih opomb, se pravila razlikujejo, in kako HotPDF ravna z XFA exData, bogatim besedilom in povezavami pokriva to ločeno pot

Ravnanje na ravni znakov je strožje, kot je videti, kar je natanko tisto, kar želite. HotPDF pri pisanju besedila uveljavlja ubežna pravila iz klavzule 5.8.2 standarda ISO 19444-1, s čimer kodira XML-pomembne znake in nadzorne bajte, tako da komentar, ki vsebuje ampersand, kotni oklepaj ali prelom vrstice, ustvari pravilno oblikovan XML, ki ga sprejme kateri koli skladen parser, in obrne ista pravila pri uvozu. Zato se beležka, prilepljena iz preglednice, s ločili in vsem ostalim vred, vrne nedotaknjena, namesto da bi pokvarila datoteko

Izmenjava opomb je le en del tega, kar počne API za naložene dokumente, in se sestavlja s preostalim: uvozite ocenjevalčev XFDF, prilagodite strani or uredite metapodatke dokumenta, sploščite ali ponovno določite dovoljenja datoteke, nato pa izvozite svež XFDF za naslednji krog. Vse to se dobavlja v standardni komponenti HotPDF Component za Delphi in C++Builder, katere referenca dokumentira popolno pokritost podtipov opomb in spremne funkcije XFDF za podatke obrazcev