ComparePdfSemantics, açıklama ve AcroForm widget özelliklerini sayfa işlemesinden bağımsız karşılaştırır; görünüm pikselleri aynı kalsa bile form değerleri değişebilir
Sayfa hizalamasından veya açık bir eşlemeden TPdfDiffPagePairs geçirin; nil konumsal eşleştirmeyi seçer ve açık eşlemeler, eksik taraf için -1 kullanarak her iki belgeyi de tam olarak bir kez kapsamalıdır
Açıklama kimliği /NM adını kullanır ve form widget kimliği tam nitelikli alan adını kullanır; kimlik, eşlenen sayfa ve öğe türüne göre kapsamlanır
Eksik adlar ve yinelenen adlar — aynı sayfada bir alanın birden çok widget'ı dahil — açık bir gerekçeyle psckAmbiguous olarak raporlanır; açıklama dizisi sırası kimliği belirlemez
Desteklenen profil, dizeleri, bayrakları, renkleri, saydamlığı, kenarlıkları, işaretlemeyi, çizgi, köşe ve mürekkep geometrisini, URI eylemlerini, alan değerlerini, seçim etiketlerini ve seçili seçenekleri ile onay kutusu veya radyo durumunu karşılaştırır
CompareAppearanceStreams isteğe bağlı olarak açıklama görünüm akışı içeriğini karşılaştırır; varsayılan olarak devre dışıdır
CompareAnnotations ve CompareForms ilgili öğe türlerini seçer; GeometryTolerance varsayılan 0,001 PDF kullanıcı uzayı puanıdır
Eklenen, kaldırılan ve değişen öğeler önce/sonra özelliklerini ve sınırlarını içerir; BuildSemanticDiffOverlays, sayfa ve değişiklik dizinleriyle ayrı önce/sonra dikdörtgenleri döndürür
Tüm dizinler sıfır tabanlıdır ve sınırlar PDF kullanıcı uzayında, puan biriminde kalır; bit eşlem içine boyamadan önce ilgili sayfa döndürmesini, kırpmayı ve görüntü alanı dönüşümünü uygulayın
Sayfalar bağımsız yerel tutamaçlarla yüklenir; çağıranın geçerli sayfası ve form odağı korunur ve form eylemlerinden kaçınılır
Profil, widget olmayan alanları, rastgele özel sözlükleri, gömülü dosyaları, betik eylemlerini ve URI olmayan hedefleri dışlar; XFA karşılaştırması açıkça reddedilir
Varsayılan sınırlar 10.000 sayfa çifti, 4.096 taranan öğe, 4.096 değişiklik, dize başına 1 MiB, toplam 16 MiB dize ve 16.777.216 karşılaştırmadır; bir bütçenin tükenmesi, eksik çıktıyı reddeder
Complete, başarılı ve eksiksiz bir karşılaştırmayı reddedilen karşılaştırmadan ayırır; değişiklikleri açıkça belirsiz kimlikler içerebilir, bu yüzden sonuçları kesin bir öğe eşleşmesi saymadan önce AmbiguousCount değerini inceleyin
Gerçek Delphi/FPC Win32/Win64 kabulü, kaydedilmiş/yeniden açılmış belgeler, aynı piksel değer değişiklikleri, Unicode kimliği, sayfa hareketi, belirsizlik ve bütçeler dahil hedef başına 92 iddiayı kapsar
Options := TPdfSemanticDiffOptions.Default; if not ComparePdfSemantics(BeforePdf, AfterPdf, PagePairs, Options, Report) then raise EPdfError.Create(Report.ErrorMessage); Overlays := BuildSemanticDiffOverlays(Report);
type
TPdfSemanticItemKind = (psikAnnotation, psikFormWidget);
TPdfSemanticChangeKind = (psckAdded, psckRemoved, psckChanged, psckAmbiguous);
TPdfSemanticSide = (pssBefore, pssAfter);
TPdfSemanticProperty = record
Name: string;
Value: WideString;
end;
TPdfSemanticProperties = array of TPdfSemanticProperty;
TPdfSemanticItem = record
Kind: TPdfSemanticItemKind;
Identity: WideString;
PageIndex, AnnotationIndex: Integer;
HasBounds: Boolean;
Bounds: TPdfRectangle;
Properties: TPdfSemanticProperties;
end;
TPdfSemanticPropertyChange = record
Name: string;
HasBefore, HasAfter: Boolean;
BeforeValue, AfterValue: WideString;
end;
TPdfSemanticPropertyChanges = array of TPdfSemanticPropertyChange;
TPdfSemanticChange = record
Kind: TPdfSemanticChangeKind;
ItemKind: TPdfSemanticItemKind;
Identity: WideString;
HasBefore, HasAfter: Boolean;
BeforeItem, AfterItem: TPdfSemanticItem;
Properties: TPdfSemanticPropertyChanges;
AmbiguityReason: string;
end;
TPdfSemanticChanges = array of TPdfSemanticChange;
TPdfSemanticOverlay = record
Side: TPdfSemanticSide;
PageIndex, ChangeIndex: Integer;
Kind: TPdfSemanticChangeKind;
Bounds: TPdfRectangle;
end;
TPdfSemanticOverlays = array of TPdfSemanticOverlay;
TPdfSemanticDiffOptions = record
CompareAnnotations, CompareForms, CompareAppearanceStreams: Boolean;
GeometryTolerance: Double;
MaxPagePairs, MaxItems, MaxChanges, MaxStringBytes: Integer;
MaxTotalStringBytes, MaxComparisons: Int64;
class function Default: TPdfSemanticDiffOptions; static;
end;
TPdfSemanticDiffReport = record
Complete: Boolean;
Changes: TPdfSemanticChanges;
AddedCount, RemovedCount, ChangedCount, AmbiguousCount: Integer;
ComparedItemCount: Integer;
ErrorMessage: string;
end;
// Indices are zero based. Nil PagePairs selects positional pairing. Explicit
// pairs must cover both documents exactly once; -1 denotes an absent side
// Identity is scoped to a mapped page and item kind. Missing names and repeated
// names (including repeated widgets of one field) are reported as ambiguous
// No rendering, focus changes, form actions, or positional identity guessing
// are performed. Pages are opened independently of the caller's current page
// The supported profile covers strings, flags, colors, opacity, borders,
// markup/line/vertex/ink geometry, URI actions, field values/options/checks,
// and optionally appearance streams. Arbitrary dictionaries, embedded files,
// script actions, non-URI destinations, and non-widget fields are not compared
function ComparePdfSemantics(BeforePdf, AfterPdf: TPdf;
const PagePairs: TPdfDiffPagePairs; const Options: TPdfSemanticDiffOptions;
out Report: TPdfSemanticDiffReport): Boolean;
// Bounds remain in PDF user space, in points. Transform with the destination
// page's rotation/crop/viewport rather than treating them as bitmap pixels
function BuildSemanticDiffOverlays(const Report: TPdfSemanticDiffReport):
TPdfSemanticOverlays;