Camadas de texto OCR pesquisáveis
O HotPDF consegue renderizar as páginas carregadas selecionadas para um motor OCR fornecido pela aplicação e acrescentar atomicamente texto Unicode invisível pesquisável alinhado com cada palavra reconhecida
A demo de consola SearchableOCR fornece um fluxo de trabalho executável: gere uma amostra de três páginas só de imagem com --create-sample, escolha reconhecimento OCR incorporado, RapidOCR ou DLL/CLI do Tesseract, selecione páginas, configure a confiança e os limites de recursos, e grave uma cópia pesquisável com estatísticas de conversão
Integração de motores
Implemente IHPDFOCREngine com qualquer provider OCR síncrono disponível para a aplicação
O motor recebe um TBitmap emprestado, o DPI pedido, a rotação normalizada da página, coordenadas da media box, os orçamentos restantes de palavras e de UTF-16, e o token de cancelamento efetivo, através de THPDFOCRRequest
As caixas de palavras e as linhas de base opcionais usam coordenadas em píxeis do bitmap com origem no canto superior esquerdo, e o motor não pode reter nem libertar o bitmap emprestado depois de Recognize regressar
Motores locais opcionais
A versão 2.754.0 acrescenta factories explícitas de Tesseract e RapidOCR que devolvem IHPDFOCREngine em Windows; a overload sem motor continua a selecionar o motor integrado existente
Instale e aprovisione localmente o motor escolhido antes de criar o respetivo adaptador, e depois passe esse adaptador à overload de ApplyLoadedOCRTextLayer que recebe o motor; 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 adaptador nativo de DLL do Tesseract opcional acrescenta segmentação de página e modos de motor configuráveis, reconhecimento multilingue e linhas de base nativas de palavras, através 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 produzir saída TSV e um diretório de dados contendo o modelo de idioma pedido, como chi_sim.traineddata para chi_sim
A sobrecarga com opções aceita THPDFTesseractOptions.Default com segmentação de página, modo de motor de reconhecimento, timeout e limite de píxeis de entrada explícitos; selecione tpsSingleLine, tpsSingleWord ou tpsSparseText para corresponder ao layout da entrada, como mostrado em Adaptadores de OCR Tesseract
Este exemplo pressupõe que o executável e os dados já estão 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 adaptador nativo de DLL do RapidOCR reconhece snapshots de memória com modelos ONNX de CPU persistentes em processo, através de HPDFCreateRapidOCRDLLOCREngine, com classificação de ângulo opcional e cancelamento cooperativo em builds Delphi, C++Builder e FPC/Lazarus para Windows
O adaptador de modelos locais do RapidOCR também disponibiliza uma overload com THPDFRapidOCROptions para caminhos explícitos de modelos ONNX, classificação de ângulo opcional, dicionários de carateres e fontes locais, limites de threads de CPU e um orçamento de píxeis de entrada em builds Delphi, C++Builder e FPC/Lazarus
function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine;
A declaração está em HPDFRapidOCRRecognition; aprovisione o Python com rapidocr e onnxruntime, a ponte 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 ponte também exige %WINDIR%\Fonts\arial.ttf para o contentor de resultados do RapidOCR, desativa as descargas automáticas e usa uma thread ONNX por pool de execução configurado; modelos, pacotes ou a fonte local em falta fazem o reconhecimento falhar
A ponte atual usa a configuração do modelo de chinês simplificado e preserva a pontuação reconhecida sem substituição entre formas fullwidth e 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;
Ambas as factories validam caminhos existentes de executáveis e de dados, e aceitam um timeout de 1 a 3 600 000 milissegundos, com a predefinição de 60 000; configuração inválida gera EArgumentException
O adaptador partilhado arranca um processo local oculto com caminhos entre aspas e handles herdados restritos, consulta o cancelamento, o timeout e os tamanhos de saída a cada 25 milissegundos, e termina o processo em caso de falha antes de limpar os ficheiros temporários
A saída TSV está limitada a 64 MiB e a saída de ficheiros de diagnóstico a 1 MiB, com os diagnósticos devolvidos truncados a 4 096 carateres; as palavras reconhecidas também têm de caber nos orçamentos de palavras e de UTF-16 do pedido e nos limites válidos do bitmap
A saída de reconhecimento TSV tem de ser UTF-8 válido e não pode conter bytes NUL nem carateres de controlo C0/C1 dentro das palavras reconhecidas; saída malformada faz falhar o pedido de reconhecimento inteiro, mesmo quando palavras válidas precedem o erro
Estes são limites de saída e de pedido, e não um teto rígido sobre o uso de memória do motor externo; cancelamentos e falhas do motor regressam através do estado da camada de texto, sem publicar páginas parciais
Evidência e limites de reconhecimento
A linha de base local RapidOCR 3.8.4 passou todas as 15 repetições em cinco regiões fixas de digitalizações em chinês: duas regiões nítidas 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 carateres de no máximo 5% e taxa de eliminação de no máximo 2%
Todas as repetições passaram nas verificações de ordem de leitura, num total de 5 190 verificações de coordenadas de palavras ou carateres, e na igualdade de píxeis visíveis a 72 DPI; as duas regiões nítidas tiveram zero erros de carateres contra essas referências
Duas revisões visuais por IA concordam quanto ao texto e aos números chineses, mas alguns code points de pontuação no raster continuam ambíguos e a adjudicação humana está pendente; as diferenças de pontuação continuam a contar como erros, e estes resultados são evidência de corpus, não uma garantia geral de precisão
Geometria e texto de pesquisa
O HotPDF inverte a transformação de página do renderer para que as linhas de base das palavras permaneçam alinhadas em páginas rodadas 0, 90, 180 ou 270 graus
Cada palavra aceite é escrita com o modo de renderização de texto 3 Tr, uma escala horizontal de texto ajustada e uma matriz de texto consciente da rotação, deixando o raster da página inalterado e preservando a ordem de conteúdo selecionável
Uma fonte Type 0 Identity-H partilhada atribui CIDs locais ao documento e limitados a escalares Unicode, e escreve um mapa ToUnicode completo, incluindo alvos surrogate UTF-16 para carateres suplementares
Palavras latinas e cirílicas adjacentes na mesma linha de base 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
Processar um PDF digitalizado
O exemplo de consola Demo/Delphi/SearchableOCR/SearchableOCR.dpr 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 grava 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 tem de corresponder à arquitetura do executável e o pacote de modelos local selecionado tem de estar instalado
O exemplo recusa-se a sobrescrever um ficheiro de saída existente e aceita --replace-ocr quando atualiza uma camada de OCR do HotPDF marcada
A descodificação de digitalizações JPEG no FPC para Windows desenha no formato de píxeis final do bitmap antes do reconhecimento, para que a conversão de formato do LCL retenha a imagem descodificada
Atualizar uma camada de OCR existente
Defina THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer como True para substituir, nas páginas reconhecidas, streams de OCR do HotPDF marcadas geradas anteriormente, na mesma transação do novo texto
Isto ignora SkipPagesWithText apenas em páginas marcadas e funciona depois de gravar e recarregar; THPDFOCRTextLayerInfo.ReplacedPageCount reporta o número de páginas substituídas
Falhas de reconhecimento e páginas sem palavras aceites preservam a camada de texto antiga; streams não marcadas, incluindo OCR de terceiros e camadas geradas por versões anteriores do HotPDF, são preservadas
A substituição desliga as antigas content streams de OCR, mas não remove recursos de fontes nem grupos de conteúdo opcional que ainda possam ser referenciados noutros locais; a gravação incremental pode reter objetos substituídos de revisões anteriores
A predefinição continua a ser saltar qualquer página com texto extraível, incluindo um número de página ou cabeçalho sobre uma digitalização; desligar SkipPagesWithText reconhece a página inteira e pode duplicar texto nativo existente, pelo que páginas mistas exigem processamento selecionado pela aplicação
Limites, cancelamento e atomicidade
THPDFOCRTextLayerOptions.Default ativa o reconhecimento a 300 DPI, salta páginas que já expõem texto e limita a contagem de páginas, píxeis, palavras, unidades UTF-16 e bytes de conteúdo gerados
O HotPDF valida todos os resultados do motor e constrói todo o conteúdo das páginas antes de iniciar uma transação copy-on-write do grafo, pelo que falhas do motor, geometria inválida, orçamentos esgotados, cancelamentos ou erros de commit deixam 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, pela ordem da primeira ocorrência
O MaxTotalWords conta todas as palavras recebidas, incluindo as de confiança baixa ou inválidas que são depois descartadas, e cada pedido de página recebe apenas a franquia restante
Se o orçamento de palavras ou de UTF-16 se esgotar e permanecer outra página elegível, o processamento devolve otlsBudgetExceeded antes de renderizar ou reconhecer essa página e não publica nenhuma das camadas de texto planeadas; as páginas ignoradas por já terem texto não exigem orçamento de reconhecimento restante
Agrupamento em conteúdo opcional
Defina UseOptionalContentGroup para vincular todo o texto gerado a uma camada nomeada, através do dicionário Resources/Properties de cada página
Esta opção exige PDF 1.5 e segue StrictVersionLock; a predefinição mantém o texto invisível fora de um grupo de conteúdo opcional, para máxima compatibilidade
Nota de conformidade
A camada pesquisável gerada usa intencionalmente uma fonte sintética não incorporada, porque o modo de renderização 3 nunca pinta glifos
Esta API, por si só, não produz saída OCR conforme a PDF/A, pelo que um fluxo de trabalho PDF/A deve usar um caminho de camada de texto com fonte incorporada e executar a validação de conformidade pedida antes da publicação
APIs primárias
THotPDF.ApplyLoadedOCRTextLayerIHPDFOCREngineTHPDFOCRRequestTHPDFOCRWordTHPDFOCRTextLayerOptionsTHPDFOCRTextLayerInfoTHPDFOCRTextLayerStatus
Renderização progressiva e cancelamento · ExtractLoadedPageText Method