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