Các adapter Tesseract OCR
HPDFTesseractRecognition cung cấp các engine Windows tùy chọn hiện thực IHPDFOCREngine cho lớp văn bản OCR tìm được
Factory DLL native
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
Hãy cung cấp một DLL Tesseract đang có phơi C API tương thích Tesseract 5, một thư mục tessdata, và một định danh ngôn ngữ ASCII hoặc tổ hợp như eng, chi_sim, hoặc chi_sim+eng
Kiến trúc thư viện phải khớp ứng dụng: ứng dụng Win32 nạp DLL 32-bit, còn ứng dụng Win64 nạp DLL 64-bit
Đặt các DLL dependency cần thiết cạnh thư viện đã chọn hoặc trong các thư mục loader chuẩn của Windows; adapter nạp đường dẫn thư viện tường minh mà không đổi thư mục hiện hành hay search path của tiến trình
Factory xác thực mọi file .traineddata được yêu cầu, nạp thư viện, và phân giải các export bắt buộc trước khi trả về; đường dẫn, mô hình, options không hợp lệ, thiếu export, lệch kiến trúc, hay dependency không khả dụng đều raise exception
Không có runtime hay mô hình OCR nào được đóng gói sẵn hay tải xuống tự động
Cả hai factory đều có trong package Windows FPC/Lazarus cũng như các build Delphi và C++Builder; hãy build lại Lib/FPC/HotPDFLaz.lpk cho kiến trúc đích trước khi dùng HPDFTesseractRecognition
Adapter FPC native đọc raw image LCL hiện hành, gồm cả các pixel ghi qua scanline, và giữ nguyên các từ Unicode độc lập với ANSI code page của hệ thống
Options
THPDFTesseractOptions = record
PageSegMode: THPDFTesseractPageSegMode;
EngineMode: THPDFTesseractEngineMode;
TimeoutMilliseconds: Cardinal;
MaxPixels: Integer;
class function Default: THPDFTesseractOptions; static;
end;
Gọi THPDFTesseractOptions.Default trước khi ghi đè các trường; cùng một record này cấu hình được cả factory DLL native lẫn overload options của CLI cục bộ
| Trường | Mặc định | Ý nghĩa |
|---|---|---|
PageSegMode | tpsAuto | Phân đoạn trang tự động, không phát hiện hướng |
EngineMode | temDefault | Chế độ engine được các mô hình ngôn ngữ đã chọn hỗ trợ |
TimeoutMilliseconds | 60000 | Deadline yêu cầu từ 1 đến 3,600,000 milli-giây; DLL hợp tác với việc hủy, còn worker CLI bị chấm dứt khi hết hạn |
MaxPixels | 16777216 | Ngân sách pixel đầu vào, cấu hình được từ 1 đến 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 và tpsAutoOnly không thực hiện nhận dạng từ nào và bị adapter từ chối; tpsAutoOSD và tpsSparseTextOSD còn đòi hỏi thêm osd.traineddata
Dùng tpsSingleLine cho một dòng văn bản, tpsSingleBlock cho một khối đồng nhất, hoặc tpsSparseText cho văn bản rải rác; các chế độ này không sửa được triển vọng của bản scan và cũng không đảm bảo bố cục một cách tổng quát
temLSTMOnly đòi hỏi mô hình LSTM, còn các chế độ legacy đòi hỏi thành phần mô hình legacy tương ứng; tổ hợp không được hỗ trợ sẽ fail trong quá trình khởi tạo native
Ví dụ PDF tìm được
PDF phải được nạp sẵn, và DLL, dependency, cùng các mô hình ngôn ngữ phải được cài tại các đường dẫn hiển thị
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;
Kết quả và sở hữu
Adapter sao chép bitmap mượn vào một buffer grayscale top-down, chuyển tiếp DPI yêu cầu, và nhận dạng qua một thể hiện API native riêng cho từng yêu cầu
Các từ giữ thứ tự đọc native, văn bản Unicode UTF-8 đã xác thực, biên pixel trên-trái, và độ tin cậy được scale từ thang 0–100 về 0–1; ký tự bổ sung dùng hai đơn vị UTF-16
Baseline từ có sẵn được chuyển thẳng qua với cả hai điểm đầu-cuối; khi baseline không có, cơ chế fallback hình học hiện có của text layer được áp dụng
Với baseline chủ yếu dọc, adapter native dùng chiều rộng hộp từ làm TextHeightPixels; baseline ngang dùng chiều cao hộp, kể cả hướng đọc ngược, để độ dài của một từ dọc không biến thành cỡ chữ của nó
Đây là ước lượng theo trục trội: chỉ riêng hộp từ và baseline thẳng trục không thể khôi phục chính xác chiều cao văn bản ở các góc nghiêng tùy ý
Trang rỗng vẫn thành công với mảng từ rỗng; UTF-8 hỏng, ký tự điều khiển lồng trong, hình học hay độ tin cậy không hợp lệ, ngân sách từ hoặc văn bản cạn kiệt, hủy, và lỗi nhận dạng đều trả về False, xóa toàn bộ từ làm dở, và ghi vào chẩn đoán
Mỗi yêu cầu giải phóng iterator, các chuỗi native đã cấp phát, monitor, và thể hiện API của mình; giải phóng adapter sẽ unload tham chiếu thư viện
Giới hạn và hủy thao tác
Mỗi chiều đầu vào tối đa 32,767 pixel và phải nằm trong MaxPixels; văn bản nhận dạng được phải nằm trong ngân sách MaxTextCodeUnits của yêu cầu cùng giới hạn 1,048,576 đơn vị UTF-16 của adapter, còn số từ phải nằm trong MaxWords
Adapter kiểm tra hủy và thời gian đã trôi trong quá trình chuyển đổi bitmap lẫn duyệt kết quả, và cung cấp một monitor native kèm deadline còn lại cùng callback hủy trong lúc nhận dạng
Hủy phía native là kiểu hợp tác: monitor của Tesseract bao phủ việc nhận dạng từ và không ngắt được mọi bước khởi tạo hay phân tích bố cục; các lời gọi này có thể chạy xong trước khi lệnh hủy được yêu cầu hay deadline hết hạn được báo cáo
Ngân sách pixel và đầu ra không phải giới hạn cứng cho bộ nhớ mô hình hay bộ nhớ nhận dạng của thư viện native; hãy dùng adapter tiến trình khi ứng dụng cần một worker có thể chấm dứt riêng lẻ
ApplyLoadedOCRTextLayer xác thực mọi kết quả và công bố từng trang đã chọn một cách nguyên tử, nên adapter hỏng sẽ để tài liệu đã nạp không đổi
Adapter DLL từ chối UTF-8 không hợp lệ, cắt khoảng trắng dư trong văn bản từ đã giải mã, và từ chối các ký tự điều khiển C0, DEL, C1 còn sót lại trước khi trả kết quả, nhờ đó văn bản hỏng khiến yêu cầu thất bại thay vì bị text layer PDF lặng lẽ bỏ qua
Factory CLI cục bộ
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
Overload options chuyển tiếp PageSegMode thành --psm và EngineMode thành --oem, dùng timeout đã cấu hình, và kiểm tra MaxPixels trước khi lưu bitmap mượn hay khởi động một worker
Overload timeout hiện có giữ nguyên phân đoạn trang tự động và chế độ engine do executable chọn mà không áp thêm giới hạn pixel của adapter; dùng overload options khi cần giới hạn đầu vào tường minh
Cả hai overload giữ DPI được yêu cầu, đầu ra TSV, handle kế thừa bị hạn chế, thăm dò hủy, và chấm dứt worker khi thất bại; CLI không có thông tin baseline native, giới hạn đầu ra TSV ở 64 MiB, và giới hạn đầu ra tệp chẩn đoán ở 1 MiB
Chế độ phân đoạn, chế độ engine, timeout, và giới hạn pixel không hợp lệ raise EArgumentException khi tạo engine đã cấu hình; tình trạng khả dụng của mô hình, bao gồm osd.traineddata cho các chế độ hướng, và độ tương thích mô hình/engine do executable kiểm tra trong lúc nhận dạng
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;
Dùng tpsSingleWord cho một từ cô lập, tpsSparseText cho văn bản rải rác, hoặc tpsSingleBlockVertical kèm mô hình văn bản dọc phù hợp cho một khối dọc; factory không tự cắt trang hay tự chọn mô hình
Adapter CLI xác thực UTF-8 nghiêm ngặt, từ chối byte NUL và ký tự điều khiển C0/C1 lồng trong các từ được nhận dạng, và xóa toàn bộ kết quả nếu đầu ra dị dạng xuất hiện sau một từ vốn hợp lệ
Xem Các lớp văn bản OCR có thể tìm kiếm để biết ví dụ CLI, tùy chọn dựng ảnh, nhóm optional content, và giới hạn tuân thủ