Articolo tecnico

Librerie PDF losLab per Delphi: HotPDF, PDFium Component e PDFlibPas a confronto

Tre librerie. Tre compiti distinti. Scegliere quella sbagliata costa settimane di soluzioni di ripiego, e sceglierle tutte e tre quando ne serve solo una comporta un onere di manutenzione che non avevi previsto. Ecco un resoconto diretto di ciò che ogni libreria PDF losLab fa davvero, dove si colloca e dove passa il testimone alle sue consorelle

HotPDF: scrivere PDF da zero in Delphi

HotPDF è un componente VCL nativo per generare documenti PDF. Il suo modello è imperativo e incentrato sulla pagina: si costruisce un'istanza THotPDF, si impostano le proprietà del documento, si chiama BeginDoc, si disegna su CurrentPage, si aggiungono pagine quando serve e si chiude con EndDoc. L'ordine conta perché BeginDoc fissa il dizionario di cifratura e le impostazioni di compressione nel momento in cui viene eseguito; tutto ciò che viene assegnato dopo quel punto viene ignorato silenziosamente anziché applicato retroattivamente

La superficie di disegno copre l'intero set di operatori PDF a livello Delphi: TextOut per testo Unicode posizionato, SetFont con incorporamento TrueType, primitive vettoriali (linee, curve di Bézier, ellissi, rettangoli), posizionamento di immagini da file o memoria e generazione di codici a barre. Le coordinate sono in punti a partire dall'angolo inferiore sinistro, con Y crescente verso l'alto, e questo coglie tutti in fallo almeno una volta. Lo stato del font non sopravvive ad AddPage, quindi è necessaria una chiamata a SetFont dopo ogni interruzione di pagina

I campi AcroForm sono cittadini di prima classe. Puoi aggiungere campi di testo, caselle di controllo, pulsanti di opzione, caselle combinate, caselle di riepilogo e pulsanti direttamente a un oggetto pagina con una singola chiamata ciascuno. HotPDF può anche caricare un PDF esistente tramite LoadFromFile e compilare o leggere i valori dei campi, il che lo rende utile in due flussi di lavoro distinti: la creazione di moduli e l'automazione della loro compilazione

Anche la cifratura è gestita a livello di documento. CryptKeyLength seleziona lo schema (da RC4 a 40 bit fino ad AES-256), ActivateProtection la attiva e ProtectOptions imposta i flag dei permessi ISO. Le due modalità di revisione AES-256 (R5 e R6, controllate da UseAES256R6) esistono perché la revisione 6 corregge una debolezza nota nella revisione 5 ma richiede un visualizzatore compatibile con PDF 2.0; la scelta tra le due è una decisione di compatibilità, non di comodità

Il supporto alla firma digitale in HotPDF copre i profili baseline PAdES, quindi è adatto ai flussi di lavoro in cui la firma deve soddisfare i requisiti ETSI EN 319 142. Se la tua esigenza è solo generare output, HotPDF è la libreria a cui rivolgerti per prima

PDFium Component: rendering, visualizzazione e lettura di PDF esistenti

PDFium Component incapsula il motore PDFium di Google come componente VCL, il che gli conferisce un ruolo fondamentalmente diverso da HotPDF. Dove HotPDF scrive, PDFium Component legge e renderizza. L'oggetto centrale è TPdf, un gestore di documenti che apre un file impostando FileName e poi Active := True. I fallimenti di caricamento non vengono sollevati come eccezioni; Active rimane semplicemente False, quindi verificarlo dopo l'assegnazione non è facoltativo

Il rendering passa attraverso TPdfView, un componente visuale che si rilascia su un form e si collega a un'istanza TPdf tramite PdfView.Pdf := Pdf. Lo zoom e la modalità di adattamento risiedono sulla vista, non sul documento. Una sottigliezza che manda in confusione: Pdf.PageNumber e PdfView.PageNumber sono proprietà indipendenti. Impostarne una non aggiorna l'altra, e le API di estrazione basate sulla vista (box delle parole, unità di lettura) usano la pagina corrente della vista, non quella del documento

L'estrazione del testo è il campo in cui PDFium Component non ha concorrenti diretti nella gamma losLab. ReadablePageContent restituisce testo strutturato con consapevolezza dell'ordine di lettura, PageWordBoxes fornisce i rettangoli di delimitazione a livello di parola e DocumentReadingUnits percorre l'intero documento. Per il lavoro sull'accessibilità, IsTagged indica se è presente un albero di struttura e ValidatePdfUa esegue una verifica di conformità UA. Queste API rendono PDFium Component la scelta naturale per qualsiasi flusso di lavoro che deve comprendere ciò che c'è dentro un PDF esistente anziché produrne uno nuovo

La compilazione dei moduli funziona anche sul versante PDFium, attraverso lo stesso livello AcroForm che il motore sottostante espone. È appropriata quando il documento di origine esiste già e stai automatizzando il suo completamento anziché costruire tu stesso i campi del modulo

PDFlibPas: manipolazione, firma di conformità e accesso diretto ai file

PDFlibPas (versione 3.73.0) si colloca all'altro estremo dello spettro di complessità. Espone tre livelli di API sopra lo stesso modello di documento: una facciata piatta basata su handle (TPDFlib) compatibile con la convenzione di chiamata Quick-PDF, un livello completo ad albero di oggetti (TPDFDocument) e un parser in streaming (TSmartPDFReader / TSmartPDFWriter) che opera direttamente sui byte del file senza caricare il grafo completo degli oggetti

Il livello di streaming è ciò che rende PDFlibPas la scelta giusta per i documenti di grandi dimensioni. TSmartPDFWriter può accodare un aggiornamento incrementale a un file su disco senza ricostruire l'intera tabella dei riferimenti incrociati, il che è il meccanismo alla base sia del risalvataggio efficiente sia dei timbri di convalida a lungo termine PAdES. Per i flussi di lavoro di firma a livello di conformità in cui l'hash firmato deve coprire un intervallo di byte specifico e la firma viene applicata senza riscrivere il documento, questo livello è l'unica via percorribile

La manipolazione del documento al livello TPDFDocument include la fusione con Merge, la copia selettiva delle pagine tramite CopyPagesFromDoc con una stringa di intervallo e la governance della versione tramite SetMinimumVersion e LockSaveVersion. Il blocco della versione solleva l'errore 602 se tenti di salvare una funzionalità che spingerebbe l'output oltre la versione bloccata, il che è utile quando devi garantire che l'output rimanga entro una revisione PDF specifica per la conformità all'archiviazione

Il supporto PDF/A (ISO 19005) risiede nel banco di lavoro di conformità di PDFlibPas. Nota che cifratura e PDF/A si escludono a vicenda per specifica: non puoi averli entrambi in un unico file. I flussi di lavoro che necessitano di una copia di distribuzione cifrata e di una copia di archivio PDF/A devono produrre due artefatti separati

Come scegliere tra di esse

L'albero decisionale tipico è breve. Se stai generando un nuovo documento a partire dai dati, usa HotPDF. Se stai renderizzando o estraendo testo da un documento esistente in un'applicazione VCL Delphi, usa PDFium Component. Se stai manipolando, fondendo o firmando per conformità PDF esistenti su larga scala o con semantica di salvataggio incrementale, usa PDFlibPas. Molti sistemi di produzione usano due delle tre: HotPDF per generare l'output e PDFlibPas per applicarvi un timbro di convalida a lungo termine prima dell'archiviazione, ad esempio, oppure PDFium Component per visualizzare in anteprima ciò che HotPDF ha prodotto prima di inviarlo a valle

Tutte e tre sono distribuite come sorgente Pascal nativo per Delphi e C++Builder, senza dipendenze di runtime oltre alla VCL. PDFium Component include inoltre la DLL PDFium, che copre il lavoro di rendering e parsing del motore. La pagina prodotto di ciascuna libreria riporta il riferimento API completo e la cronologia delle versioni corrente

Dettagli sulle singole librerie: HotPDF Component, PDFium Component e PDFlibPas