Adaptadores de OCR Tesseract
O HPDFTesseractRecognition disponibiliza motores opcionais para Windows que implementam IHPDFOCREngine para camadas de texto OCR pesquisáveis
Factory nativa de DLL
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 Tesseract existente que exponha 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 tem de 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 necessárias ao lado da biblioteca escolhida ou nos diretórios padrão do loader do Windows; o adaptador carrega o caminho explícito da biblioteca sem alterar o diretório atual nem o caminho de pesquisa do processo
A factory verifica cada ficheiro .traineddata pedido, carrega a biblioteca e resolve os exports necessários antes de devolver; caminhos, modelos ou opções inválidos, exports em falta, incompatibilidades de arquitetura e dependências indisponíveis geram uma exceção
Nenhum runtime de OCR nem modelos são empacotados ou descarregados automaticamente
Ambas as factories estão disponíveis no pacote FPC/Lazarus para Windows, além das builds Delphi e C++Builder; recompile Lib/FPC/HotPDFLaz.lpk para a arquitetura alvo antes de usar o HPDFTesseractRecognition
O adaptador nativo FPC lê a imagem raw atual do LCL, incluindo os píxeis escritos através de scanlines, e preserva as palavras Unicode independentemente da code page ANSI do sistema
Opções
THPDFTesseractOptions = record
PageSegMode: THPDFTesseractPageSegMode;
EngineMode: THPDFTesseractEngineMode;
TimeoutMilliseconds: Cardinal;
MaxPixels: Integer;
class function Default: THPDFTesseractOptions; static;
end;
Chame THPDFTesseractOptions.Default antes de sobrepor campos; o mesmo registo pode configurar a factory nativa de DLL ou a overload de opções locais de CLI
| Campo | Predefinição | Significado |
|---|---|---|
PageSegMode | tpsAuto | Segmentação automática de página sem deteção de orientação |
EngineMode | temDefault | O modo de motor suportado pelos modelos de idioma selecionados |
TimeoutMilliseconds | 60000 | Um prazo de pedido de 1 a 3,600,000 milissegundos; a DLL coopera com o cancelamento, enquanto o worker de CLI é terminado ao expirar o prazo |
MaxPixels | 16777216 | O orçamento de píxeis de entrada, configurável de 1 a 67,108,864 píxeis |
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 executam reconhecimento de palavras e são rejeitados pelo adaptador; tpsAutoOSD e tpsSparseTextOSD exigem adicionalmente osd.traineddata
Use tpsSingleLine para uma linha de texto, tpsSingleBlock para um bloco uniforme ou tpsSparseText para texto disperso; estes modos não reparam a perspetiva de uma digitalização nem dão uma 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 durante a inicialização nativa
Exemplo de PDF pesquisável
O PDF já tem de estar carregado, e a DLL, as dependências e os modelos de idioma têm de 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 propriedade
O adaptador copia o bitmap emprestado para um buffer de tons de cinzento de cima para baixo, encaminha o DPI pedido e reconhece através de uma instância da API nativa local ao pedido
As palavras mantêm a ordem de leitura nativa, texto Unicode UTF-8 validado, limites em píxeis com origem no canto superior esquerdo e confiança escalada de 0-100 para 0-1; carateres suplementares consomem duas unidades UTF-16
As linhas de base de palavras disponíveis são transmitidas com ambos os pontos extremos; quando uma linha de base não está disponível, aplica-se o fallback de geometria existente da camada de texto
Para uma linha de base predominantemente vertical, o adaptador nativo usa a largura da caixa da palavra como TextHeightPixels; as linhas de base horizontais usam a altura da caixa, incluindo direções de leitura invertidas, de modo que o comprimento de uma palavra vertical não se torna o tamanho da fonte
Trata-se de uma estimativa pelo eixo dominante: uma caixa de palavra e uma linha de base alinhadas com os eixos não permitem recuperar a altura exata do texto para ângulos de inclinação arbitrários
Uma página vazia conclui com sucesso e um array de palavras vazio; UTF-8 malformado, carateres de controlo incorporados, geometria ou confiança inválidas, orçamentos de palavras ou de texto esgotados, cancelamento e falhas de reconhecimento devolvem False, limpam todas as palavras parciais e preenchem o diagnóstico
Cada pedido liberta o respetivo iterador, cadeias nativas alocadas, monitor e instância da API; libertar o adaptador descarrega a referência da respetiva biblioteca
Limites e cancelamento
As dimensões de entrada têm de ser de, no máximo, 32,767 píxeis cada e caber em MaxPixels; o texto reconhecido tem de caber no orçamento MaxTextCodeUnits do pedido e no limite de 1,048,576 unidades UTF-16 do adaptador, e a contagem de palavras tem de caber em MaxWords
O adaptador verifica o cancelamento e o 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 todos os passos de inicialização ou de análise de layout; estas chamadas podem terminar antes de um cancelamento pedido ou de um prazo expirado ser reportado
Os orçamentos de píxeis e de saída não impõem um limite rígido ao uso de memória de modelos ou de reconhecimento da biblioteca nativa; use o adaptador de processo quando a aplicação precisar de um worker terminável separadamente
ApplyLoadedOCRTextLayer valida todos os resultados e publica todas as páginas selecionadas atomicamente, pelo que uma falha do adaptador deixa o documento carregado inalterado
O adaptador da DLL rejeita UTF-8 inválido, corta os espaços do texto descodificado das palavras e rejeita os restantes carateres de controlo C0, DEL e C1 antes de devolver resultados, de modo que texto malformado faz o pedido falhar em vez de ser omitido em silêncio pela camada de texto do PDF
Factory local de 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;
A overload com opções encaminha PageSegMode como --psm e EngineMode como --oem, usa o timeout configurado e verifica MaxPixels antes de gravar o bitmap emprestado ou arrancar um worker
A overload com timeout existente preserva a segmentação automática de página e o modo de motor escolhido pelo executável, sem impor um novo limite de píxeis do adaptador; use a overload com opções quando for preciso um limite explícito de entrada
Ambas as overloads retêm o DPI pedido, 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 linhas de base, limita a saída TSV a 64 MiB e a saída de ficheiros de diagnóstico a 1 MiB
Modos de segmentação inválidos, modos de motor, timeouts e limites de píxeis geram EArgumentException ao criar o motor configurado; a disponibilidade de modelos, incluindo osd.traineddata para modos de orientação, e a compatibilidade modelo/motor 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 disperso ou tpsSingleBlockVertical com um modelo de texto vertical adequado para um bloco vertical; a factory não recorta páginas nem seleciona modelos automaticamente
O adaptador de CLI valida UTF-8 estritamente, rejeita bytes NUL e carateres de controlo C0/C1 dentro das palavras reconhecidas, e limpa todos os resultados se saída malformada seguir uma palavra de resto válida
Veja Camadas de texto OCR pesquisáveis para o exemplo de CLI, opções de renderização, agrupamento em conteúdo opcional e limites de conformidade