HotPDF Kararlı C Callback ABI'si

HotPDFABI.dll; sabit genişlikte status değerleri, opaque handle'lar, açık bayt uzunlukları ve Lib/hotpdf_abi.h içinde tanımlanan sürümlü hpdf_io_v1 callback yapısıyla düz cdecl fonksiyonlar sunar

Build çıktıları

Lib/ABI/<platform>/Release altında Win32 ve Win64 DLL'lerini ve import library'lerini build etmek için build-HotPDF-ABI.cmd dosyasını çalıştırın

Public ABI kararlı, küçük harfli export adları kullanır; hpdf_abi_version ve hpdf_abi_io_v1_size ise çağıranların sözleşmeyi belge oluşturmadan önce doğrulamasını sağlar

Çekirdek fonksiyonlar

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

Sürümlü I/O yapısı

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 Win32'de 48 bayt, Win64'te 72 bayttır; flags ABI v1 için sıfır olmalıdır ve gelecekteki daha büyük yapılar, field düzeni tahmin edilmeden ayırt edilebilir

Tüm callback'ler ve export edilen fonksiyonlar cdecl kullanır, her text pointer açık bir bayt uzunluğuna sahiptir ve sınırı hiçbir Delphi string, class, interface, enum, exception ya da Boolean geçmez

Random-access girdi

read_at mutlak bir 64-bit offset alır ve doğrudan parser'ın hedef tamponuna yazar; get_size ise kaynak eklendiğinde değişmez kaynak boyutunu bir kez bildirir

Kısmi başarılı okumalar kabul edilir ve tekrarlanan callback çağrılarıyla tamamlanır; böylece range store'lar ve sınırlı network reader'ları ara bir tam dosya tamponu ayırmak zorunda kalmaz

Callback durumu ve kaynak baytları, document handle yok edilene ya da handle'a başka bir kaynak yüklenene kadar geçerli kalmalıdır

Stream'lenen çıktı

write, sıralı output chunk'larını doğrudan SaveLoadedDocumentToStream'den alır; kısmi başarılı yazmalar, chunk'ın tamamı kabul edilene dek yeniden denenir

Sıfır baytlık başarılı bir yazma, ilerleme kaydedemediği için I/O hatası olarak reddedilir

JSON execute ve iki-handle'lı karşılaştırma operation'ları için, başarısız bir write callback'i — OutputIO ve ResultIO o çifti paylaştığında bile — hata sonucunu aynı writer ve user-data çifti üzerinden yayımlamak için yeniden çağrılmaz; çağıranın zaten aldığı kısmi aday baytları çağıranın sorumluluğundadır

Tanımlanmış sıfırdan-farklı status aralığının dışındaki yazma status value'ları ve sıfır veya aşırı başarılı bayt sayıları HPDF_STATUS_IO_ERROR olur; V1 record layout'u ve başarılı kısmi-yazma davranışı değişmeden kalır

Status ve yaşam döngüsü

StatusAnlam
HPDF_STATUS_OKİşlem tamamlandı
HPDF_STATUS_INVALID_ARGUMENTZorunlu bir pointer ya da callback yok ya da bir byte range geçersiz
HPDF_STATUS_INVALID_HANDLEHandle null, bilinmiyor ya da çoktan yok edilmiş
HPDF_STATUS_INCOMPATIBLE_ABIYapı boyutu, sürüm ya da flags desteklenmiyor
HPDF_STATUS_CANCELLEDCancellation callback'i sonlandırmayı istedi
HPDF_STATUS_IO_ERRORBir input ya da output callback'i başarısız oldu ya da count sözleşmesini ihlal etti
HPDF_STATUS_PARSE_ERRORInput başarıyla okundu ama PDF olarak kabul edilmedi
HPDF_STATUS_INTERNAL_ERRORDahili bir hata, ABI'yi geçmeden önce yakalandı

Her başarılı hpdf_document_create, başarılı bir hpdf_document_destroy ile eşleşmelidir; tekrarlanan yok etme HPDF_STATUS_INVALID_HANDLE döndürür

Opaque handle'lar, nesne adresleri yerine monotonik process-local token'lardır; böylece allocator yeniden kullanımı bayat bir handle'ı canlandıramaz

Exception'lar asla C sınırını geçmez ve opsiyonel diagnostic callback, bir işlem hata status'u döndürmeden önce ilgili mesaj baytlarını alır

Eşzamanlılık

Farklı handle'lar eşzamanlı kullanılabilir; ancak aynı handle için işlemlerin ve yok etmenin serialize edilmesi çağıranın sorumluluğundadır

Eski Pascal callback'leri

THPDFABICallbacks ve HPDFDoc* Pascal helper'ları, Delphi ve C++Builder uygulamaları için kaynak uyumlu kalır; ancak native C entegrasyonları hotpdf_abi.h ve küçük harfli v1 export'larını kullanmalıdır