ComparePdfSemantics sammenligner annotationers og AcroForm-widgets' egenskaber uafhængigt af siderendering; feltværdier kan ændres, selv om appearance-pixels er identiske
Angiv TPdfDiffPagePairs fra sidealignment eller en eksplicit mapping; nil vælger positionspar, og eksplicitte mappings skal dække begge dokumenter præcis én gang med -1 for en manglende side
Annotationer identificeres med deres /NM-navn, form-widgets med det fuldt kvalificerede feltnavn; identiteten gælder inden for den mappede side og elementtypen
Manglende eller gentagne navne, inklusive flere widgets for samme felt på en side, rapporteres som psckAmbiguous med en eksplicit årsag; rækkefølgen i annotation-arrayet bestemmer ikke identiteten
Den understøttede profil sammenligner strings, flags, farver, opacity, borders, markup, line-, vertex- og ink-geometri, URI actions, feltværdier, choice labels og valgte options samt checkbox- eller radio-state
CompareAppearanceStreams kan også sammenligne indholdet af annotationers appearance-streams; den er deaktiveret som standard
CompareAnnotations og CompareForms vælger de respektive elementtyper; GeometryTolerance er som standard 0.001 PDF user-space points
Tilføjede, fjernede og ændrede elementer indeholder før/efter-egenskaber og bounds; BuildSemanticDiffOverlays returnerer separate før/efter-rektangler med side- og ændringsindeks
Alle indekser er nulbaserede, og bounds forbliver i PDF user space, i points; anvend den relevante siderotation, crop og viewport-transform før tegning i en bitmap
Sider indlæses med uafhængige native handles, så kalderens aktuelle side og form focus bevares, og form actions undgås
Profilen udelukker non-widget-felter, vilkårlige custom dictionaries, embedded files, script actions og non-URI-destinationer; XFA-sammenligning afvises eksplicit
Standardgrænserne er 10,000 sidepar, 4,096 scannede elementer, 4,096 ændringer, 1 MiB pr. string, 16 MiB strings i alt og 16,777,216 sammenligninger; et opbrugt budget afviser ufuldstændigt output
Complete skelner en vellykket komplet sammenligning fra en afvist; ændringerne kan omfatte eksplicit tvetydige identiteter, så undersøg AmbiguousCount, før resultatet betragtes som et definitivt match
Reel Delphi/FPC-accept på Win32/Win64 dækker 92 assertions pr. mål, inklusive gemte/genåbnede dokumenter, værdiændringer med identiske pixels, Unicode-identitet, sideflytning, tvetydighed og budgetter
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;