Tesseract-OCR-Adapter
HPDFTesseractRecognition stellt optionale Windows-Engines bereit, die IHPDFOCREngine für durchsuchbare OCR-Textschichten implementieren
Native DLL-Fabrik
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
Stellen Sie eine vorhandene Tesseract-DLL mit Tesseract-5-kompatibler C-API, ein tessdata-Verzeichnis und einen ASCII-Sprachbezeichner oder eine Kombination wie eng, chi_sim oder chi_sim+eng bereit
Die Bibliotheksarchitektur muss zur Anwendung passen: Eine Win32-Anwendung lädt eine 32-Bit-DLL, während eine Win64-Anwendung eine 64-Bit-DLL lädt
Halten Sie benötigte Abhängigkeits-DLLs neben der gewählten Bibliothek oder in standardmäßigen Windows-Loader-Verzeichnissen; der Adapter lädt den expliziten Bibliothekspfad, ohne das aktuelle Verzeichnis oder den Prozesssuchpfad zu verändern
Die Fabrik verifiziert jede angeforderte .traineddata-Datei, lädt die Bibliothek und löst die erforderlichen Exporte auf, bevor sie zurückkehrt; ungültige Pfade, Modelle oder Optionen, fehlende Exporte, Architekturkonflikte und nicht verfügbare Abhängigkeiten lösen eine Ausnahme aus
Es wird keine OCR-Laufzeit gebündelt, und keine Modelle werden automatisch heruntergeladen
Beide Fabriken stehen im Windows-FPC/Lazarus-Paket ebenso wie in Delphi- und C++Builder-Builds zur Verfügung; bauen Sie Lib/FPC/HotPDFLaz.lpk für die Zielarchitektur neu, bevor Sie HPDFTesseractRecognition verwenden
Der native FPC-Adapter liest das aktuelle LCL-Raw-Image, einschließlich über Scanlines geschriebener Pixel, und bewahrt Unicode-Wörter unabhängig von der ANSI-Codepage des Systems
Optionen
THPDFTesseractOptions = record
PageSegMode: THPDFTesseractPageSegMode;
EngineMode: THPDFTesseractEngineMode;
TimeoutMilliseconds: Cardinal;
MaxPixels: Integer;
class function Default: THPDFTesseractOptions; static;
end;
Rufen Sie THPDFTesseractOptions.Default auf, bevor Sie Felder überschreiben; derselbe Record konfiguriert die native DLL-Fabrik oder die lokale CLI-Options-Überladung
| Feld | Standard | Bedeutung |
|---|---|---|
PageSegMode | tpsAuto | Automatische Seitensegmentierung ohne Ausrichtungsbestimmung |
EngineMode | temDefault | Der von den gewählten Sprachmodellen unterstützte Engine-Modus |
TimeoutMilliseconds | 60000 | Eine Anfragedeadline von 1 bis 3.600.000 Millisekunden; die DLL kooperiert mit dem Abbruch, während der CLI-Worker bei Timeout terminiert wird |
MaxPixels | 16777216 | Das Eingabe-Pixelbudget, konfigurierbar von 1 bis 67.108.864 Pixel |
THPDFTesseractPageSegMode = (
tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
tpsRawLine);
THPDFTesseractEngineMode = (
temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);
tpsOSDOnly und tpsAutoOnly führen keine Wörterkennung durch und werden vom Adapter zurückgewiesen; tpsAutoOSD und tpsSparseTextOSD benötigen zusätzlich osd.traineddata
Verwenden Sie tpsSingleLine für eine einzelne Textzeile, tpsSingleBlock für einen einheitlichen Block oder tpsSparseText für verstreuten Text; diese Modi reparieren weder die Perspektive eines Scans noch liefern sie eine allgemeine Layoutgarantie
temLSTMOnly erfordert LSTM-Modelle, während Legacy-Modi entsprechende Legacy-Modellkomponenten voraussetzen; nicht unterstützte Kombinationen scheitern während der nativen Initialisierung
Beispiel für durchsuchbares PDF
Das PDF muss bereits geladen sein, und DLL, Abhängigkeiten und Sprachmodelle müssen an den gezeigten Orten installiert sein
uses SysUtils, HPDFDoc, HPDFTesseractRecognition;
procedure AddNativeOCRText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
NativeOptions: THPDFTesseractOptions;
LayerOptions: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
NativeOptions := THPDFTesseractOptions.Default;
NativeOptions.EngineMode := temLSTMOnly;
NativeOptions.PageSegMode := tpsAuto;
Engine := HPDFCreateTesseractDLLOCREngine(
'C:\OCR\libtesseract-5.dll', 'C:\OCR\tessdata',
'chi_sim+eng', NativeOptions);
LayerOptions := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, LayerOptions, Info) then
raise Exception.Create(string(Info.Diagnostic));
end;
Ergebnisse und Besitzverhältnisse
Der Adapter kopiert die geliehene Bitmap in einen Top-down-Graustufenpuffer, reicht die angeforderte DPI weiter und erkennt über eine anforderungslokale native API-Instanz
Wörter behalten die native Lesereihenfolge, validierten UTF-8-Unicode-Text, Pixelgrenzen mit Ursprung oben links und eine Konfidenz, die von 0 bis 100 auf 0 bis 1 skaliert; ergänzende Zeichen verbrauchen zwei UTF-16-Einheiten
Verfügbare Wort-Baselines werden mit beiden Endpunkten durchgereicht; steht keine Baseline zur Verfügung, greift der vorhandene Geometrie-Fallback der Textschicht
Bei einer überwiegend vertikalen Baseline verwendet der native Adapter die Breite der Wortbox als TextHeightPixels; horizontale Baselines nutzen die Boxhöhe, auch bei umgekehrter Leserichtung, damit die Länge eines vertikalen Worts nicht zu seiner Schriftgröße wird
Dies ist eine Schätzung entlang der dominierenden Achse: Aus einer achsenparallelen Wortbox und Baseline allein lässt sich die exakte Texthöhe bei beliebigen Schrägwinkeln nicht rekonstruieren
Eine leere Seite gilt mit einem leeren Wort-Array als erfolgreich; fehlerhaftes UTF-8, eingebettete Steuerzeichen, ungültige Geometrie oder Konfidenz, erschöpfte Wort- oder Textbudgets, Abbruch und Erkennungsfehler liefern False, verwerfen alle partiellen Wörter und füllen die Diagnose
Jede Anfrage gibt ihren Iterator, die allokierten nativen Zeichenfolgen, den Monitor und die API-Instanz frei; das Freigeben des Adapters entlädt seine Bibliotheksreferenz
Grenzen und Abbruch
Eingabeabmessungen müssen jeweils höchstens 32.767 Pixel betragen und in MaxPixels passen; erkannter Text muss in das MaxTextCodeUnits-Budget der Anfrage und in die Grenze des Adapters von 1.048.576 UTF-16-Einheiten passen, und die Wortanzahl muss in MaxWords passen
Der Adapter prüft Abbruch und verstrichene Zeit während Bitmap-Konvertierung und Ergebnisiteration und stellt der Erkennung einen nativen Monitor mit verbleibender Deadline und Abbruch-Callback bereit
Nativer Abbruch ist kooperativ: Tesseracts Monitor deckt die Wörterkennung ab und unterbricht nicht jeden Initialisierungs- oder Layoutanalyse-Schritt; diese Aufrufe können abschließen, bevor ein angeforderter Abbruch oder eine abgelaufene Deadline gemeldet wird
Pixel- und Ausgabebudgets setzen dem Modell- oder Erkennungsspeicher der nativen Bibliothek keine harte Grenze; verwenden Sie den Prozessadapter, wenn die Anwendung einen separat beendbaren Worker benötigt
ApplyLoadedOCRTextLayer validiert alle Ergebnisse und veröffentlicht jede gewählte Seite atomar, sodass ein Adapterfehler das geladene Dokument unverändert lässt
Der DLL-Adapter weist ungültiges UTF-8 zurück, schneidet dekodierten Worttext zurecht und weist verbleibende C0-, DEL- und C1-Steuerzeichen zurück, bevor er Ergebnisse liefert, sodass fehlerhafter Text die Anfrage scheitern lässt, statt stillschweigend von der PDF-Textschicht ausgelassen zu werden
Lokale CLI-Fabrik
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 Options-Überladung reicht PageSegMode als --psm und EngineMode als --oem weiter, verwendet das konfigurierte Timeout und prüft MaxPixels, bevor die geliehene Bitmap gespeichert oder ein Worker gestartet wird
Die vorhandene Timeout-Überladung bewahrt automatische Seitensegmentierung und den von der ausführbaren Datei gewählten Engine-Modus, ohne ein neues Adapter-Pixellimit zu erzwingen; verwenden Sie die Options-Überladung, wenn eine explizite Eingabegrenze erforderlich ist
Beide Überladungen behalten angeforderte DPI, TSV-Ausgabe, eingeschränkte vererbte Handles, Abbruch-Polling und Worker-Terminierung bei Fehlern bei; die CLI hat keine nativen Baseline-Informationen, begrenzt die TSV-Ausgabe auf 64 MiB und die Diagnosedatei-Ausgabe auf 1 MiB
Ungültige Segmentierungsmodi, Engine-Modi, Timeouts und Pixellimits lösen beim Erstellen der konfigurierten Engine EArgumentException aus; Modellverfügbarkeit, einschließlich osd.traineddata für Ausrichtungsmodi, und Modell-/Engine-Kompatibilität prüft die ausführbare Datei während der Erkennung
var
CLIOptions: THPDFTesseractOptions;
Engine: IHPDFOCREngine;
begin
CLIOptions := THPDFTesseractOptions.Default;
CLIOptions.PageSegMode := tpsSingleLine;
CLIOptions.EngineMode := temLSTMOnly;
CLIOptions.MaxPixels := 8000000;
Engine := HPDFCreateTesseractOCREngine(
'C:\OCR\tesseract.exe', 'C:\OCR\tessdata', 'eng', CLIOptions);
end;
Verwenden Sie tpsSingleWord für ein isoliertes Wort, tpsSparseText für verstreuten Text oder tpsSingleBlockVertical mit einem geeigneten vertikalen Textmodell für einen vertikalen Block; die Fabrik beschneidet Seiten nicht und wählt keine Modelle automatisch aus
Der CLI-Adapter validiert UTF-8 strikt, weist NUL-Bytes und C0/C1-Steuerzeichen innerhalb erkannter Wörter zurück und verwirft alle Ergebnisse, wenn fehlerhafte Ausgabe einem ansonsten gültigen Wort folgt
Siehe Durchsuchbare OCR-Textschichten für das CLI-Beispiel, Rendering-Optionen, Gruppierung optionaler Inhalte und Konformitätsgrenzen