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ườngMặc địnhÝ nghĩa
PageSegModetpsAutoPhân đoạn trang tự động, không phát hiện hướng
EngineModetemDefaultChế độ engine được các mô hình ngôn ngữ đã chọn hỗ trợ
TimeoutMilliseconds60000Deadline 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
MaxPixels16777216Ngâ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ủ