PDFium Delphi Component Docs

Açıklama ve form anlam karşılaştırması

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);

Public declarations

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;