Technischer Artikel

losLab PDF-Bibliotheken für Delphi: HotPDF, PDFium Component und PDF Library for Delphi im Vergleich

Drei Bibliotheken. Drei verschiedene Aufgaben. Die Wahl der falschen kostet Sie Wochen an Workarounds, und die Wahl von allen dreien, wenn Sie nur eine benötigen, verursacht Wartungsaufwand, den Sie nicht eingeplant haben. Hier ist ein direkter Bericht darüber, was jede losLab PDF-Bibliothek tatsächlich tut, wo sie hingehört und wo sie an ihre Geschwister übergibt

Diagramm zum Vergleich der drei losLab-PDF-Bibliotheken für Delphi: HotPDF erzeugt neue Dokumente, PDFium Component rendert und extrahiert bestehende Dateien, und PDF Library for Delphi führt Zusammenführung und Compliance-Signierung durch
HotPDF schreibt neue PDFs aus Code, PDFium Component liest und rendert bestehende Dateien, und PDF Library for Delphi führt zusammen, signiert und regelt, was bereits existiert

HotPDF: PDFs in Delphi von Grund auf neu schreiben

HotPDF ist eine native VCL-Komponente zum Generieren von PDF-Dokumenten. Sein Modell ist imperativ und seitenorientiert: Sie konstruieren eine THotPDF-Instanz, legen Dokumenteigenschaften fest, rufen BeginDoc auf, zeichnen auf CurrentPage, fügen nach Bedarf Seiten hinzu und schließen mit EndDoc. Die Reihenfolge ist wichtig, da BeginDoc das Verschlüsselungswörterbuch und die Komprimierungseinstellungen genau in dem Moment festschreibt, in dem es ausgeführt wird; alles, was danach zugewiesen wird, wird stillschweigend ignoriert und nicht rückwirkend angewendet

Die Zeichenfläche deckt den gesamten PDF-Operatorsatz auf Delphi-Ebene ab: TextOut für positionierten Unicode-Text, SetFont mit TrueType-Einbettung, Vektorprimitiven (Linien, Bezier-Kurven, Ellipsen, Rechtecke), Bildplatzierung aus Datei oder Speicher und Barcode-Generierung. Die Koordinaten werden in Punkten von der linken unteren Ecke angegeben, wobei Y nach oben zunimmt, was jeden einmal erwischt. Der Schriftstatus bleibt nach AddPage nicht erhalten, daher ist ein Aufruf von SetFont nach jedem Seitenumbruch erforderlich

AcroForm-Felder sind erstklassige Bürger. Sie können Textfelder, Kontrollkästchen, Optionsfelder, Kombinationsfelder, Listenfelder und Schaltflächen mit einem einzigen Aufruf direkt zu einem Seitenobjekt hinzufügen. HotPDF kann auch ein vorhandenes PDF über LoadFromFile laden und Feldwerte ausfüllen oder lesen, was es für zwei separate Workflows nützlich macht: das Erstellen von Formularen und die Automatisierung ihrer Befüllung

Die Verschlüsselung wird ebenfalls auf Dokumentebene gehandhabt. CryptKeyLength wählt das Schema aus (40-Bit-RC4 bis AES-256), ActivateProtection aktiviert es und ProtectOptions legt die ISO-Berechtigungsflags fest. Die beiden AES-256-Revisionsmodi (R5 und R6, gesteuert durch UseAES256R6) existieren, da Revision 6 eine bekannte Schwachstelle in Revision 5 behebt, jedoch einen PDF 2.0-fähigen Viewer erfordert; die Wahl zwischen ihnen ist eine Kompatibilitätsentscheidung, keine Bequemlichkeit

Lebenszyklusdiagramm der HotPDF-PDF-Erzeugung in Delphi: von der THotPDF-Erzeugung über BeginDoc, Zeichnen, AddPage und EndDoc, mit der Regel, dass Dokumentoptionen bei BeginDoc committen
Optionen auf Dokumentebene verriegeln, wenn BeginDoc läuft, Koordinaten wachsen von unten links, und der Font-Zustand setzt bei jedem AddPage zurück

Die Unterstützung für digitale Signaturen in HotPDF deckt die PAdES-Basisprofile ab und eignet sich daher für Workflows, bei denen die Signatur die Anforderungen der ETSI EN 319 142 erfüllen muss. Wenn Sie nur eine Ausgabe generieren müssen, ist HotPDF die Bibliothek, zu der Sie zuerst greifen sollten

PDFium Component: Vorhandene PDFs rendern, anzeigen und lesen

Die PDFium Component hüllt die PDFium-Engine von Google in eine VCL-Komponente, was ihr eine grundlegend andere Rolle als HotPDF gibt. Wo HotPDF schreibt, liest und rendert die PDFium Component. Das Kernobjekt ist TPdf, ein Dokumentmanager, der eine Datei öffnet, indem FileName und dann Active := True festgelegt werden. Ladefehler werden nicht als Ausnahmen ausgelöst; Active bleibt einfach False, daher ist eine Überprüfung nach der Zuweisung nicht optional

Das Rendern läuft über TPdfView, eine visuelle Komponente, die Sie auf einem Formular ablegen und über PdfView.Pdf := Pdf mit einer TPdf-Instanz verknüpfen. Zoom und Anpassungsmodus leben auf der Ansicht, nicht auf dem Dokument. Eine Feinheit, die oft zu Stolpern führt: Pdf.PageNumber und PdfView.PageNumber sind unabhängige Eigenschaften. Das Festlegen der einen aktualisiert nicht die andere, und die ansichtsbasierten Extraktions-APIs (Wortfelder, Leseeinheiten) verwenden die aktuelle Seite der Ansicht, nicht die des Dokuments

Die Textextraktion ist der Bereich, in dem die PDFium Component im losLab-Sortiment keinen direkten Konkurrenten hat. ReadablePageContent gibt strukturierten Text mit Bewusstsein für die Lesereihenfolge zurück, PageWordBoxes liefert Begrenzungsrechtecke auf Wortebene und DocumentReadingUnits durchläuft das gesamte Dokument. Für die Barrierefreiheitsarbeit teilt Ihnen IsTagged mit, ob ein Strukturbaum vorhanden ist, und ValidatePdfUa führt eine UA-Konformitätsprüfung durch. Diese APIs machen die PDFium Component zur natürlichen Wahl für jeden Workflow, der verstehen muss, was in einem vorhandenen PDF enthalten ist, anstatt ein neues zu erstellen

Das Ausfüllen von Formularen funktioniert auch auf der PDFium-Seite über dieselbe AcroForm-Schicht, die die zugrunde liegende Engine verfügbar macht. Dies ist angebracht, wenn das Quelldokument bereits vorhanden ist und Sie dessen Vervollständigung automatisieren, anstatt die Formularfelder selbst zu erstellen

PDF Library for Delphi: Manipulation, Compliance-Signatur und direkter Dateizugriff

PDF Library for Delphi (Version 3.73.0) befindet sich am anderen Ende des Komplexitätsspektrums. Es stellt drei API-Ebenen auf demselben Dokumentmodell bereit: eine flache, handle-basierte Fassade (TPDFlib), die mit der Quick-PDF-Aufrufkonvention kompatibel ist, eine vollständige Objektbaumebene (TPDFDocument) und einen Streaming-Parser (TSmartPDFReader / TSmartPDFWriter), der direkt auf den Dateibytes arbeitet, ohne das gesamte Objektdiagramm zu laden

Die Streaming-Schicht ist es, die PDF Library for Delphi zur richtigen Wahl für große Dokumente macht. TSmartPDFWriter kann einer Datei auf der Festplatte ein inkrementelles Update anfügen, ohne die gesamte Querverweistabelle neu zu erstellen, was der Mechanismus ist, der sowohl dem effizienten erneuten Speichern als auch den PAdES-Stempeln für die Langzeitvalidierung zugrunde liegt. Für Signatur-Workflows in Compliance-Qualität, bei denen der signierte Hash einen bestimmten Byte-Bereich abdecken muss und die Signatur angewendet wird, ohne das Dokument neu zu schreiben, ist diese Ebene der einzige praktikable Weg

Die Dokumentenmanipulation auf der Ebene TPDFDocument umfasst das Zusammenführen mit Merge, das selektive Kopieren von Seiten über CopyPagesFromDoc mit einer Bereichszeichenfolge und die Versionskontrolle über SetMinimumVersion und LockSaveVersion. Die Versionssperre löst den Fehler 602 aus, wenn Sie versuchen, eine Funktion zu speichern, die die Ausgabe über die gesperrte Version hinausschieben würde, was nützlich ist, wenn Sie garantieren müssen, dass die Ausgabe für die Archivierungskonformität innerhalb einer bestimmten PDF-Revision bleibt

Die PDF/A-Unterstützung (ISO 19005) befindet sich in der Konformitäts-Workbench von PDF Library for Delphi. Beachten Sie, dass sich Verschlüsselung und PDF/A laut Spezifikation gegenseitig ausschließen: Sie können nicht beides in einer Datei haben. Workflows, die eine verschlüsselte Verteilungskopie und eine PDF/A-Archivkopie benötigen, müssen zwei separate Artefakte erstellen

Die Wahl zwischen ihnen

Der typische Entscheidungsbaum ist kurz. Wenn Sie ein neues Dokument aus Daten generieren, verwenden Sie HotPDF. Wenn Sie Text aus einem vorhandenen Dokument in einer Delphi VCL-Anwendung rendern oder extrahieren, verwenden Sie die PDFium Component. Wenn Sie vorhandene PDFs in großem Maßstab oder mit inkrementellen Speichersemantiken manipulieren, zusammenführen oder Compliance-Signieren, verwenden Sie PDF Library for Delphi. Viele Produktionssysteme verwenden zwei der drei: HotPDF zum Generieren der Ausgabe und PDF Library for Delphi, um sie vor der Archivierung mit einem Langzeitvalidierungsstempel zu versehen, oder die PDFium Component, um in der Vorschau anzuzeigen, was HotPDF generiert hat, bevor es weitergeleitet wird

Alle drei werden als nativer Pascal-Quellcode für Delphi und C++Builder ausgeliefert, ohne Laufzeitabhängigkeiten über die VCL hinaus. Die PDFium Component bündelt zusätzlich die PDFium-DLL, die die Rendering- und Parsing-Arbeit der Engine abdeckt. Die Produktseite jeder Bibliothek enthält ihre vollständige API-Referenz und den aktuellen Versionsverlauf

Details zu den einzelnen Bibliotheken: HotPDF Delphi Component, PDFium Component und PDF Library for Delphi

Architekturdiagramm der PDF Library for Delphi: die TPDFlib-Fassade, der TPDFDocument-Objektbaum und der TSmartPDFReader- bzw. TSmartPDFWriter-Streaming-Parser über einer Dokumentdatei
Die flache Fassade passt zu kurzen Aufruffolgen, der Objektbaum beherrscht strukturelle Bearbeitungen, und der Streaming-Parser hängt inkrementelle Updates und PAdES-Stempel an, ohne alles neu zu laden