Stabiele C-callback-ABI van HotPDF

HotPDFABI.dll stelt platte cdecl-functies beschikbaar met statuswaarden van vaste breedte, ondoorzichtige handles, expliciete bytelengten en de geversioneerde hpdf_io_v1-callbackstructuur die in Lib/hotpdf_abi.h is gedeclareerd

Build-uitvoer

Voer build-HotPDF-ABI.cmd uit om Win32- en Win64-DLL's plus importbibliotheken te bouwen onder Lib/ABI/<platform>/Release

De openbare ABI gebruikt stabiele exportnamen in kleine letters, terwijl hpdf_abi_version en hpdf_abi_io_v1_size aanroepers in staat stellen het contract te verifiëren vóór het maken van een document

Kernfuncties

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);

Gevoerde I/O-structuur

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 is 48 bytes op Win32 en 72 bytes op Win64, flags moet nul zijn voor ABI v1, en grotere toekomstige structuren kunnen worden onderscheiden zonder de veldlay-out te raden

Alle callbacks en geëxporteerde functies gebruiken cdecl, elke tekstpointer heeft een expliciete bytelengte, en geen Delphi-string, klasse, interface, enum of Boolean overschrijdt de grens

Willekeurige-toegang invoer

read_at ontvangt een absolute 64-bits offset en schrijft rechtstreeks naar de doellocatie van de parser, terwijl get_size de onveranderlijke bronomvang eenmaal meldt wanneer de bron is gekoppeld

Gedeeltelijk geslaagde leesbewerkingen worden geaccepteerd en via herhaalde callback-aanroepen voltooid, zodat reeksopslagen en begrensde netwerklezers geen tussentijdse volledige-bestandsbuffer hoeven toe te wijzen

De callbackstatus en bronbytes moeten geldig blijven totdat de documenthandle is vernietigd of een andere bron in de handle is geladen

Gestreamde uitvoer

write ontvangt opeenvolgende uitvoerblokken rechtstreeks van SaveLoadedDocumentToStream; gedeeltelijk geslaagde schrijfbewerkingen worden opnieuw geprobeerd totdat het volledige blok is geaccepteerd

Een geslaagd schrijven van nul bytes wordt als I/O-fout afgewezen omdat het geen vooruitgang kan boeken

Voor JSON-execute- en twee-handle-vergelijkingsoperaties wordt een mislukte write-callback niet opnieuw aangeroepen om een errorresultaat via hetzelfde writer-/user-data-paar te publiceren, ook niet wanneer OutputIO en ResultIO dat paar delen; partiële kandidaatbytes die de aanroeper al heeft ontvangen blijven de verantwoordelijkheid van de aanroeper

Write-statuswaarden buiten de gedefinieerde niet-nul statusrange en nul of buitensporige aantallen geslaagde bytes worden HPDF_STATUS_IO_ERROR; de V1-recordlayout en het geslaagde partiële-schrijfgedrag blijven ongewijzigd

Status en levenscyclus

StatusBetekenis
HPDF_STATUS_OKDe bewerking is voltooid
HPDF_STATUS_INVALID_ARGUMENTEen vereiste pointer of callback ontbreekt of een bytereeks is ongeldig
HPDF_STATUS_INVALID_HANDLEDe handle is null, onbekend of al vernietigd
HPDF_STATUS_INCOMPATIBLE_ABIDe structuurgrootte, versie of flags worden niet ondersteund
HPDF_STATUS_CANCELLEDDe annuleringscallback verzocht om beëindiging
HPDF_STATUS_IO_ERROREen invoer- of uitvoercallback mislukte of schond zijn tellingscontract
HPDF_STATUS_PARSE_ERRORDe invoer werd succesvol gelezen maar werd niet als PDF geaccepteerd
HPDF_STATUS_INTERNAL_ERROREen interne fout werd opgevangen voordat deze de ABI overschreed

Elke geslaagde hpdf_document_create moet worden gekoppeld aan één geslaagde hpdf_document_destroy; herhaalde vernietiging retourneert HPDF_STATUS_INVALID_HANDLE

Ondoorzichtige handles zijn monotone proceslokale tokens in plaats van objectadressen, zodat hergebruik door de toewijzer een verlopen handle niet kan doen herleven

Uitzonderingen overschrijden de C-grens nooit, en de optionele diagnostische callback ontvangt de overeenkomstige berichtbytes vóór een bewerking een foutstatus retourneert

Gelijktijdigheid

Verschillende handles kunnen gelijktijdig worden gebruikt, maar aanroepers moeten bewerkingen en vernietiging voor dezelfde handle serialiseren

Verouderde Pascal-callbacks

THPDFABICallbacks en de Pascal-helpers HPDFDoc* blijven broncompatibel voor Delphi- en C++Builder-applicaties, maar native C-integraties moeten hotpdf_abi.h en de exports in kleine letters van v1 gebruiken