Technischer Artikel

Eine Compliance- und Signatur-Workbench in Delphi mit PDFlibPas erstellen

Dieser deutsche Artikel behandelt PDFlibPas: text, image, and font extraction in Delphi für Teams, die mit Delphi, C++Builder, Lazarus/FPC und losLab-Komponenten arbeiten

Den Fehler, den die meisten selbst entwickelten Pipelines machen, liegt in der Nahtstelle zwischen Validierung und Signierung. Werden beide als zwei separate Werkzeuge mit einem Remediation-Schritt dazwischen ausgeführt, entstehen mindestens drei verschiedene Revisionen der Datei, jede mit eigenen Bytes. Der Preflight-Bericht, den man einem Prüfer übergibt, beschreibt eine davon. Die Signatur friert eine andere ein. Nichts in der Datei belegt, dass es sich um dieselbe Revision handelt, und oft ist es das nicht. PDFlibPas, die losLab PDF-Entwicklerbibliothek für Delphi und C++Builder, stellt Preflight und PAdES-Signierung hinter einer einzigen Fassadenklasse bereit, sodass die gesamte Sequenz in einem Prozess ablaufen kann, der nie den Überblick verliert, über welche Bytes er gerade spricht. Jeder unten aufgeführte Aufruf existiert heute in der Bibliothek, ebenso jede erwähnte Falle

Supportprobleme treten oft erst nach der Veröffentlichung auf. Ein robustes Design muss aufzeichnen, warum eine Datei akzeptiert, geändert, blockiert oder zugestellt wurde, anstatt nur einen einfachen Erfolgs- oder Fehler-Boolean zu hinterlassen

Schreiben Sie das Compliance- und Signatur-Workbench in den PDF-Verarbeitungsvertrag

PDFlibPas pflegt beide Schichten hinter einem Klammerpaar: BeginTag öffnet ein Strukturelement und startet die Marked-Content-Sequenz, Zeichenaufrufe landen darin, und EndTag schließt beides. Die Buchführung — MCIDs, Parent Tree, Seitenreferenzen — geschieht intern und entfernt den fehleranfälligsten Teil von handgebautem Tagging

  • Eingabe-PDF, Vorlagenversion, Verarbeitungskonfiguration und Ausgabeziel für das Compliance- und Signatur-Workbench
  • font subset naming, encoding diagnostics, and missing ToUnicode handling
  • confidence flags for OCR layers, hidden text, clipped content, and rotated pages
  • Welche Warteschlange bekommt sie unter diesen Voraussetzungen: Dunkelverarbeitung, manuelle Prüfung oder Quarantäne
  • Aufbewahrungsregeln für Protokolle, Diagnosepakete, temporäre Dateien, Zertifikate und Kundendaten

Identifizieren Sie zuerst den Dokumentenstatus, bevor Sie das Compliance- und Signatur-Workbench ausführen

Gezeichnete Gitterlinien bedeuten außerhalb des Bildschirms nichts. Was Screenreader navigieren, sind Strukturbeziehungen: welche Zellen Kopfzellen sind, wofür jeder Kopf gilt und wie Datenzellen in unregelmäßigen Layouts an Köpfe gebunden werden. Die Strukturelement-Attributaufrufe behandeln alle drei:

  1. extract images with page location, dimensions, color space, and original object data when needed
  2. Führen Sie die Compliance- und Signatur-Workbench-Verarbeitung gemäß der benannten Konfiguration aus und protokollieren Sie Warnungen in jeder Phase
  3. produce an analysis report that distinguishes facts from inferred reading order
  4. Ungetaggte, aber textreiche Dateien. Heuristische Reihenfolge ist für lineare Berichte meist richtig und für Layouts mit Seitenleisten oder Zwischenzitaten falsch. Kennzeichnen Sie die Reihenfolge in der UI und im Diagnoselog als geschätzt
  5. Reine Bildscans. Es gibt überhaupt keine Textebene. Erkennen Sie sie über leere Reading Units und führen Sie den Benutzer zu einem vorgelagerten OCR-Schritt, statt den Reader nichts sprechen zu lassen

ByteRange-Arithmetik, die Abdeckung beweist

Annotation-Navigation hat einen eigenen Knopf. PDF/UA erwartet, dass die Tastaturnavigation durch Formularfelder und Links der Strukturreihenfolge folgt, und SetTabOrderMode schreibt den seitenbezogenen Tab-Order-Eintrag, den Viewer beachten, während GetTabOrderMode für das Audit eingehender Dateien verfügbar ist. Es ist genau die Art Anforderung, die niemand bemerkt, bis ein reiner Tastaturnutzer den Fehler meldet, und sie kostet einen Aufruf pro Dokument

  • warnings for hidden, clipped, rotated, or overlapping content
  • terminology snapshot: text extraction, image extraction, font resource, ToUnicode
  • Radiogruppen mit gemeinsamem Namen. Ein Feld, viele Widgets. Die Wertzuweisung wählt, welches Widget angehakt erscheint, und UI-Code pro Widget, der one-name-one-rectangle annimmt, zeichnet den falschen Fokusring
  • Berechnete Felder. Summen, die Dokument-JavaScript berechnet, aktualisieren sich über Feldereignisse. Ein programmatisches Füllen, das Ereignisse umgeht, sollte entweder neu berechnen oder die berechneten Felder explizit überschreiben — ein Formular auszuliefern, in dem Positionen und Summe widersprechen, ist schlechter als beide Optionen
  • Einsatzfall vor der Codeänderung festlegen

Compliance- und Signatur-Workbench ist kein einzelner PDF-Aufruf

Die PDFlibPas-Integration sollte Quell-PDF, Seitenobjekte, Schriftarten, Formulare, Signaturen, Berechtigungen, Validierer und Ziel-Viewer im selben Projektmodell platzieren. So kann das Team bei Unstimmigkeiten beim Compliance- und Signatur-Workbench erklären, warum Dokumente akzeptiert, geändert, abgelehnt oder archiviert wurden

Für den Kunden sichtbares Verhalten

Copyright 2026 losLab Software

  • extract images with page location, dimensions, color space, and original object data when needed
  • Führen Sie die Compliance- und Signatur-Workbench-Verarbeitung gemäß der benannten Konfiguration aus und protokollieren Sie Warnungen in jeder Phase
  • produce an analysis report that distinguishes facts from inferred reading order
  • Run the workflow on an empty file, a normal customer file, and a worst-case file
  • Open the generated PDF with the target viewer, validator, printer, or downstream application

Technische Kernpunkte zur Überprüfung: Compliance- und Signatur-Workbench

Home · Suche · losLab.com

  • Entscheidung: Eingabe-PDF, Vorlagenversion, Verarbeitungskonfiguration und Ausgabeziel für Compliance- und Signatur-Workbench. Konzentrieren Sie sich bei der Implementierung auf die Ausführung der entsprechenden Compliance- und Signatur-Workbench-Verarbeitung gemäß der benannten Konfiguration und protokollieren Sie Warnungen in jeder Phase. Die Abnahmebelege sollten Ergebnisse von Ziel-Viewern, Validierern, Druckprozessen oder Downstream-Anwendungen enthalten. Die Regressionsproben müssen auch abdecken, dass jeder Schritt, der Signaturen, Berechtigungen oder Archivierungsemantik ändert, explizit aufgezeichnet werden muss
  • ligatures and custom encodings can make copied text differ from visible text
  • images may be masks, soft masks, or repeated resources rather than standalone pictures
  • OCR layers can contain stale or misaligned text over scanned pages

Grenzfälle beim Compliance- und Signatur-Workbench, die leicht Probleme aufdecken

Diese Situationen decken am ehesten Probleme bei Implementierungen auf Beispielniveau auf und sollten jeweils in benannte Regressionsproben aufgenommen werden

  • Run the workflow on an empty file, a normal customer file, and a worst-case file
  • Open the generated PDF with the target viewer, validator, printer, or downstream application
  • Log product version, profile version, input hash, output path, elapsed time, and warning count
  • Keep passwords, certificates, temporary files, and customer data under explicit retention rules
  • Add regression documents when a customer file exposes a new edge case

Product documentation

In Delphi oder C++Builder wird empfohlen, PDFlibPas-Aufrufe hinter einer kleinen Dienstgrenze zu kapseln. Die Geschäftsebene übergibt nur Dateien, Streams, Konfigurationen und Anmeldeinformationen, während die Dienstebene Ausgabepfade, Warnungen, Metriken und Validierungsstatus zurückgibt. Zu den in diesem Artikel behandelten wichtigen Begriffen gehören , , , , ,

Delphi-Codebeispiel

Das folgende Delphi-Beispiel zeigt die Umsetzung dieses Themas in der Geschäftsdienstleistungsebene. Wenn Sie Richtlinienprüfungen, Protokollierung und Validierung außerhalb der Komponentenaufruf-Grenzen platzieren, werden nachfolgende Tests und Fehlerbehebungen stabiler

procedure RunComplianceSigningJob(const InputFile, OutputFile: string; const Policy: TSigningPolicy);
var
  Pdf: TPDFlib;
begin
  Pdf := TPDFlib.Create;
  try
    Pdf.LoadFromFile(InputFile, Policy.OpenPassword);
    PrepareComplianceEvidence(Pdf, Policy);
    CompleteSigningWorkflow(Pdf, OutputFile, Policy);
    ValidateSignedOutput(OutputFile, Policy.ProfileName);
  finally
    Pdf.Free;
  end;
end;

Checkliste für den Go-Live

  • Führen Sie den Prozess jeweils mit einer leeren Datei, einer normalen Kundendatei und einem PDF für den schlimmsten Fall aus
  • Öffnen Sie die Ausgabe mit Ziel-Viewern, Validierern, Druckprozessen oder Downstream-Systemen
  • Produktversion, Konfigurationsversion, Eingabe-Hash, Ausgabepfad, benötigte Zeit und Anzahl der Warnungen protokollieren
  • Festlegung klarer Aufbewahrungsregeln für Passwörter, Zertifikate, temporäre Dateien und Kundendaten
  • Wenn Kunden-PDFs neue Grenzfälle offenbaren, fügen Sie die Proben dem Regressionssatz hinzu

Relevante Produktdokumentation

Bevor Sie diesen Prozess in ein wiederverwendbares internes Werkzeug kapseln, lesen Sie bitte die Produktseite und die API-Dokumentation:

Zusätzliche Codebeispiele

ProcessID := PDF.NewSignProcessFromFile('invoice-fixed.pdf', '');
if ProcessID = 0 then
  raise Exception.Create('Cannot open source for signing');
PDF.SetSignProcessField(ProcessID, 'ApprovalSig');
PDF.SetSignProcessPFXFromFile(ProcessID, 'company.pfx', PfxPassword);
PDF.SetSignProcessInfo(ProcessID, 'Invoice approval', 'Berlin', 'billing@example.com');
PDF.SetSignProcessCustomSubFilter(ProcessID, 'ETSI.CAdES.detached');  // PAdES baseline
PDF.SetSignProcessDigestAlgorithm(ProcessID, 2);                      // SHA-256
PDF.SetSignProcessReserveContentsBytes(ProcessID, 8192);              // room for a later timestamp
PDF.EndSignProcessToFile(ProcessID, 'invoice-signed.pdf');
if PDF.GetSignProcessResult(ProcessID) <> 1 then
  Writeln('Sign failed, code ', PDF.GetSignProcessResult(ProcessID));
PDF.ReleaseSignProcess(ProcessID);
var
  Doc: TPDFlibSignDoc;
  Names: TStringList;
  FS: TFileStream;
  I: Integer;
  SourceSize, RangeStart, GapStart, TailStart, TailLen: Int64;
begin
  // Capture the size before Open: the audit object holds a share lock on the file
  FS := TFileStream.Create('invoice-signed.pdf', fmOpenRead or fmShareDenyNone);
  SourceSize := FS.Size;
  FS.Free;
  Doc := TPDFlibSignDoc.Create;
  Names := TStringList.Create;
  try
    if not Doc.Open('invoice-signed.pdf', '', False) then Exit;
    Doc.GetSignatureFieldNames(Names);
    for I := 0 to Names.Count - 1 do
      if Doc.GetSignatureValueObjNum(Names[I]) > 0 then  // > 0 means the field is signed
      begin
        RangeStart := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 11)));
        GapStart   := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 12)));
        TailStart  := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 13)));
        TailLen    := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 14)));
        if (RangeStart = 0) and (TailStart + TailLen = SourceSize) then
          Writeln(Names[I], ': signature covers the file to EOF')
        else
          Writeln(Names[I], ': earlier revision, or unusual ByteRange layout');
      end;
    Doc.Close;
  finally
    Names.Free;
    Doc.Free;
  end;
end;