掃描前置處理與結構化 OCR
HPDFScanPreprocess 接受呼叫端自有的 Graphics.TBitmap,回傳私有的校正後影像與可逆幾何;HPDFScanOCRWorkflow 使用既有的 IHPDFOCREngine,回傳映射後的文字與語意版面
隨附的驗收設定檔涵蓋 Delphi 與 Windows 上的 FPC/Lazarus;Tesseract OSD 處理程序配接器使用 Windows API,不屬於原生 Linux headless document 設定檔的一部分
校正與證據
校正順序為呼叫端提供的透視四邊形、順時針方向旋轉,以及連續角度去斜,採雙線性反向取樣,來源區域之外以白色填滿
明確指定的方向支援順時針 0、90、180、270 度;自動判斷方向需要偵測器,證據不足或格式錯誤時會拒絕
HPDFScanOrientationTesseract 提供實際的 Windows Tesseract OSD 配接器,使用明確指定的執行檔與包含 osd.traineddata 的 tessdata 目錄;它以隱藏處理程序直接執行 --psm 0 -l osd --dpi 300,不經過 shell
原始方向邊界閾值預設為 15;LastOrientationScore 保留實際的 Tesseract 分數,正規化信心值為分數除以 15,並限制在 [0, 1];這個正規化只是證據尺度,不是校準過的機率
自動去斜會取樣實際的深色像素,比較有界角度範圍內的逐列投影集中度;預設範圍是 ±10 度、以 0.25 度為步進,證據門檻為 0.2;證據不足時保留明確角度並記錄 DeskewAccepted = False
明確去斜接受 -180 到 180 度之間的任意連續角度;自動搜尋半徑最多 45 度,步進必須在 0.1 到 5 度之間
透視校正需要來源點陣內一個有限、凸、按左上、右上、右下、左下排序的四邊形,以及明確的目標尺寸;不提供自動四邊形偵測
清理與有限預算
預設行為會正規化各 tile 局部陰影、移除連續的深色邊緣列與行,並保留灰階輸出;可選用 3×3 中值降噪與二值輸出
清理會把邊緣像素洗白,但不改變座標原點;RemovedBorderPixels 回報受影響的像素數,整片空白的點陣則直接跳過 OCR
預設上限為每個維度 32768 像素、輸入與輸出各 16777216 像素、保守估算 512 MiB 的工作配置量、500000000 個工作單位與 20000 個去斜取樣;來源像素還必須能放進帶正負號整數索引
這個估算涵蓋自有的點陣複本、灰階陣列、輸出儲存、取樣與長條圖;不涵蓋呼叫端的來源點陣圖、作業系統圖形配置,或任意外部 OCR 引擎
Tesseract OSD 另外對像素與合併的 stdout/stderr 設上限,每 25 毫秒輪詢取消狀態與輸出大小,並在逾時、取消或輸出超量時終結子處理程序;逾時必須在 1 到 3600000 毫秒之間,輸出上限在 1024 到 1048576 bytes 之間
所有權與回溯
HPDFPreprocessScan 絕不修改來源點陣圖;成功時由呼叫端釋放 OutputBitmap,失敗時回傳 nil 與帶診斷證據的狀態
偵測器收到的是私有複本;取消為合作式,發生在列、候選角度、處理程序等待與文字處理等邊界;提供的 OCR 引擎必須遵守請求 token 以及自身的處理程序與輸出限制
工作流程在每次失敗後清空文字、語意版面與行四邊形;配接器維護可變的最後回報狀態,應序列使用
幾何與結構化 OCR
點陣座標採左上原點與像素中心;齊次矩陣作用於行向量 (X, Y, 1),並除以第三個分量;轉換乘法 A × B 表示先套用 B
SourceToOutput 與 OutputToSource 保留完整的仿射或射影操作;使用公開輔助函式時,請分別映射輸入與輸出記錄
OCR 包裝層把校正後的點陣連同未旋轉的暫存 PDF 邊界交給引擎,驗證 UTF-16 與有限的文字矩形,丟棄信心不足或無法映射的文字,再把矩形、基線與四個角映射回原始點陣
PageQuad 與語意邊界會計算輸入 PDF 的頁面框、DPI,以及 0、90、180 或 270 度的頁面旋轉;閱讀順序在校正擺正後的框架中分析,然後才把幾何映射回去
字元區間由 OCR 文字框內插而得,屬近似值;行四邊形保留了軸對齊邊界無法表達的旋轉與透視
HPDFScanOCRLayoutToDOM 依分析順序建立自有的可編輯堆疊,偵測到的標題用標題節點,其餘行用文字節點
範例
Options := HPDFDefaultScanOCRWorkflowOptions;
Options.Preprocess.AutoOrientation := True;
Detector := HPDFCreateTesseractOrientationDetector(
TesseractExecutable, OSDModelDirectory,
HPDFDefaultTesseractOrientationOptions);
Adapter := HPDFCreateScanPreprocessingOCREngine(
ExistingOCREngine, Options, Detector);
if Adapter.Recognize(Request, Words, Diagnostic) then
begin
Report := Adapter.LastReport;
DOM := HPDFScanOCRLayoutToDOM(Report);
try
// Consume the editable semantic output here
finally
DOM.Free;
end;
end;
驗證
非 GUI 的 Delphi 測試套件檢查明確方向、±179.25 度內可逆的連續角度、真實 Tesseract 的 0/90/180/270 自動方向與空白拒判、真實五度自動歪斜校正、雜訊與陰影清理、透視四角、上限預算、取消、來源不可變性,以及在包含 37.5 度掃描在內的六種點陣變體上執行真實英文 OCR
實際 OCR 案例中每個獲接受的文字角點,都會透過逆轉換映射回去,並在校正後點陣的 1e-6 像素內比對;FPC smoke 套件另外執行真實去斜、取消、配置上限、180 度與空白 OSD,以及真實英文 OCR 版面
產生的公開標頭可在 C++Builder Win32 與 Win64x 下編譯,涵蓋受管 OCR 報告、預設介面參數、幾何轉換與 DOM 所有權
設定 HOTPDF_TESSERACT_EXE、OSD 模型用的 HOTPDF_TESSDATA,以及英文模型用的 HOTPDF_OCR_TESSDATA,即可啟用外部引擎驗證;缺少選填的執行期設定並不會建立真實 OCR 驗收