HotPDF exportuje a importuje PDF anotace jako XFDF prostřednictvím dvou funkcí, které působí na aktuálně načtený dokument: `ExportLoadedAnnotationsToXFDF` a `ImportLoadedAnnotationsFromXFDF`. XFDF je XML formát pro výměnu anotací standardizovaný jako ISO 19444-1, a tato dvojice umožňuje programu v Delphi nebo C++Builderu předat své komentáře Acrobat nebo nástroji pro recenze třetí strany a získat zpět označené výsledky, to vše bez přepisu obsahu stránky, na které anotace sedí
Představte si dva směry, které to řeší. Recenzent otevře váš vygenerovaný report v programu Acrobat, umístí červenou šipku na špatně zarovnaný obrázek, zakroužkuje nesprávný celkový součet a napíše poznámku na okraj, načež exportuje komentáře do malého souboru XFDF. Nebo naopak: váš program sám vygeneruje označení a vy je potřebujete poslat někomu, jehož nástrojem není HotPDF. V obou případech anotace putují jako XML, kterému obě strany rozumí, a stránky PDF zůstávají bajt po bajtu stejné, jaké byly
Jaký je rozdíl mezi FDF a XFDF?
FDF a XFDF přenášejí stejná data ve dvou různých syntaxích a tento rozdíl je důležitý v momentě, kdy se rozhodujete, který soubor předáte jinému nástroji. FDF je starší formát Forms Data Format definovaný přímo ve specifikaci PDF: používá syntaxi objektů PDF, takže soubor FDF vypadá jako ořezané PDF a ke čtení vyžaduje analyzátor rozumějící PDF. XFDF je XML vyjádřením stejných dat, standardizovaným nezávisle jako ISO 19444-1, což znamená, že jej může otevřít, porovnat (diff) nebo vygenerovat jakákoli knihovna XML na jakékoli platformě. Oba formáty mohou nést hodnoty polí formuláře ve stromu `
Jak exportovat PDF anotace jako XFDF v Delphi?
HotPDF exportuje anotace procházením každé stránky načteného dokumentu, přičemž pro každou podporovanou anotaci vygeneruje jeden prvek XFDF a vrátí počet zapsaných anotací. Nejprve načtěte PDF a poté zavolejte `ExportLoadedAnnotationsToXFDF` s cílovou cestou. Celočíselný výsledek je počet serializovaných anotací; výsledek rovný nule nebo menší znamená, že nebylo exportováno nic a nebyl zapsán žádný soubor, což je vaším signálem, že dokument neobsahoval žádné anotace podporovaného podtypu
var
Pdf: THotPDF;
Written: Integer;
begin
Pdf := THotPDF.Create(nil);
try
if Pdf.LoadFromFile('report-reviewed.pdf', '') > 0 then
begin
// Zapsat jeden prvek XFDF na podporovanou anotaci na každé stránce
Written := Pdf.ExportLoadedAnnotationsToXFDF('comments.xfdf');
if Written <= 0 then
ShowMessage('No supported annotations were found');
end;
finally
Pdf.Free;
end;
end;
XFDF, které vyjde, je prosté, čitelné XML. HotPDF zapisuje kořen `
<?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>Základní čára vypadá posunutě</contents-richtext>
</line>
<polygon page="0" color="#0000FF" interior-color="#CCE5FF">
<vertices>72,120;180,120;180,200;72,200</vertices>
</polygon>
</annots>
</xfdf>
Jak se podtypy anotací mapují na prvky XFDF
Každý podtyp anotace se mapuje na konkrétní prvek ISO 19444-1 s vlastní konvencí geometrie a HotPDF tyto struktury dodržuje, místo aby si vymýšlelo vlastní. Čárové anotace nesou atributy `start` a `end` obsahující dvě dvojice souřadnic koncových bodů, převzaté přímo z pole anotace `L`, zatímco styly zakončení čáry `LE` se stávají atributy `head` a `tail`. Polygonové a polyline anotace přesouvají svůj seznam bodů do dceřiného prvku `
Formátovaný text (rich text), barva a styl ohraničení přežívají spolu s geometrií. Tělo poznámky s formátovaným textem se zapisuje jako dceřiný prvek `
Import XFDF zpět do načteného dokumentu
HotPDF importuje XFDF analýzou XML, vytvořením nové anotace pro každý prvek prostřednictvím `NewLoadedAnnotation`, jejím připojením ke stránce, kterou prvek pojmenovává, a vrácením počtu přidaných anotací. Pracovní postup je symetrický s exportem: načtěte výchozí PDF, zavolejte `ImportLoadedAnnotationsFromXFDF` se souborem recenzenta a poté uložte načtený dokument, aby se nová označení uložila. Pokud soubor chybí nebo XML nelze analyzovat, funkce vrátí nulu a načtený dokument zůstane nedotčen
Vzhledem k tomu, že každý prvek XFDF pojmenovává svůj vlastní index stránky, anotace přistanou na stránkách, pro které byly vytvořeny, i když importujete několik souborů za sebou, což umožňuje bezpečně shromáždit komentáře od více než jednoho recenzenta do stejného načteného dokumentu před jediným uložením. Níže uvedený příklad spojuje dva recenzenty do jedné sloučené kopie. Pro vytváření a úpravu samotných objektů anotací v kódu, spíše než pro jejich výměnu jako souborů, se podívejte na to, jak HotPDF vytváří a upravuje objekty anotací PDF přímo z Delphi
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;
Protože každý XFDF prvek nese index své stránky, anotace se dostanou na správná místa i při importu více souborů za sebou. Následující příklad slučuje dva recenzní soubory do jednoho dokumentu:
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;
Co prochází obousměrným přenosem čistě a co ne
HotPDF přenáší oběma směry podtypy anotací, kterým dává ISO 19444-1 domov, a zbytek záměrně přeskakuje, místo aby emitovalo něco, co by si čtečka mohla špatně vyložit. Podporovaná sada zahrnuje typy označení, které dominují skutečné recenzní práci: textové poznámky, volný text, čáry, čtverce, kružnice, polygony, polylines, čtyři typy označení textu (zvýraznění, podtržení, přeškrtnutí a vlnovka), razítka, inkoust a stříšky, plus přílohy souborů, zvuk, redakce a odkazy — celkem osmnáct podtypů. Anotace, jejíž podtyp nespadá do tohoto seznamu, je při exportu vynechána, a protože je přeskočena, a nikoli zapsána prázdná, nezvyšuje počet, který funkce vrací
Formátovaný text je upřímným upozorněním. HotPDF zachovává tělo `
Zpracování na úrovni znaků je přísnější, než se zdá, což je přesně to, co chcete. HotPDF při zápisu textu uplatňuje pravidla escapování dle článku 5.8.2 normy ISO 19444-1, přičemž kóduje významné znaky XML a kontrolní bajty, takže komentář obsahující ampersand, lomenou závorku nebo konec řádku produkuje správně formátované XML, které jakýkoli vyhovující analyzátor přijme, a při importu tatáž pravidla obrací. Proto se poznámka zkopírovaná z tabulky, včetně interpunkce, vrací neporušená, místo aby soubor poškodila
Výměna anotací je jednou částí toho, co API pro načtené dokumenty dělá, a doplňuje se se zbytkem: importujte XFDF recenzenta, upravte stránky nebo upravte metadata dokumentu, zploštěte soubor nebo upravte jeho oprávnění a poté exportujte čerstvé XFDF pro další kolo. To vše se dodává ve standardní komponentě HotPDF Component pro Delphi a C++Builder, jejíž referenční příručka dokumentuje kompletní pokrytí podtypů anotací a doprovodné funkce XFDF pro formulářová data