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
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
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
PDFlibPas: Manipulation, Compliance-Signatur und direkter Dateizugriff
PDFlibPas (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 PDFlibPas 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 PDFlibPas. 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 PDFlibPas. Viele Produktionssysteme verwenden zwei der drei: HotPDF zum Generieren der Ausgabe und PDFlibPas, 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 Component, PDFium Component und PDFlibPas