Durchsuchbare OCR-Textschichten

HotPDF kann ausgewählte geladene Seiten für eine von der Anwendung bereitgestellte OCR-Engine rendern und atomar durchsuchbaren unsichtbaren Unicode-Text hinzufügen, der an jedes erkannte Wort ausgerichtet ist

Das SearchableOCR-Konsolenbeispiel liefert einen lauffähigen Workflow: Erzeugen Sie mit --create-sample ein dreiseitiges Nur-Bild-Beispiel, wählen Sie eingebaute OCR, RapidOCR oder Tesseract DLL/CLI-Erkennung, wählen Sie Seiten, konfigurieren Sie Konfidenz und Ressourcengrenzen und speichern Sie eine durchsuchbare Kopie mit Konversionsstatistiken

Engine-Integration

Implementieren Sie IHPDFOCREngine mit jedem der Anwendung verfügbaren synchronen OCR-Provider

Die Engine empfängt eine geliehene TBitmap, die angeforderte DPI, die normalisierte Seitenrotation, Media-Box-Koordinaten, verbleibende Wort- und UTF-16-Budgets sowie das wirksame Abbruchtoken über THPDFOCRRequest

Wortboxen und optionale Baselines verwenden Pixelkoordinaten der Bitmap mit Ursprung oben links, und die Engine darf die geliehene Bitmap nach der Rückkehr von Recognize weder behalten noch freigeben

Optionale lokale Engines

Version 2.754.0 fügt auf Windows explizite Tesseract- und RapidOCR-Fabriken hinzu, die IHPDFOCREngine zurückgeben; die Überladung ohne Engine wählt weiterhin die vorhandene eingebaute Engine

Installieren und provisionieren Sie die gewählte Engine lokal, bevor Sie ihren Adapter erstellen, und übergeben Sie diesen Adapter dann an die Engine-Überladung von ApplyLoadedOCRTextLayer; ausführbare Dateien, Python-Pakete und OCR-Modelle sind optionale externe Abhängigkeiten und werden nicht mit HotPDF gebündelt

Tesseract

Der optionale native Tesseract-DLL-Adapter ergänzt konfigurierbare Seitensegmentierungs- und Engine-Modi, mehrsprachige Erkennung und native Wort-Baselines über HPDFCreateTesseractDLLOCREngine und THPDFTesseractOptions

function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;

Die Deklaration steht in HPDFTesseractRecognition; stellen Sie eine ausführbare Tesseract-Datei mit TSV-Ausgabefähigkeit und ein Datenverzeichnis mit dem angeforderten Sprachmodell bereit, etwa chi_sim.traineddata für chi_sim

Die Options-Überladung nimmt THPDFTesseractOptions.Default mit expliziter Seitensegmentierung, Erkennungs-Engine-Modus, Timeout und Eingabe-Pixelgrenze; wählen Sie tpsSingleLine, tpsSingleWord oder tpsSparseText, passend zum Eingabe-Layout, wie in Tesseract-OCR-Adaptern gezeigt

Dieses Beispiel setzt voraus, dass die ausführbare Datei und die Daten bereits unter den gezeigten Pfaden installiert sind und PDF eine geladene THotPDF-Instanz ist

uses SysUtils, HPDFDoc, HPDFTesseractRecognition;

procedure AddTesseractText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  Options: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  Engine := HPDFCreateTesseractOCREngine(
    'C:\OCR\Tesseract\tesseract.exe',
    'C:\OCR\Tesseract\tessdata', 'chi_sim', 60000);
  Options := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
    raise Exception.Create('OCR text layer was not added');
end;

RapidOCR

Der native RapidOCR-DLL-Adapter erkennt Speicher-Snapshots mit persistenten In-Process-CPU-ONNX-Modellen über HPDFCreateRapidOCRDLLOCREngine, mit optionaler Winkelklassifikation und kooperativem Abbruch in Delphi-, C++Builder- und Windows-FPC/Lazarus-Builds

Der RapidOCR-Adapter für lokale Modelle stellt zusätzlich eine THPDFRapidOCROptions-Überladung für explizite ONNX-Modellpfade, optionale Winkelklassifikation, lokale Zeichenwörterbücher und Schriftarten, CPU-Thread-Limits und ein Eingabe-Pixelbudget in Delphi-, C++Builder- und FPC/Lazarus-Builds bereit

function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine;

Die Deklaration steht in HPDFRapidOCRRecognition; provisionieren Sie Python mit rapidocr und onnxruntime, der mitgelieferten Brücke tools/OCR/rapidocr_tsv.py und diesen drei lokalen Modellen

Die Brücke benötigt außerdem %WINDIR%\Fonts\arial.ttf für den Ergebniscontainer von RapidOCR, deaktiviert automatische Downloads und verwendet einen ONNX-Thread pro konfiguriertem Ausführungspool; fehlende Modelle, Pakete oder die lokale Schriftart führen zum Fehlschlagen der Erkennung

Die aktuelle Brücke verwendet die Konfiguration des vereinfachten chinesischen Modells und bewahrt erkannte Satzzeichen ohne Ersetzung durch Vollbreite oder Halbbreite

uses SysUtils, HPDFDoc, HPDFRapidOCRRecognition;

procedure AddRapidOCRText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  Options: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  Engine := HPDFCreateRapidOCREngine(
    'C:\OCR\Python\python.exe',
    'C:\HotPDF\tools\OCR\rapidocr_tsv.py',
    'C:\OCR\RapidOCR\models', 60000);
  Options := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
    raise Exception.Create('OCR text layer was not added');
end;

Beide Fabriken validieren vorhandene ausführliche Pfade und Datenpfade und akzeptieren ein Timeout von 1 bis 3.600.000 Millisekunden mit Standard 60.000; eine ungültige Konfiguration wirft EArgumentException

Der gemeinsame Adapter startet einen verborgenen lokalen Prozess mit in Anführungszeichen gesetzten Pfaden und eingeschränkten vererbten Handles, pollt Abbruch, Timeout und Ausgabegrößen alle 25 Millisekunden und beendet den Prozess bei einem Fehler, bevor er temporäre Dateien aufräumt

Die TSV-Ausgabe ist auf 64 MiB und die Ausgabe der Diagnosedatei auf 1 MiB begrenzt, wobei zurückgegebene Diagnosen auf 4.096 Zeichen gekürzt werden; erkannte Wörter müssen außerdem in die Wort- und UTF-16-Budgets sowie in gültige Bitmap-Grenzen der Anforderung passen

Die TSV-Erkennungsausgabe muss gültiges UTF-8 sein und darf keine NUL-Bytes oder C0/C1-Steuerzeichen innerhalb erkannter Wörter enthalten; fehlerhafte Ausgabe lässt die gesamte Erkennungsanfrage fehlschlagen, selbst wenn gültige Wörter dem Fehler vorausgehen

Dies sind Ausgabe- und Anforderungsgrenzen, keine harte Obergrenze für den Speicherverbrauch der externen Engine; Abbruch und Engine-Fehler kehren über den Status der Textschicht zurück, ohne partielle Seiten zu veröffentlichen

Erkennungsnachweis und Grenzen

Die lokale RapidOCR-3.8.4-Basislinie bestand alle 15 Wiederholungen über fünf feste chinesische Scanbereiche: zwei klare Bereiche bei 300 DPI und drei niedrigauflösende Druckbereiche bei 150 DPI, ausgewertet gegen die aktuellen Referenztranskripte mit einer Zeichenfehlerrate von höchstens 5 % und einer Löschrate von höchstens 2 %

Alle Wiederholungen bestanden die Lesereihenfolge-Prüfungen, insgesamt 5.190 Wort- oder Zeichenkoordinaten-Prüfungen und die Gleichheit sichtbarer Pixel bei 72 DPI; die beiden klaren Bereiche hatten gegen diese Referenzen null Zeichenfehler

Zwei KI-Visual-Reviews stimmen bei dem chinesischen Text und den Zahlen überein, aber einige Satzzeichen-Codepunkte im Raster bleiben mehrdeutig und die menschliche Entscheidung steht aus; Satzzeichenunterschiede zählen weiterhin als Fehler, und diese Ergebnisse sind Korpusnachweis, keine allgemeine Genauigkeitsgarantie

Geometrie und Suchtext

HotPDF invertiert die Seiten-Transformmatrix des Renderers, sodass Wort-Baselines auf Seiten ausgerichtet bleiben, die um 0, 90, 180 oder 270 Grad gedreht sind

Jedes akzeptierte Wort wird mit dem Text-Rendermodus 3 Tr, einer angepassten horizontalen Textskala und einer rotationsbewussten Textmatrix geschrieben, wobei das Seitenraster unverändert bleibt und die auswählbare Inhaltsreihenfolge bewahrt wird

Eine gemeinsame Type-0-Identity-H-Schrift weist begrenzte dokumentlokale CIDs Unicode-Skala zu und schreibt eine vollständige ToUnicode-Map, einschließlich UTF-16-Surrogat-Ziele für ergänzende Zeichen

Benachbarte lateinische und kyrillische Wörter auf derselben Baseline erhalten ein explizites Unicode-Leerzeichen, wenn ihre Geometrie eine Wortlücke anzeigt; benachbarte CJK-Wörter behalten ihren ursprünglichen Text ohne eingefügte Leerzeichen

Verarbeitung eines gescannten PDFs

Das Demo/Delphi/SearchableOCR/SearchableOCR.dpr-Konsolenbeispiel lädt ein gescanntes PDF, führt natives RapidOCR mit einem expliziten lokalen Sprachprofil aus, veröffentlicht unsichtbaren Unicode-Text auf allen geeigneten Seiten und speichert ein neues PDF, ohne einen Viewer zu öffnen

SearchableOCR.exe scan.pdf searchable.pdf --dll C:\HotPDF\Lib\Native\RapidOCR\Win64\HotPDFRapidOCR.dll --models C:\HotPDF\Lib\Native\RapidOCR\Models --language ru --dpi 300

Verwenden Sie --language ch für vereinfachtes Chinesisch oder --language chinese_cht für traditionelles Chinesisch; die DLL muss zur Architektur der ausführbaren Datei passen und das gewählte lokale Modellpaket muss installiert sein

Das Beispiel verweigert das Überschreiben einer vorhandenen Ausgabedatei und akzeptiert --replace-ocr, wenn eine markierte HotPDF-OCR-Textschicht aktualisiert wird

Windows FPC zeichnet beim JPEG-Scan-Dekodieren vor der Erkennung in das endgültige Bitmap-Pixelformat, sodass die LCL-Formatkonvertierung das dekodierte Bild behält

Aktualisieren einer vorhandenen OCR-Schicht

Setzen Sie THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer auf True, um zuvor erzeugte, markierte HotPDF-OCR-Streams auf erkannten Seiten in derselben Transaktion wie der neue Text zu ersetzen

Dies umgeht SkipPagesWithText nur auf markierten Seiten und funktioniert auch nach dem Speichern und erneuten Laden; THPDFOCRTextLayerInfo.ReplacedPageCount meldet die Anzahl der ersetzten Seiten

Erkennungsfehler und Seiten ohne akzeptierte Wörter bewahren die alte Textschicht; unmarkierte Streams, einschließlich OCR von Drittanbietern und Schichten früherer HotPDF-Versionen, bleiben erhalten

Der Ersatz trennt die alten OCR-Inhalts-Streams ab, entfernt jedoch keine Schriftressourcen oder Gruppen optionaler Inhalte, auf die anderswo noch verwiesen wird; inkrementelles Speichern kann ersetzte Objekte aus früheren Revisionen zurückhalten

Der Standard bleibt, jede Seite mit extrahierbarem Text zu überspringen, einschließlich einer Seitenzahl oder Kopfzeile über einem Scan; das Abschalten von SkipPagesWithText erkennt die ganze Seite und kann vorhandenen nativen Text duplizieren, daher erfordern gemischte Seiten eine von der Anwendung gewählte Verarbeitung

Grenzen, Abbruch und Atomarität

THPDFOCRTextLayerOptions.Default aktiviert die Erkennung mit 300 DPI, überspringt Seiten, die bereits Text offenlegen, und begrenzt Seitenzahl, Pixel, Wörter, UTF-16-Einheiten und erzeugte Inhaltsbytes

HotPDF validiert jedes Engine-Ergebnis und erstellt allen Seiteninhalt, bevor es eine einzelne Copy-on-Write-Graphtransaktion startet, sodass Engine-Fehler, ungültige Geometrie, erschöpfte Budgets, Abbruch oder Commit-Fehler den geladenen Objektgraphen unverändert lassen

Ein leeres Seitenindex-Array wählt jede geladene Seite aus, während doppelte Seitenindizes einmal in der Reihenfolge des ersten Auftretens erkannt werden

MaxTotalWords zählt alle empfangenen Wörter, einschließlich später verworfener Wörter mit niedriger Konfidenz oder ungültiger Form, und jede Seitenanfrage erhält nur das verbleibende Kontingent

Ist das Wort- oder UTF-16-Budget erschöpft und bleibt eine weitere infrage kommende Seite übrig, kehrt die Verarbeitung mit otlsBudgetExceeded zurück, bevor diese Seite gerendert oder erkannt wird, und veröffentlicht keinen der geplanten Textlayers; wegen vorhandenen Texts übersprungene Seiten benötigen kein verbleibendes Erkennungsbudget

Gruppierung optionaler Inhalte

Setzen Sie UseOptionalContentGroup, um allen erzeugten Text über das Resources/Properties-Wörterbuch jeder Seite an eine benannte Ebene zu binden

Diese Option erfordert PDF 1.5 und folgt StrictVersionLock; der Standard hält den unsichtbaren Text außerhalb einer Gruppe optionaler Inhalte für die breiteste Kompatibilität

Konformitätshinweis

Die erzeugte durchsuchbare Schicht verwendet absichtlich eine nicht eingebettete synthetische Schrift, da Rendermodus 3 nie Glyphen malt

Diese API erzeugt für sich genommen keine PDF/A-konforme OCR-Ausgabe, daher sollte ein PDF/A-Workflow einen Textschicht-Pfad mit eingebetteter Schrift verwenden und die angeforderte Konformitätsvalidierung vor der Veröffentlichung ausführen

Primäre APIs

Progressive Darstellung und Abbruch · Methode ExtractLoadedPageText