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 superiore sinistro, con Y crescente verso il basso, come funziona la canvas della VCL, il che mette in difficoltà chi arriva dagli stream di contenuto PDF grezzi in cui l'origine è in basso a sinistra. 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
La cifratura è gestita anch'essa a livello di documento. CryptKeyLength seleziona lo schema (RC4 a 40 bit fino ad AES-256), ActivateProtection lo attiva, e ProtectOptions imposta i flag di permessi ISO. Le due modalità di revisione AES-256 (R5 e R6, controllate da UseAES256R6) esistono perché la revisione 5 era un'estensione Adobe il cui controllo della password si è rivelato debole ed è stata in seguito deprecata, mentre la revisione 6 è la forma standardizzata da ISO 32000-2. Acrobat X e successivi e la maggior parte dei viewer attuali aprono i file R6, quindi R6 è il valore predefinito sensato; R5 conta solo quando un destinatario è bloccato su un viewer più vecchio
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
PDF Library for Delphi: manipolazione, firma di conformità e accesso diretto ai file
PDF Library for Delphi si colloca all'altro estremo dello spettro di complessità. Espone tre livelli di API sullo stesso modello di documento: una facade piatta basata su handle (TPDFlib) compatibile con la convenzione di chiamata di Quick-PDF, un livello completo a albero di oggetti (TPDFDocument) e un parser a stream (TSmartPDFReader / TSmartPDFWriter) che opera direttamente sui byte del file senza caricare l'intero grafo di oggetti
Il livello di streaming è ciò che rende PDF Library for Delphi 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 PDF Library for Delphi. 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 PDF Library for Delphi. Molti sistemi di produzione usano due delle tre: HotPDF per generare l'output e PDF Library for Delphi 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. HotPDF e PDF Library for Delphi non hanno dipendenze di runtime oltre la VCL; PDFium Component distribuisce anche la DLL di PDFium, che fa il lavoro di rendering e parsing del motore. La pagina prodotto di ogni libreria contiene il riferimento API completo e la cronologia delle versioni corrente
Dettagli sulle singole librerie: HotPDF Delphi Component, PDFium Component e PDF Library for Delphi