JSON and C ABI document comparison
Dva načtené dokumenty porovnáte přes THPDFJobProcessor.ExecuteLoadedOperationWithComparison, dva C ABI handly přes hpdf_document_compare_json_v1, či dva soubory přes JSON job processor
Obecné režimy
type=compare přijme hodnoty mode pageCount, pageText, objectCount, renderedImage, full a structural; default je structural
Režimy si uchovávají nativní chování THPDFDocComparison, tedy i zarovnání stránek i strukturální objektové signatury; objectCount porovnává navíc strukturu stránek i objektů
{
"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}
}
Obálka výsledku obsahuje comparison, comparisonComplete, identical, documentUpdated=false, uplynulý čas i velikost výstupu; volitelný binární výstup obsahuje porovnávací JSON bez obálky
Limity traversal, streamů, hodnot, držených rozdílů i renderování vytvoří status=incomplete, comparisonComplete=false a identical=false, i když je prohlížená podmnožina shodná
Kontrahová revize
type=compare.contract zarovná odstavce, odhalí přesuny a reportuje vložení, smazání a náhrady slov či vět s oběma kontexty i pozicemi
{
"schemaVersion": 1,
"type": "compare.contract",
"format": "pdf",
"side": "after",
"options": {"granularity": "word", "ignoreRepeatedHeadersFooters": true,
"excludedLineTexts": ["CONFIDENTIAL COPY"], "maxWorkUnits": 50000000}
}
format přijme json, html či pdf; default je JSON a HTML či PDF vyžaduje výstupní stream či callback
Druhy změn jsou insert, delete, replace a move; indexy stránek a odstavců jsou zero-based, znakové začátky jsou one-based UTF-16 pozice a obdélníky pokrývají sémantické řádky v PDF user space, nikoli přesné čtyřúhelníky glyfů
PDF vybere side=before či side=after, verifikuje vybraný dokument proti každému sémantickému snapshotu stránky, přidá zvýraznění i komentáře Before/After, uloží review kopii a vždy odroluje transakci zdrojového grafu
Review PDF je kompletní přepis a vyžaduje samostatnou verifikaci podpisů; porovnání nechá vypůjčené zdrojové dokumenty i jejich podpisy beze změny
Volby a meze
Obecné options přijímá maxObjects, maxEdges, maxPages, maxDepth, maxDifferences, maxStreamBytes, maxTotalStreamBytes, maxValueBytes a maxPathBytes
Renderování přijímá dpi, colorSpace (rgb či luminance), colorTolerance, minimumSimilarity, maxChangedPixelRatio, tileSize a maxChangedRegions; callback operace nezapisují heat mapy do souborového systému
Kontrahové options přijímá Booleovské, marginové, podobnostní, boilerplate i resource pole z THPDFContractCompareOptions, s camelCase názvy; granularity je word či sentence
Sdílené rozpočty jsou memoryBytes, outputBytes, resultBytes, timeMilliseconds, pixels, objectCount a pageCount; volby se na ty rozpočty oříznou
Paměťové rozpočty alokují konzervativní příspěvky pro obě dekódovací cesty, renderované pixely, úložiště zarovnání i soukromý výstup; jsou to limity zátěže, nikoli strop RSS operačního systému a už načtené objektové grafy zůstávají vlastnictvím volajícího
Alokace JSON se kontroluje konzervativním odhadem escapované velikosti, který může odmítnout výsledek, jehož konečná UTF-8 reprezentace by se vešla; HTML používá konzervativní znakový příspěvek v rámci rozpočtu výstupních bajtů
Selhání rozpočtů vrátí ABI status 8 a zrušení status 4; zrušení je kooperativní na hranicích stránek, objektů, streamových bloků, renderovacích objektů, pixelových řádků i zarovnání
Chybová řídicí obálka C ABI má nezávislé maximum 8 KiB a usekne detail na 1 024 UTF-16 code unit, takže se chyba rozpočtu dá reportovat, i když je vyžádaný výsledkový rozpočet příliš malý pro chybovou odpověď
Vypůjčené C ABI handly
Každý handle načtěte vlastním zdrojem hpdf_io_v1 a zavolejte hpdf_document_compare_json_v1(handle_a, handle_b, operation); rozložení záznamů ABI v1 i původní export execute zůstávají nezměněné
operation.input_io musí být NULL, result_io musí poskytovat write a volitelné output_io dodá artefakt; JSON souborové klíče input, otherInput a output se odmítají
Oba nezávislé zdroje mohou vracet krátká random-access čtení a oba cancellation callbacky se dotazují, i když jsou jejich dekódované objekty v cache; tentýž handle se dá předat dvakrát pro self comparison
Vstupní callbacky i jejich kontexty držte naživu po dobu života handlu i aktivních volání a operace nad každým handlem serializujte; reference handlů se drží, dokud porovnání nevrátí
Artefakty se staví a validují v soukromých ohraničených bufferech, dřív než publikace callbackem; callbacky selhávající během publikace mohou ponechat už přijaté bajty, zatímco zdrojové dokumenty zůstávají beze změny
File joby
{"operations":[{"type":"compare.contract","input":"before.pdf",
"otherInput":"after.pdf","format":"html","output":"review.html"}]}
password a otherPassword nezávisle odemknou oba soubory; JSON výstup může vynechat výstupní cestu a zůstat ve výsledkové obálce
Výstupní cesty se musí lišit od obou zdrojových souborů, tedy i od existujících aliasů hard linků; dočasný soubor v cílovém adresáři se flushne a atomicky publikuje poté, co projdou všechny kontroly, se zachováním existujícího výstupu při selhání
Související témata
Porovnávání dokumentů · Porovnávání kontraktů · Anotovaný stream export