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
ch_PP-OCRv4_det_mobile.onnxch_PP-OCRv4_rec_mobile.onnxch_ppocr_mobile_v2.0_cls_mobile.onnx
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
THotPDF.ApplyLoadedOCRTextLayerIHPDFOCREngineTHPDFOCRRequestTHPDFOCRWordTHPDFOCRTextLayerOptionsTHPDFOCRTextLayerInfoTHPDFOCRTextLayerStatus
Progressive Darstellung und Abbruch · Methode ExtractLoadedPageText