HotPDF, şu anda yüklü olan belge üzerinde çalışan iki işlev (ExportLoadedAnnotationsToXFDF and ImportLoadedAnnotationsFromXFDF) aracılığıyla PDF açıklamalarını XFDF olarak dışa ve içe aktarır. XFDF, ISO 19444-1 olarak standartlaştırılmış XML açıklama değişim biçimidir ve bu çift, bir Delphi veya C++Builder programının yorumlarını Acrobat'a veya üçüncü taraf bir inceleme aracına teslim etmesine ve açıklamaların üzerinde bulunduğu sayfa içeriğini yeniden yazmadan işaretlenmiş sonuçları geri almasına olanak tanır
Bunun çözdüğü iki yönü hayal edin. Bir incelemeci, oluşturduğunuz raporu Acrobat'ta açar, yanlış hizalanmış bir şeklin üzerine kırmızı bir ok bırakır, yanlış bir toplamı daire içine alır ve kenar boşluğuna bir not yazar, ardından yorumları küçük bir XFDF dosyasına aktarır. Veya tam tersi: Programınız işaretlemeleri kendisi üretir ve bunları aracı HotPDF olmayan birine göndermeniz gerekir. Her iki durumda da açıklamalar, her iki tarafın da anladığı XML olarak seyahat eder ve PDF sayfaları bayt bayt neyseler o şekilde kalır
FDF ile XFDF arasındaki fark nedir?
FDF ve XFDF aynı yükü iki farklı sözdiziminde taşır ve ayrım, başka bir araca hangi dosyayı teslim edeceğinize karar verdiğiniz anda önem kazanır. FDF, PDF spesifikasyonunun kendi içinde tanımlanan eski Form Veri Biçimidir (Forms Data Format): PDF nesne sözdizimini kullanır, bu nedenle bir FDF dosyası sadeleştirilmiş bir PDF gibi görünür ve okumak için PDF farkındalığı olan bir ayrıştırıcıya ihtiyaç duyar. XFDF, ISO 19444-1 olarak bağımsız olarak standartlaştırılmış aynı verilerin XML ifadesidir; bu, herhangi bir platformdaki herhangi bir XML kütüphanesinin onu açabileceği, karşılaştırabileceği veya oluşturabileceği anlamına gelir. Her iki biçim de, ISO 19444-1 madde 6.3'ün yönettiği <fields> ağacında form alanı değerlerini ve <annots> ağacında açıklamaları taşıyabilir; HotPDF bu sorumlulukları böler, form verilerini ExportLoadedFormToXFDF aracılığıyla yönlendirir ve ExportLoadedAnnotationsToXFDF'i <annots> tarafı için ayırır. Bir web servisi, bir Java inceleme sunucusu veya bir komut dosyası ile yorum alışverişinde bulunduğunuzda XFDF, karşı tarafı bir PDF ayrıştırıcısı gömmeye zorlamayan biçimdir
Delphi'de PDF açıklamalarını XFDF olarak nasıl dışa aktarırsınız?
HotPDF, yüklü belgenin her sayfasını yürüyerek, desteklenen her bir açıklama için bir XFDF öğesi yayarak ve yazılan açıklama sayısını döndürerek açıklamaları dışa aktarır. Önce PDF'i yükleyin, ardından bir hedef yolla ExportLoadedAnnotationsToXFDF çağrısı yapın. Tamsayı sonucu, serileştirilen açıklamaların sayısıdır; sıfır veya daha düşük bir sonuç, hiçbir şeyin dışa aktarılmadığı ve hiçbir dosyanın yazılmadığı anlamına gelir; bu da belgenin desteklenen bir alt türden hiçbir açıklama taşımadığının sinyalidir
var
Pdf: THotPDF;
Written: Integer;
begin
Pdf := THotPDF.Create(nil);
try
if Pdf.LoadFromFile('report-reviewed.pdf', '') > 0 then
begin
// Her sayfada desteklenen açıklama başına bir XFDF öğesi yazın
Written := Pdf.ExportLoadedAnnotationsToXFDF('comments.xfdf');
if Written <= 0 then
ShowMessage('Desteklenen hiçbir açıklama bulunamadı');
end;
finally
Pdf.Free;
end;
end;
Ortaya çıkan XFDF düz, okunabilir XML'dir. HotPDF, ISO 19444-1 ad alanında bir <xfdf> kökü, bir <annots> kapsayıcısı ve öznitelikler veya çocuk öğeler olarak sıfır tabanlı sayfa dizini, rengi ve geometrisiyle açıklama başına bir çocuk yazar. Sarı dolgulu ve açık ok uçlu, içi dolu bir çokgenin yanında duran bir çizgi şu şekilde serileştirilir
<?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>
Açıklama alt türleri XFDF öğeleriyle nasıl eşleşir?
Her açıklama alt türü, kendi geometri kuralına sahip belirli bir ISO 19444-1 öğesiyle eşleşir ve HotPDF kendi kurallarını icat etmek yerine bu yapıları izler. Çizgi açıklamaları, doğrudan açıklamanın L dizisinden alınan iki uç nokta koordinat çiftini tutan bir start ve bir end özniteliği taşırken, LE çizgi bitiş stilleri head ve tail öznitelikleri haline gelir. Çokgen ve çoklu çizgi (polyline) açıklamaları, nokta listelerini bir öznitelik olarak değil, noktalı virgülle ayrılmış x,y çiftleri olarak bir <vertices> çocuk öğesine taşır; çünkü çocuk öğeyi bekleyen bir okuyucu, başka bir yerde gizlenmiş noktaları sessizce atacaktır. Birkaç ayrı vuruş (stroke) tutabilen mürekkep (ink) açıklamaları, vuruş başına bir <gesture> çocuk öğesi içeren bir <inklist> öğesini barındırır; böylece çok vuruşlu bir imza, tek bir birleştirilmiş yığın yerine ayrı hareketler olarak yolculuktan sağ çıkar
Zengin metin, renk ve kenarlık stilleri geometrinin yanında hayatta kalır. Bir notun zengin metin gövdesi bir <contents-richtext> çocuk öğesi olarak yazılır; PDF'in IC dizisinde sakladığı iç dolgu (daire, kare, çokgen veya çizgi ok ucunun içindeki boya ve karartma kutusunun dolgusu), #RRGGBB biçiminde bir interior-color özniteliği olarak gelir; ve kenarlık genişliği, kesikli çizgi deseni ve bulutlu kenarlık efekti width, dashes, style ve intensity öznitelikleriyle eşleşir; böylece bulut konturlu bir açıklama metni karşı tarafta hala bulutlu olarak okunur. HotPDF ayrıca bir işaretleme açıklamasına eklenmiş açılır (popup) pencereyi korur, açılır çocuk geometrisini ve açık veya kapalı durumunu açıklamanın Popup sözlüğüne aktarır ve metin açıklaması açık ve inceleme durumlarını taşır; böylece incelenen bir belge yalnızca şekillerini değil, aynı zamanda incelemecilerin güvendiği iş akışı meta verilerini भी korur
XFDF'i yüklü bir belgeye geri aktarma
HotPDF, XML'i ayrıştırarak, NewLoadedAnnotation aracılığıyla her öğe için yeni bir açıklama oluşturarak, bunu öğenin adlandırdığı sayfaya ekleyerek ve eklediği açıklama sayısını döndürerek XFDF'i içe aktarır. İş akışı dışa aktarma ile simetriktir: Temel PDF'i yükleyin, incelemecinin dosyasıyla ImportLoadedAnnotationsFromXFDF çağrısı yapın, ardından yeni işaretlemeleri kalıcı kılmak için yüklü belgeyi kaydedin. Dosya eksikse veya XML ayrıştırılamıyorsa işlev sıfır döndürür ve yüklü belgeye dokunulmaz
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;
Her XFDF öğesi kendi sayfa dizinini adlandırdığından, arka arkaya birkaç dosya aktarsanız bile açıklamalar yazıldıkları sayfalara düşer; bu da tek bir kaydetmeden önce birden fazla incelemecinin yorumlarını aynı yüklü belgede toplamayı güvenli hale getirir. Aşağıdaki örnek, iki incelemeciyi birleştirilmiş tek bir kopyada toplar. Dosya olarak değiştirmek yerine kod içinde açıklama nesnelerinin kendilerini oluşturmak ve düzenlemek için, HotPDF'in doğrudan Delphi'den PDF açıklama nesnelerini nasıl oluşturup düzenlediğine bakın
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;
Neler temiz bir şekilde gidiş-dönüş yapar ve neler yapmaz
HotPDF, ISO 19444-1'in barındırdığı açıklama alt türlerini gidiş-dönüş yaptırır ve okuyucunun yanlış yorumlayacağı bir şey yaymak yerine geri kalanını kasıtlı olarak atlar. Desteklenen küme, gerçek inceleme işine hakim olan işaretleme türlerini kapsar: Metin notları, serbest metin, çizgi, kare, daire, çokgen, çoklu çizgi, dört metin işaretleme türü (vurgulama, altı çizili, üstü çizili ve dalgalı), damga, mürekkep ve şapka işareti (caret), artı dosya eki, ses, karartma ve bağlantı olmak üzere toplamda on sekiz alt tür. Alt türü bu listenin dışına düşen bir açıklama dışa aktarma sırasında es geçilir ve boş yazılmak yerine atlandığı için işlevin döndürdüğü sayıyı şişirmez
Zengin metin, dürüst uyarımızdır. HotPDF, biçimlendirilmiş metin ve düz içeriğin yolculuk etmesi için <contents-richtext> gövdesini korur, ancak XFDF, işlenmiş bir görünüm akışını değil, bir yorumun metin ve stil işaretlemesini taşır; bu nedenle alıcı uygulama, HotPDF'in tam piksellerini yeniden üretmek yerine açılır pencereyi kendi yazı tipleri ve düzeniyle yeniden çizer. Gidiş-dönüşü pikseli pikseline ekrandaki işlemeye değil, içeriğe ve niyete sadık olarak ele alın. Biçimlendirilmiş içeriğiniz açıklama akışları yerine XFA form verilerinde yaşıyorsa kurallar farklıdır ve HotPDF'in XFA exData, zengin metin ve köprüleri nasıl ele aldığı bu ayrı yolu kapsar
Karakter düzeyindeki yönetim göründüğünden daha katıdır ve bu tam olarak istediğiniz şeydir. HotPDF, metin yazarken ISO 19444-1 madde 5.8.2 kaçış kurallarını uygular, XML açısından önemli karakterleri ve kontrol baytlarını kodlar; böylece ve işareti (&), açılı parantez veya satır sonu içeren bir yorum, uyumlu herhangi bir ayrıştırıcının kabul edeceği düzgün biçimlendirilmiş XML üretir ve içe aktarırken aynı kuralları tersine çevirir. Bu nedenle, bir elektronik tablodan kopyalanıp yapıştırılan bir not, noktalama işaretleri ve her şeyiyle birlikte dosyayı bozmak yerine sağlam bir şekilde geri döner
Açıklama değişimi, yüklü belge API'sinin yaptığı işin bir parçasıdır ve geri kalanıyla birleşir: İncelemecinin XFDF'ini içe aktarın, sayfaları ayarlayın veya belge meta verilerini düzenleyin, dosyayı düzleştirin (flatten) veya yeniden yetkilendirin, ardından bir sonraki tur için yeni bir XFDF dışa aktarın. Tüm bunlar, referansı tam açıklama alt türü kapsamını ve eşlik eden form verisi XFDF işlevlerini belgeleyen Delphi ve C++Builder için standart HotPDF Bileşeni ile birlikte gönderilir