Adapters de OCR Tesseract

O HPDFTesseractRecognition fornece engines opcionais do Windows que implementam a IHPDFOCREngine para camadas de texto OCR pesquisáveis

Factory de DLL nativa

function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
  TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
  TessDataDirectory, Language: string;
  const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;

Forneça uma DLL do Tesseract existente expondo a API C compatível com Tesseract 5, um diretório tessdata e um identificador de idioma ASCII ou uma combinação como eng, chi_sim ou chi_sim+eng

A arquitetura da biblioteca precisa corresponder à aplicação: uma aplicação Win32 carrega uma DLL de 32 bits, enquanto uma aplicação Win64 carrega uma DLL de 64 bits

Mantenha as DLLs de dependência exigidas ao lado da biblioteca escolhida ou nos diretórios padrão de loader do Windows; o adapter carrega o caminho explícito da biblioteca sem mudar o diretório atual nem o search path do processo

A factory verifica todos os arquivos .traineddata solicitados, carrega a biblioteca e resolve os exports exigidos antes de retornar; caminhos, modelos ou options inválidos, exports ausentes, incompatibilidade de arquitetura e dependências indisponíveis geram exceção

Nenhum runtime de OCR ou modelo é empacotado ou baixado automaticamente

As duas factories estão disponíveis no pacote FPC/Lazarus do Windows, assim como em builds de Delphi e C++Builder; reconstrua o Lib/FPC/HotPDFLaz.lpk para a arquitetura de destino antes de usar o HPDFTesseractRecognition

O adapter FPC nativo lê a raw image atual da LCL, incluindo os pixels gravados por scanlines, e preserva palavras Unicode de forma independente da code page ANSI do sistema

Options

THPDFTesseractOptions = record
  PageSegMode: THPDFTesseractPageSegMode;
  EngineMode: THPDFTesseractEngineMode;
  TimeoutMilliseconds: Cardinal;
  MaxPixels: Integer;
  class function Default: THPDFTesseractOptions; static;
end;

Chame THPDFTesseractOptions.Default antes de sobrescrever campos; o mesmo record pode configurar a factory de DLL nativa ou a sobrecarga de opções da CLI local

CampoPadrãoSignificado
PageSegModetpsAutoPage segmentation automática sem detecção de orientação
EngineModetemDefaultO modo de engine suportado pelos modelos de idioma selecionados
TimeoutMilliseconds60000Um prazo de requisição de 1 a 3.600.000 milissegundos; a DLL coopera com o cancelamento, enquanto o worker da CLI é terminado no timeout
MaxPixels16777216O orçamento de pixels de entrada, configurável de 1 a 67.108.864 pixels
THPDFTesseractPageSegMode = (
  tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
  tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
  tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
  tpsRawLine);
THPDFTesseractEngineMode = (
  temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);

tpsOSDOnly e tpsAutoOnly não realizam reconhecimento de palavras e são rejeitados pelo adapter; tpsAutoOSD e tpsSparseTextOSD exigem adicionalmente osd.traineddata

Use tpsSingleLine para uma linha de texto, tpsSingleBlock para um bloco uniforme ou tpsSparseText para texto espalhado; esses modos não corrigem a perspectiva de um scan nem dão garantia geral de layout

temLSTMOnly exige modelos LSTM, enquanto os modos legacy exigem os componentes de modelo legacy correspondentes; combinações não suportadas falham na inicialização nativa

Exemplo de PDF pesquisável

O PDF já precisa estar carregado, e a DLL, as dependências e os modelos de idioma precisam estar instalados nos locais mostrados

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;

Resultados e posse

O adapter copia o bitmap emprestado para um buffer grayscale top-down, encaminha o DPI solicitado e reconhece por meio de uma instância nativa da API por requisição

As palavras mantêm a ordem de leitura nativa, texto Unicode UTF-8 validado, limites em pixels com origem no canto superior esquerdo e confiança escalada de 0 a 100 para 0 a 1; caracteres suplementares consomem duas unidades UTF-16

As baselines de palavras disponíveis são repassadas com os dois endpoints; quando uma baseline não está disponível, vale o fallback de geometria atual da camada de texto

Para uma baseline predominantemente vertical, o adapter nativo usa a largura da caixa da palavra como TextHeightPixels; baselines horizontais usam a altura da caixa, incluindo direções de leitura invertidas, para que o comprimento de uma palavra vertical não vire o tamanho da fonte dela

Esta é uma estimativa de eixo dominante: apenas uma caixa de palavra e uma baseline alinhadas aos eixos não recuperam a altura exata do texto em ângulos de inclinação arbitrários

Uma página vazia termina com sucesso e um array de palavras vazio; UTF-8 malformado, caracteres de controle embutidos, geometria ou confiança inválidas, orçamentos de palavras ou de texto esgotados, cancelamento e falhas de reconhecimento retornam False, limpam todas as palavras parciais e preenchem o diagnóstico

Cada requisição libera o iterator dela, as strings nativas alocadas, o monitor e a instância da API; liberar o adapter descarrega a referência da biblioteca dele

Limites e cancelamento

As dimensões de entrada precisam ter no máximo 32.767 pixels cada e caber no MaxPixels; o texto reconhecido precisa caber no orçamento de MaxTextCodeUnits da requisição e no limite de 1.048.576 unidades UTF-16 do adapter, e a contagem de palavras precisa caber no MaxWords

O adapter checa cancelamento e tempo decorrido durante a conversão do bitmap e a iteração de resultados, e fornece um monitor nativo com o prazo restante e um callback de cancelamento durante o reconhecimento

O cancelamento nativo é cooperativo: o monitor do Tesseract cobre o reconhecimento de palavras e não interrompe toda inicialização nem toda etapa de análise de layout; essas chamadas podem terminar antes que um cancelamento solicitado ou um prazo expirado seja reportado

Os orçamentos de pixels e de saída não impõem um limite rígido ao uso de memória de modelo ou de reconhecimento da biblioteca nativa; use o adapter de processo quando a aplicação precisar de um worker terminável separado

O ApplyLoadedOCRTextLayer valida todos os resultados e publica cada página selecionada atomicamente, então uma falha do adapter deixa o documento carregado inalterado

O adapter de DLL rejeita UTF-8 inválido, apara o texto decodificado das palavras e rejeita os caracteres de controle C0, DEL e C1 restantes antes de retornar resultados, de modo que texto malformado faça a requisição falhar em vez de ser omitido em silêncio pela camada de texto do PDF

Factory de CLI local

function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;

A sobrecarga com opções encaminha PageSegMode como --psm e EngineMode como --oem, usa o timeout configurado e checa MaxPixels antes de salvar o bitmap emprestado ou iniciar um worker

A sobrecarga existente com timeout preserva a page segmentation automática e o modo de engine escolhido pelo executável, sem impor um novo limite de pixels do adapter; use a sobrecarga com opções quando um limite explícito de entrada for necessário

As duas sobrecargas mantêm o DPI solicitado, a saída TSV, os handles herdados restritos, o polling de cancelamento e a terminação do worker em caso de falha; a CLI não tem informação nativa de baseline, limita a saída TSV a 64 MiB e a saída de arquivo de diagnóstico a 1 MiB

Modos de segmentação, modos de engine, timeouts e limites de pixels inválidos levantam EArgumentException ao criar a engine configurada; a disponibilidade de modelos, incluindo osd.traineddata para modos de orientação, e a compatibilidade entre modelo e engine são verificadas pelo executável durante o reconhecimento

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;

Use tpsSingleWord para uma palavra isolada, tpsSparseText para texto espalhado ou tpsSingleBlockVertical com um modelo de texto vertical adequado para um único bloco vertical; a factory não recorta páginas nem seleciona modelos automaticamente

O adapter de CLI valida UTF-8 estritamente, rejeita bytes NUL e caracteres de controle C0/C1 dentro das palavras reconhecidas e limpa todos os resultados se uma saída malformada seguir uma palavra válida

Veja Camadas de texto OCR pesquisáveis para o exemplo de CLI, opções de renderização, agrupamento de optional content e limites de conformidade