HotPDF ABI Callback C Stabile

HotPDFABI.dll espone funzioni cdecl piatte con valori di stato a larghezza fissa, handle opachi, lunghezze esplicite in byte e la struttura callback versionata hpdf_io_v1 dichiarata in Lib/hotpdf_abi.h

Output della build

Esegui build-HotPDF-ABI.cmd per compilare DLL Win32 e Win64 oltre alle librerie di import sotto Lib/ABI/<platform>/Release

L'ABI pubblica usa nomi di export minuscoli e stabili, mentre hpdf_abi_version e hpdf_abi_io_v1_size consentono ai chiamanti di verificare il contratto prima di creare un documento

Funzioni principali

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

Struttura I/O versionata

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 è di 48 byte su Win32 e di 72 byte su Win64, flags deve essere zero per l'ABI v1 e le strutture future più grandi possono essere riconosciute senza indovinare la disposizione dei campi

Tutte le callback e le funzioni esportate usano cdecl, ogni puntatore di testo ha una lunghezza esplicita in byte e nessuna stringa Delphi, classe, interfaccia, enum, eccezione o Boolean attraversa il confine

Input ad accesso casuale

read_at riceve un offset assoluto a 64 bit e scrive direttamente nel buffer di destinazione del parser, mentre get_size riporta la dimensione immutabile della sorgente una volta quando la sorgente viene collegata

Le letture parziali riuscite sono accettate e completate tramite chiamate ripetute della callback, così gli archivi di range e i reader di rete con limiti non devono allocare un buffer intermedio per il file completo

Lo stato della callback e i byte della sorgente devono restare validi fino alla distruzione dell'handle del documento o fino al caricamento di un'altra sorgente nell'handle

Output in streaming

write riceve i blocchi di output sequenziali direttamente da SaveLoadedDocumentToStream; le scritture parziali riuscite vengono riprovate finché il blocco completo non viene accettato

Una scrittura riuscita di zero byte viene rifiutata come errore I/O perché non può progredire

Per le operazioni di execute JSON e confronto a due handle, una callback di scrittura fallita non viene richiamata per pubblicare un risultato di errore attraverso la stessa coppia writer e user-data, incluso quando OutputIO e ResultIO condividono quella coppia; i byte parziali del candidato già ricevuti dal chiamante restano responsabilità del chiamante

Valori di stato fuori dall'intervallo di stati non zero definito, e conteggi riusciti di byte nulli o eccessivi, diventano HPDF_STATUS_IO_ERROR; il layout del record V1 e il comportamento di scrittura parziale riuscita restano invariati

Stato e ciclo di vita

StatoSignificato
HPDF_STATUS_OKL'operazione è stata completata
HPDF_STATUS_INVALID_ARGUMENTUn puntatore o una callback richiesta è assente o un intervallo di byte non è valido
HPDF_STATUS_INVALID_HANDLEL'handle è nullo, sconosciuto o già distrutto
HPDF_STATUS_INCOMPATIBLE_ABILa dimensione, la versione o i flags della struttura non sono supportati
HPDF_STATUS_CANCELLEDLa callback di cancellazione ha richiesto la terminazione
HPDF_STATUS_IO_ERRORUna callback di input o output è fallita o ha violato il proprio contratto di conteggio
HPDF_STATUS_PARSE_ERRORL'input è stato letto con successo ma non è stato accettato come PDF
HPDF_STATUS_INTERNAL_ERRORUn guasto interno è stato intercettato prima che attraversasse l'ABI

Ogni hpdf_document_create riuscito deve essere accoppiato con un hpdf_document_destroy riuscito; una distruzione ripetuta restituisce HPDF_STATUS_INVALID_HANDLE

Gli handle opachi sono token process-local monotoni anziché indirizzi di oggetto, così il riuso dell'allocator non può far rivivere un handle obsoleto

Le eccezioni non attraversano mai il confine C e la callback diagnostica opzionale riceve i byte del messaggio corrispondente prima che un'operazione restituisca uno stato di errore

Concorrenza

Handle diversi possono essere usati contemporaneamente, ma i chiamanti devono serializzare le operazioni e la distruzione per lo stesso handle

Callback Pascal legacy

THPDFABICallbacks e gli helper Pascal HPDFDoc* restano compatibili a livello di sorgente per le applicazioni Delphi e C++Builder, ma le integrazioni C native dovrebbero usare hotpdf_abi.h e gli export minuscoli v1