Searchable OCR Text Layers
O HotPDF pode renderizar páginas carregadas selecionadas para um mecanismo OCR fornecido pelo aplicativo e adicionar atomicamente texto Unicode invisível pesquisável alinhado a cada palavra reconhecida
A demo de console SearchableOCR fornece um fluxo de trabalho pronto para executar: gere uma amostra de três páginas somente imagem com --create-sample, escolha reconhecimento OCR embutido, RapidOCR ou Tesseract via DLL/CLI, selecione páginas, configure confiança e limites de recursos e salve uma cópia pesquisável com estatísticas de conversão
Integração de engine
Implemente IHPDFOCREngine com qualquer provedor de OCR síncrono disponível para a aplicação
A engine recebe um TBitmap emprestado, o DPI solicitado, a rotação normalizada da página, coordenadas do media box, os orçamentos restantes de palavras e unidades UTF-16 e o token de cancelamento efetivo por meio de THPDFOCRRequest
As caixas de palavras e as baselines opcionais usam coordenadas de pixel do bitmap com origem no canto superior esquerdo, e a engine não deve reter nem liberar o bitmap emprestado depois que Recognize retornar
Engines locais opcionais
A versão 2.754.0 adiciona factories explícitas de Tesseract e RapidOCR que retornam IHPDFOCREngine no Windows; a sobrecarga sem engine continua selecionando a engine embutida existente
Instale e provisione a engine escolhida localmente antes de criar o adapter dela e depois passe esse adapter à sobrecarga de engine de ApplyLoadedOCRTextLayer; executáveis, pacotes Python e modelos de OCR são dependências externas opcionais e não vêm empacotados com o HotPDF
Tesseract
O adapter opcional de DLL nativa do Tesseract adiciona page segmentation e modos de engine configuráveis, reconhecimento multilíngue e baselines nativas de palavras por meio de HPDFCreateTesseractDLLOCREngine e THPDFTesseractOptions
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 declaração está em HPDFTesseractRecognition; forneça um executável Tesseract capaz de saída TSV e um diretório de dados contendo o modelo de idioma solicitado, como chi_sim.traineddata para chi_sim
A sobrecarga com opções aceita THPDFTesseractOptions.Default com page segmentation explícita, modo de engine de reconhecimento, timeout e limite de pixels de entrada; selecione tpsSingleLine, tpsSingleWord ou tpsSparseText para corresponder ao layout da entrada, como mostrado em Adaptadores de OCR do Tesseract
Este exemplo assume que o executável e os dados já foram instalados nos caminhos mostrados e que PDF é uma instância carregada de THotPDF
uses SysUtils, HPDFDoc, HPDFTesseractRecognition;
procedure AddTesseractText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
Options: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
Engine := HPDFCreateTesseractOCREngine(
'C:\OCR\Tesseract\tesseract.exe',
'C:\OCR\Tesseract\tessdata', 'chi_sim', 60000);
Options := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
raise Exception.Create('OCR text layer was not added');
end;
RapidOCR
O adapter RapidOCR de DLL nativa reconhece snapshots de memória com modelos ONNX de CPU persistentes em processo por meio do HPDFCreateRapidOCRDLLOCREngine, com classificação de ângulo opcional e cancelamento cooperativo em builds de Delphi, C++Builder e FPC/Lazarus no Windows
O adapter RapidOCR para modelos locais também fornece uma sobrecarga com THPDFRapidOCROptions para caminhos explícitos de modelos ONNX, classificação de ângulo opcional, dicionários de caracteres e fontes locais, limites de threads de CPU e um orçamento de pixels de entrada em builds de Delphi, C++Builder e FPC/Lazarus
function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine;
A declaração está em HPDFRapidOCRRecognition; provisione o Python com rapidocr e onnxruntime, a bridge tools/OCR/rapidocr_tsv.py fornecida e estes três modelos locais
ch_PP-OCRv4_det_mobile.onnxch_PP-OCRv4_rec_mobile.onnxch_ppocr_mobile_v2.0_cls_mobile.onnx
A bridge também exige %WINDIR%\Fonts\arial.ttf para o contêiner de resultados do RapidOCR, desativa downloads automáticos e usa uma thread ONNX por pool de execução configurado; modelos, pacotes ou a fonte local ausentes fazem o reconhecimento falhar
A bridge atual usa a configuração de modelo de Chinês Simplificado e preserva a pontuação reconhecida sem substituição por formas fullwidth ou halfwidth
uses SysUtils, HPDFDoc, HPDFRapidOCRRecognition;
procedure AddRapidOCRText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
Options: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
Engine := HPDFCreateRapidOCREngine(
'C:\OCR\Python\python.exe',
'C:\HotPDF\tools\OCR\rapidocr_tsv.py',
'C:\OCR\RapidOCR\models', 60000);
Options := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
raise Exception.Create('OCR text layer was not added');
end;
As duas factories validam caminhos existentes de executável e dados e aceitam um timeout de 1 a 3.600.000 milissegundos, com padrão 60.000; configuração inválida raise EArgumentException
O adapter compartilhado lança um processo local oculto com caminhos entre aspas e handles herdados restritos, faz polling de cancelamento, timeout e tamanhos de saída a cada 25 milissegundos e termina o processo em caso de falha antes de limpar os arquivos temporários
A saída TSV é limitada a 64 MiB e a saída de arquivos de diagnóstico a 1 MiB, com os diagnósticos retornados truncados em 4.096 caracteres; as palavras reconhecidas também devem caber nos orçamentos de palavras e unidades UTF-16 da requisição e nos limites válidos do bitmap
A saída de reconhecimento TSV precisa ser UTF-8 válido e não conter bytes NUL nem caracteres de controle C0/C1 dentro das palavras reconhecidas; saída malformada falha a requisição de reconhecimento inteira, mesmo quando palavras válidas precedem o erro
Esses são limites de saída e de requisição, não um teto rígido no uso de memória da engine externa; cancelamento e falhas da engine retornam pelo status da camada de texto sem publicar páginas parciais
Evidências e limites de reconhecimento
A linha de base local RapidOCR 3.8.4 passou em todas as 15 repetições em cinco regiões fixas de scan em chinês: duas regiões limpas a 300 DPI e três regiões de pressão de baixa resolução a 150 DPI, avaliadas contra as transcrições de referência atuais com taxa de erro de caracteres de no máximo 5% e taxa de exclusão de no máximo 2%
Todas as repetições passaram nas checagens de ordem de leitura, em 5.190 checagens de coordenadas de palavras ou caracteres no total e na igualdade de pixels visíveis a 72 DPI; as duas regiões limpas tiveram zero erros de caractere contra essas referências
Duas revisões visuais por IA concordam sobre o texto e os números em chinês, mas alguns code points de pontuação no raster permanecem ambíguos e a adjudicação humana está pendente; diferenças de pontuação ainda contam como erros, e esses resultados são evidência de corpus, não uma garantia geral de precisão
Geometria e texto de busca
O HotPDF inverte a transform da página do renderizador para que as baselines de palavras permaneçam alinhadas em páginas rotacionadas em 0, 90, 180 ou 270 graus
Cada palavra aceita é gravada com text rendering mode 3 Tr, uma escala horizontal de texto ajustada e uma matriz de texto consciente da rotação, deixando o raster da página inalterado enquanto preserva a ordem selecionável do conteúdo
Uma fonte Type 0 Identity-H compartilhada atribui CIDs locais do documento limitados a escalares Unicode e grava um mapa ToUnicode completo, incluindo alvos surrogate UTF-16 para caracteres suplementares
Palavras latinas e cirílicas adjacentes na mesma baseline recebem um espaço Unicode explícito quando a geometria indica um espaço entre palavras; palavras CJK adjacentes mantêm o texto original sem espaços inseridos
Processando um PDF digitalizado
O Demo/Delphi/SearchableOCR/SearchableOCR.dpr de exemplo de console carrega um PDF digitalizado, executa o RapidOCR nativo com um perfil de idioma local explícito, publica texto Unicode invisível em todas as páginas elegíveis e salva um novo PDF sem abrir um visualizador
SearchableOCR.exe scan.pdf searchable.pdf --dll C:\HotPDF\Lib\Native\RapidOCR\Win64\HotPDFRapidOCR.dll --models C:\HotPDF\Lib\Native\RapidOCR\Models --language ru --dpi 300
Use --language ch para chinês simplificado ou --language chinese_cht para chinês tradicional; a DLL deve corresponder à arquitetura do executável e o pacote de modelos local selecionado deve estar instalado
O exemplo se recusa a sobrescrever um arquivo de saída existente e aceita --replace-ocr ao atualizar uma camada OCR marcada do HotPDF
A decodificação de scans JPEG no Windows FPC desenha no formato de pixel final do bitmap antes do reconhecimento, de modo que a conversão de formato da LCL retém a imagem decodificada
Atualizando uma camada OCR existente
Defina THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer como True para substituir fluxos OCR marcados do HotPDF gerados anteriormente nas páginas reconhecidas, na mesma transação do novo texto
Isso contorna SkipPagesWithText apenas em páginas marcadas e funciona depois de salvar e recarregar; THPDFOCRTextLayerInfo.ReplacedPageCount informa o número de páginas substituídas
Falhas de reconhecimento e páginas sem palavras aceitas preservam a camada de texto antiga; fluxos não marcados, incluindo OCR de terceiros e camadas geradas por versões anteriores do HotPDF, são preservados
A substituição desconecta os fluxos de conteúdo OCR antigos, mas não remove recursos de fonte nem grupos de optional content que ainda possam ser referenciados em outro lugar; o salvamento incremental pode reter objetos substituídos de revisões anteriores
O padrão continua sendo pular qualquer página com texto extraível, incluindo um número de página ou cabeçalho sobre um scan; desativar SkipPagesWithText reconhece a página inteira e pode duplicar texto nativo existente, então páginas mistas exigem processamento selecionado pela aplicação
Limites, cancelamento e atomicidade
THPDFOCRTextLayerOptions.Default habilita reconhecimento a 300 DPI, pula páginas que já expõem texto e limita contagem de páginas, pixels, palavras, unidades UTF-16 e bytes de conteúdo gerado
O HotPDF valida todo resultado da engine e constrói todo o conteúdo de página antes de iniciar uma transação copy-on-write do grafo, de modo que falhas da engine, geometria inválida, orçamentos esgotados, cancelamento ou erros de commit deixem o grafo de objetos carregado inalterado
Um array vazio de índices de página seleciona todas as páginas carregadas, enquanto índices duplicados são reconhecidos uma única vez na ordem de primeira aparição
MaxTotalWords conta todas as palavras recebidas, incluindo palavras de baixa confiança ou inválidas descartadas depois, e cada requisição de página recebe apenas a cota restante
Se o orçamento de palavras ou de UTF-16 se esgota e ainda resta uma página elegível, o processamento retorna otlsBudgetExceeded antes de renderizar ou reconhecer essa página e não publica nenhuma das camadas de texto planejadas; páginas puladas por texto existente não consomem orçamento de reconhecimento restante
Agrupamento de optional content
Defina UseOptionalContentGroup para vincular todo o texto gerado a uma única camada nomeada por meio do dicionário Resources/Properties de cada página
Essa opção exige PDF 1.5 e segue StrictVersionLock; o padrão mantém o texto invisível fora de um grupo de optional content para máxima compatibilidade
Nota de conformidade
A camada pesquisável gerada usa intencionalmente uma fonte sintética não embutida, porque o rendering mode 3 nunca pinta glifos
Esta API sozinha não produz saída OCR em conformidade com PDF/A, então um fluxo de trabalho PDF/A deve usar um caminho de camada de texto com fonte embutida e rodar a validação de conformidade solicitada antes da publicação
Primary APIs
THotPDF.ApplyLoadedOCRTextLayerIHPDFOCREngineTHPDFOCRRequestTHPDFOCRWordTHPDFOCRTextLayerOptionsTHPDFOCRTextLayerInfoTHPDFOCRTextLayerStatus
Progressive Rendering and Cancellation · ExtractLoadedPageText Method