JSON- und C-ABI-Dokumentvergleich

Vergleichen Sie zwei geladene Dokumente über THPDFJobProcessor.ExecuteLoadedOperationWithComparison, zwei C-ABI-Handles über hpdf_document_compare_json_v1 oder zwei Dateien über den JSON-Jobprozessor

Generische Modi

type=compare akzeptiert mode-Werte pageCount, pageText, objectCount, renderedImage, full und structural; der Default ist structural

Die Modi behalten das native THPDFDocComparison-Verhalten bei, einschließlich Seitenausrichtung und struktureller Objektsignaturen; objectCount vergleicht zudem Seiten- und Objektstruktur

{
  "schemaVersion": 1,
  "type": "compare",
  "mode": "full",
  "render": {"dpi": 72, "colorSpace": "rgb", "colorTolerance": 8},
  "options": {"maxDifferences": 1000, "maxStreamBytes": 1048576},
  "budget": {"memoryBytes": 268435456, "resultBytes": 16777216,
             "outputBytes": 67108864, "timeMilliseconds": 60000, "pixels": 10000000}
}

Der Ergebnisumschlag enthält comparison, comparisonComplete, identical, documentUpdated=false, verstrichene Zeit und Ausgabegröße; optionale Binärausgabe enthält das Vergleichs-JSON ohne seinen Umschlag

Traversierungs-, Stream-, Wert-, behaltene-Differenzen- und Rendering-Limits erzeugen status=incomplete, comparisonComplete=false und identical=false, selbst wenn der untersuchte Ausschnitt gleich ist

Vertragsprüfung

type=compare.contract richtet Absätze aus, erkennt Verschiebungen und meldet Wort- oder Satzeinfügungen, Löschungen und Ersetzungen mit beiden Kontexten und Positionen

{
  "schemaVersion": 1,
  "type": "compare.contract",
  "format": "pdf",
  "side": "after",
  "options": {"granularity": "word", "ignoreRepeatedHeadersFooters": true,
              "excludedLineTexts": ["CONFIDENTIAL COPY"], "maxWorkUnits": 50000000}
}

format akzeptiert json, html oder pdf; JSON ist der Default, und HTML oder PDF braucht einen Ausgabestream oder Callback

Änderungsarten sind insert, delete, replace und move; Seiten- und Absatzindizes sind nullbasiert, Zeichenanfänge sind 1-basierte UTF-16-Positionen, und Rechtecke decken semantische Zeilen im PDF-User-Space ab statt exakter Glyphen-Quadrate

PDF wählt side=before oder side=after, verifiziert das gewählte Dokument gegen jeden semantischen Seiten-Snapshot, ergänzt Highlights und Vorher/Nachher-Kommentare, speichert eine Prüfkopie und rollt die Quellgraph-Transaktion stets zurück

Eine Prüf-PDF ist eine vollständige Neuschreibung und braucht eine separate Signaturverifikation; der Vergleich lässt die geliehenen Quelldokumente und ihre Signaturen unverändert

Optionen und Grenzen

Generische options akzeptieren maxObjects, maxEdges, maxPages, maxDepth, maxDifferences, maxStreamBytes, maxTotalStreamBytes, maxValueBytes und maxPathBytes

Rendering akzeptiert dpi, colorSpace (rgb oder luminance), colorTolerance, minimumSimilarity, maxChangedPixelRatio, tileSize und maxChangedRegions; Callback-Operationen schreiben keine Heatmaps ins Dateisystem

Vertrags-options akzeptieren die Boolean-, Margen-, Similarity-, Boilerplate- und Ressourcenfelder aus THPDFContractCompareOptions, mit camelCase-Namen; granularity ist word oder sentence

Gemeinsame Budgets sind memoryBytes, outputBytes, resultBytes, timeMilliseconds, pixels, objectCount und pageCount; Optionen werden auf diese Budgets geklemmt

Speicherbudgets reservieren konservative Zuschläge für beide Dekodierpfade, Rendering-Pixel, Ausrichtungspeicher und private Ausgaben; sie sind Arbeitslastgrenzen statt einer Betriebssystem-RSS-Obergrenze, und bereits geladene Objektgraphen bleiben im Besitz des Aufrufers

Die JSON-Allokation wird mit einer konservativen Escaped-Größen-Schätzung geprüft, die ein Ergebnis verwerfen kann, dessen spätere UTF-8-Darstellung passen würde; HTML nutzt eine konservative Zeichen-Zulage innerhalb des Ausgabebyte-Budgets

Budgetüberschreitungen liefern ABI-Status 8, Abbruch liefert Status 4; Abbruch ist kooperativ an Seiten-, Objekt-, Streamblock-, Rendering-Objekt-, Pixelzeilen- und Ausrichtungsgrenzen

Der C-ABI-Fehlerkontrollumschlag hat ein unabhängiges Maximum von 8 KiB und kürzt Details auf 1024 UTF-16-Codeeinheiten, sodass ein Budgetfehler gemeldet werden kann, wenn das angeforderte Ergebnisbudget für eine Fehlerantwort zu klein ist

Geliehene C-ABI-Handles

Laden Sie jedes Handle mit seiner eigenen hpdf_io_v1-Quelle und rufen Sie hpdf_document_compare_json_v1(handle_a, handle_b, operation); die ABI-v1-Record-Layouts und der ursprüngliche Execute-Export bleiben unverändert

operation.input_io muss NULL sein, result_io muss Schreiben bereitstellen, und ein optionales output_io liefert das Artefakt; JSON-Dateischlüssel input, otherInput und output werden abgelehnt

Beide unabhängigen Quellen dürfen kurze Random-Access-Lesevorgänge liefern, und beide Abbruch-Callbacks werden abgefragt, selbst wenn ihre dekodierten Objekte gecacht sind; dasselbe Handle darf zweimal für einen Selbstvergleich übergeben werden

Halten Sie Eingabe-Callbacks und ihre Kontexte über die Handle-Lebensdauer und aktive Aufrufe am Leben und serialisieren Sie Operationen je Handle; Handle-Referenzen bleiben gehalten, bis der Vergleich zurückkehrt

Artefakte werden in privaten begrenzten Puffern aufgebaut und validiert, bevor sie über Callbacks veröffentlicht werden; Callbacks, die bei der Veröffentlichung fehlschlagen, können bereits akzeptierte Bytes behalten, während die Quelldokumente unverändert bleiben

Dateijobs

{"operations":[{"type":"compare.contract","input":"before.pdf",
  "otherInput":"after.pdf","format":"html","output":"review.html"}]}

password und otherPassword entsperren die beiden Dateien unabhängig; JSON-Ausgabe darf einen Ausgabepfad weglassen und im Ergebnisumschlag bleiben

Ausgabepfade müssen sich von beiden Quelldateien unterscheiden, einschließlich vorhandener Hard-Link-Aliase; eine temporäre Datei im Zielverzeichnis wird geflusht und atomar veröffentlicht, nachdem alle Prüfungen bestanden sind, und bewahrt eine vorhandene Ausgabe bei Fehlern

Verwandte Themen

Dokumentvergleich · Vertragsvergleich · Annotierter Stream-Export