Tesseract OCR 轉接器
HPDFTesseractRecognition 為可搜尋 OCR 文字層提供實作 IHPDFOCREngine 的選用 Windows 引擎
原生 DLL 工廠
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
提供現有、公開 Tesseract 5 相容 C API 的 Tesseract DLL、一個 tessdata 目錄,以及 ASCII 語言識別碼或其組合,例如 eng、chi_sim 或 chi_sim+eng
程式庫架構必須與應用程式相符:Win32 應用程式載入 32 位元 DLL,Win64 應用程式載入 64 位元 DLL
必要的相依 DLL 請放在所選程式庫旁或標準 Windows 載入器目錄;轉接器載入明確指定的程式庫路徑,不會變更目前工作目錄或程序搜尋路徑
工廠會在回傳前驗證每個要求的 .traineddata 檔案、載入程式庫並解析必要的匯出;路徑、模型或選項無效、缺少匯出、架構不符與相依不可用都會丟出例外
HotPDF 不隨附任何 OCR 執行階段或模型,也不會自動下載
兩個工廠在 Windows FPC/Lazarus 套件以及 Delphi 與 C++Builder 組建中都可用;使用 HPDFTesseractRecognition 前,請先為目標架構重建 Lib/FPC/HotPDFLaz.lpk
原生 FPC 轉接器會讀取目前的 LCL 原始影像,包括透過 scanline 寫入的像素,並讓 Unicode 詞不受系統 ANSI 字碼頁影響而完整保留
選項
THPDFTesseractOptions = record
PageSegMode: THPDFTesseractPageSegMode;
EngineMode: THPDFTesseractEngineMode;
TimeoutMilliseconds: Cardinal;
MaxPixels: Integer;
class function Default: THPDFTesseractOptions; static;
end;
覆寫欄位前先呼叫 THPDFTesseractOptions.Default;同一份記錄可以用來組態原生 DLL 工廠,或本地 CLI 的選項多載
| 欄位 | 預設 | 意義 |
|---|---|---|
PageSegMode | tpsAuto | 自動頁面分割,不含方向偵測 |
EngineMode | temDefault | 所選語言模型支援的引擎模式 |
TimeoutMilliseconds | 60000 | 請求期限,1 到 3,600,000 毫秒;DLL 會合作式配合取消,CLI 工作程序則在逾時時被終止 |
MaxPixels | 16777216 | 輸入像素預算,可設 1 到 67,108,864 像素 |
THPDFTesseractPageSegMode = (
tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
tpsRawLine);
THPDFTesseractEngineMode = (
temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);
tpsOSDOnly 與 tpsAutoOnly 不做詞辨識,會被轉接器拒絕;tpsAutoOSD 與 tpsSparseTextOSD 另外需要 osd.traineddata
單行文字用 tpsSingleLine,均勻區塊用 tpsSingleBlock,零散文字用 tpsSparseText;這些模式不會修正掃描的透視畸變,也不提供一般性的版面保證
temLSTMOnly 需要 LSTM 模型,legacy 模式則需要對應的 legacy 模型元件;不支援的組合會在原生初始化時失敗
可搜尋 PDF 範例
PDF 必須已載入,且 DLL、相依程式庫與語言模型必須已安裝在所示位置
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;
結果與擁有權
轉接器把借用的點陣圖複製成由上而下的灰階緩衝區,轉發請求的 DPI,並透過請求本地的原生 API 執行個體辨識
詞保留原生閱讀順序、驗證過的 UTF-8 Unicode 文字、左上原點像素邊界,以及由 0 到 100 縮放到 0 到 1 的信賴度;補充字元消耗兩個 UTF-16 單元
可用的詞基線連同兩個端點一起傳遞;基線不可用時,改用既有的文字層幾何後備機制
基線以縱向為主時,原生轉接器用詞方框寬度當 TextHeightPixels;水平基線(包括反向閱讀方向)則用方框高度,直書詞的長度因此不會變成它的字型大小
這是主軸估計:光靠軸對齊的詞方框與基線,無法在任意傾斜角度下還原精確的文字高度
空白頁面以空詞陣列成功傳回;UTF-8 格式錯誤、內嵌控制字元、幾何或信賴度無效、詞數或文字預算耗盡、取消與辨識失敗都會回傳 False、清除所有部分詞並填入診斷資訊
每個請求都會釋放其迭代器、已配置的原生字串、monitor 與 API 執行個體;釋放轉接器則會卸載其程式庫參考
限制與取消
輸入的每個維度不得超過 32,767 像素並須符合 MaxPixels;辨識文字須符合請求的 MaxTextCodeUnits 預算與轉接器的 1,048,576 個 UTF-16 單元上限,詞數須符合 MaxWords
轉接器在點陣圖轉換與結果迭代期間檢查取消與經過時間,並在辨識時提供帶剩餘期限與取消 callback 的原生 monitor
原生取消是合作式的:Tesseract 的 monitor 涵蓋詞辨識,但不會中斷每個初始化或版面分析步驟;這些呼叫可能在要求的取消或逾期的期限被回報之前就完成
像素與輸出預算不會對原生程式庫的模型或辨識記憶體用量設下硬性限制;應用程式需要可個別終止的工作程序時,請改用程序轉接器
ApplyLoadedOCRTextLayer 會驗證所有結果並以原子方式發布每個選取的頁面,因此轉接器失敗不會改動已載入的文件
DLL 轉接器會拒絕無效的 UTF-8、修剪解碼後的詞文字,並在回傳結果前拒絕剩餘的 C0、DEL 與 C1 控制字元;格式錯誤的文字會讓請求失敗,而不是被 PDF 文字層默默略過
本地 CLI 工廠
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
選項多載把 PageSegMode 轉成 --psm、EngineMode 轉成 --oem,使用組態的逾時,並在儲存借用點陣圖或啟動工作程序之前檢查 MaxPixels
既有的逾時多載保留自動頁面分割與由執行檔選擇的引擎模式,不會另外加上轉接器像素限制;需要明確的輸入上限時請改用選項多載
兩種多載都保留指定 DPI、TSV 輸出、受限的繼承控制代碼、取消輪詢與失敗時終止工作程序;CLI 沒有原生基線資訊,TSV 輸出上限 64 MiB,診斷檔輸出上限 1 MiB
建立組態好的引擎時,無效的分割模式、引擎模式、逾時與像素限制會拋出 EArgumentException;模型可用性(包括方向模式需要的 osd.traineddata)與模型/引擎相容性由執行檔在辨識時檢查
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;
孤立的單詞用 tpsSingleWord,散落的文字用 tpsSparseText,單一直書區塊則把 tpsSingleBlockVertical 配上合適的直書模型;工廠不會自動裁切頁面或挑選模型
CLI 轉接器嚴格驗證 UTF-8,拒絕已辨識詞內的 NUL 位元組與 C0/C1 控制字元;在某個有效詞之後出現格式錯誤的輸出時,會清除全部結果
CLI 範例、轉譯選項、可選內容分組與合規限制請見 可搜尋 OCR 文字層