ABI zpětného volání HPDFDoc

HotPDFABI.dll zpřístupňuje ploché funkce cdecl se stavovými hodnotami pevné šířky, neprůhlednými handly, explicitními délkami bajtů a verzovanou strukturou zpětných volání hpdf_io_v1 deklarovanou v Lib/hotpdf_abi.h

Výstupy sestavení

Spusťte build-HotPDF-ABI.cmd a sestavíte DLL Win32 a Win64 včetně importních knihoven pod Lib/ABI/<platform>/Release

Veřejné ABI používá stabilní exportní názvy malými písmeny, zatímco hpdf_abi_version a hpdf_abi_io_v1_size umožňují volajícím ověřit smlouvu dřív, než vytvoří dokument

Základní funkce

uint32_t hpdf_abi_version(void);
uint32_t hpdf_abi_io_v1_size(void);
hpdf_status hpdf_document_create(hpdf_document *handle);
hpdf_status hpdf_document_destroy(hpdf_document handle);
hpdf_status hpdf_document_load_from_io(
    hpdf_document handle,
    const hpdf_io_v1 *io,
    const char *password,
    size_t password_length);
hpdf_status hpdf_document_page_count(
    hpdf_document handle,
    uint32_t *page_count);
hpdf_status hpdf_document_save_to_io(
    hpdf_document handle,
    const hpdf_io_v1 *io);

Verzovaná I/O struktura

hpdf_io_v1 io = {0};
io.struct_size = sizeof(io);
io.abi_version = HPDF_ABI_VERSION_1;
io.user_data = state;
io.read_at = read_at;
io.get_size = get_size;
io.write = write;
io.is_cancelled = is_cancelled;
io.progress = progress;
io.diagnostic = diagnostic;

struct_size je 48 bajtů na Win32 a 72 bajtů na Win64, flags musí být u ABI v1 nula a větší budoucí struktury lze rozlišit bez hádání rozvržení polí

Všechna zpětná volání i exportované funkce používají cdecl, každý textový ukazatel má explicitní délku v bajtech a přes hranici neprochází žádný delphiovský řetězec, třída, rozhraní, enum, výjimka ani Boolean

Vstup s náhodným přístupem

read_at obdrží absolutní 64bitový posun a zapisuje přímo do cílového bufferu parseru, zatímco get_size hlásí neměnnou velikost zdroje jednou, jakmile se zdroj připojí

Částečně úspěšná čtení se přijímají a dokončují opakovanými voláními zpětného volání, takže range úložiště i omezení síťová čtenáři nemusí alokovat mezibuffer celého souboru

Stav zpětného volání i zdrojové bajty musí zůstat platné, dokud se handle dokumentu nezničí nebo dokud se do něj nenačte jiný zdroj

Streamovaný výstup

write dostává sekvenční výstupní bloky přímo z SaveLoadedDocumentToStream; částečně úspěšné zápisy se opakují, dokud se nepřijme celý blok

Úspěšný zápis nula bajtů se odmítne jako I/O chyba, protože nemůže zajistit pokrok

U operací JSON execute a porovnání dvou handle se neúspěšný write callback znovu nevolá, aby přes tutéž dvojici writer a user-data publikoval chybový výsledek, včetně případu, kdy OutputIO a ResultIO sdílejí tuhle dvojici; částečné candidate bytes už předané volajícímu zůstávají jeho odpovědností

Stavové hodnoty zápisu mimo definovaný nenulový rozsah stavů a nulové či přehnané počty úspěšných bajtů se stanou HPDF_STATUS_IO_ERROR; rozložení záznamu V1 i chování částečného úspěšného zápisu zůstávají beze změny

Stavy a životní cyklus

StavVýznam
HPDF_STATUS_OKOperace se dokončila
HPDF_STATUS_INVALID_ARGUMENTChybí požadovaný ukazatel nebo zpětné volání, případně je bajtový rozsah neplatný
HPDF_STATUS_INVALID_HANDLEHandle je null, neznámý nebo už zničený
HPDF_STATUS_INCOMPATIBLE_ABIVelikost struktury, verze nebo příznaky nejsou podporovány
HPDF_STATUS_CANCELLEDZpětné volání zrušení požádalo o ukončení
HPDF_STATUS_IO_ERRORVstupní nebo výstupní zpětné volání selhalo nebo porušilo smlouvu o počtech
HPDF_STATUS_PARSE_ERRORVstup se úspěšně přečetl, ale nebyl přijat jako PDF
HPDF_STATUS_INTERNAL_ERRORVnitřní selhání se zachytilo dřív, než překročilo ABI

Každé úspěšné hpdf_document_create se musí spárovat s jedním úspěšným hpdf_document_destroy; opakované ničení vrátí HPDF_STATUS_INVALID_HANDLE

Neprůhledné handly jsou monotónní tokeny lokální pro proces, nikoli adresy objektů, takže znovupoužití alokátoru nemůže oživit zastaralý handle

ABI zpětného volání HPDFDoc definuje stabilní smlouvu mezi HotPDF a hostitelskými obslužnými programy nebo integračními komponentami

Smlouva

Struktury a funkce mají pevně určené verze, velikosti a pravidla vlastnictví. Implementace musí ověřit velikost vstupní struktury a respektovat omezení zdrojů volání

Starší pascalovská zpětná volání

Chyby se vracejí jako definované stavy a diagnostika, nikoli jako výjimky přes hranici ABI Typy THPDFABICallbacks a pascalovské helpery HPDFDoc* zůstávají zdrojově kompatibilní pro aplikace Delphi a C++Builder, nativní integrace v C by ale měly používat hotpdf_abi.h