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

FeldStandardBedeutung
PageSegModetpsAutoAutomatische Seitensegmentierung ohne Ausrichtungsbestimmung
EngineModetemDefaultDer von den gewählten Sprachmodellen unterstützte Engine-Modus
TimeoutMilliseconds60000Eine Anfragedeadline von 1 bis 3.600.000 Millisekunden; die DLL kooperiert mit dem Abbruch, während der CLI-Worker bei Timeout terminiert wird
MaxPixels16777216Das 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