Formats2026-08-255 min de leitura

Como o OCR lê um PDF digitalizado, e por que esta ferramenta devolve Markdown

Um PDF digitalizado é uma foto de texto. Este endpoint devolve Markdown, não um PDF com camada oculta: o Auto usa o texto existente e o Force OCR relê tudo.

PDF123 · Updated 2026-09-19

Um PDF digitalizado guarda as páginas como imagens raster: fotografias de texto, não caracteres selecionáveis. O OCR (reconhecimento óptico de caracteres) examina esses pixels, estima quais formas são caracteres e emite texto de verdade. No PDF123 isso roda como ferramenta gratuita no navegador e como POST /api/v1/misc/ocr-pdf; a resposta é Markdown, não um PDF reescrito.

Diagrama de uma página digitalizada antes do OCR (só imagem) e depois (texto alinhado à página). Muitas ferramentas de OCR para PDF gravam esse texto de volta como camada oculta; o endpoint deste site devolve Markdown.

A digitalização continua sendo uma imagem

O OCR não limpa, não deixa mais nítido nem substitui o bitmap. Uma digitalização nítida que o OCR lê errado continua parecendo nítida. O gargalo nunca foi a imagem, foi o reconhecimento. Trocar o motor de reconhecimento no mesmo lote de digitalizações pode mudar bastante a precisão, mesmo com os pixels em si intocados.

O OCR clássico em PDF grava uma segunda camada de texto, invisível, alinhada sob a imagem, para que selecionar e buscar cheguem às palavras certas. É o que o diagrama mostra, e é assim que muitas ferramentas de desktop ainda funcionam.

O que este endpoint devolve de verdade

A rota OCR chama /api/v1/misc/ocr-pdf, que roda sobre um crate Rust independente, o pdf-inspector (compilado com o recurso ocr). Ele não entrega o PDF inteiro para um modelo de reconhecimento. O pdf-inspector primeiro classifica cada página como já tendo texto nativo extraível ou sendo só imagem. Páginas com texto nativo mantêm esse texto como está e nunca chegam a tocar o modelo de reconhecimento; páginas só de imagem passam pelo pipeline de reconhecimento: o PDFium (o mesmo renderizador de código aberto que o Chrome usa internamente) rasteriza a página, e o ONNX Runtime executa o modelo PP-OCRv6 Small para lê-la. Os dois tipos de página são então costurados em ordem num único documento Markdown, por isso a resposta é text/markdown e o download termina em .md.

Esse contrato é novo nesta reescrita. O backend em Java/Spring Boot que este projeto usava antes chamava o OCRmyPDF, a abordagem clássica de "imagem mais camada de texto oculta", e devolvia um PDF. A reescrita em Rust substituiu esse caminho por completo pelo OCR seletivo do pdf-inspector, e a saída passou de PDF para Markdown junto com essa mudança. O antigo backend em Java já foi removido do repositório; não é uma opção que se possa reativar.

Se você precisa de um PDF pesquisável (imagem mais camada de texto), esta não é a saída certa. Se você precisa de texto que um agente ou um pipeline consiga ler, o Markdown é justamente o ponto.

Auto e Force OCR

O formulário tem um campo ocrType:

  • Normal (qualquer valor diferente de force-ocr) corresponde ao modo Auto: reaproveita o texto onde o arquivo já tem e roda OCR nas páginas que são só imagem. Num PDF nativo digital limpo, o Auto não chega a carregar o runtime de OCR.
  • Force OCR (ocrType=force-ocr) refaz o reconhecimento em todas as páginas, inclusive nas que já têm camada de texto. Em páginas genuinamente só de imagem, você paga tempo sem ganhar precisão; em troca, recebe uma leitura que ignora uma camada existente quebrada ou incompleta.

O padrão do portal é Force OCR. Não existe controle de idioma: códigos tessdata que sobraram do antigo caminho em Java são ignorados.

A divisão entre Auto e Force acontece dentro da própria requisição, e nem o portal nem a sonda de capacidades da API verificam isso de antemão. GET /api/v1/settings/get-endpoints-status sempre reporta ocr-pdf como habilitado, sem checar de fato se o PDFium, o ONNX Runtime ou o modelo PP-OCRv6 estão instalados. A checagem real só acontece no momento em que uma requisição dispara o reconhecimento: se algum deles estiver faltando, o endpoint devolve 503, em vez de um Markdown degradado que caia silenciosamente para apenas o texto nativo. O modelo PP-OCRv6 Small tem cerca de 31 MB; a menos que tenha sido pré-carregado no cache local no momento do deploy, ele é baixado pela rede na primeira vez que uma página realmente precisa de reconhecimento. Uma máquina offline sem o modelo pré-carregado provavelmente vai falhar bem ali, na primeira requisição Force, em vez de simplesmente rodar mais devagar.

O reconhecimento é probabilístico

Os motores comparam padrões de pixel com modelos de letras e palavras. Vão bem em impressão limpa, de alto contraste e fonte padrão, e vão pior em:

  • Digitalizações de baixa resolução ou baixo contraste (qualidade de fax contra um original a 300 DPI)
  • Manuscrito, fontes decorativas e diagramações incomuns (tabelas de várias colunas, texto girado, formulários densos)
  • Páginas tortas, que deformam os glifos o suficiente para confundir a comparação

Um fax borrado não sai do OCR como uma digitalização limpa, use Auto ou Force. Isso é uma limitação do próprio modelo, não algo que um parâmetro consiga corrigir.

O que o OCR não faz

O OCR entrega texto. Ele não remonta parágrafos, títulos, tabelas nem um documento Word refluível. Layout editável é um problema de conversão que se soma ao erro de reconhecimento, e não o mesmo trabalho de ler uma digitalização.

Fazer OCR de um PDF roda no servidor, sem conta. O download é Markdown. Se uma camada de texto existente parecer errada, use Force OCR para que o modo Auto não confie nela; para checar se uma determinada máquina realmente tem o PDFium e o modelo instalados, rodar uma requisição de verdade é mais confiável do que confiar no status da sonda de capacidades, já que ela só confirma que o endpoint existe, não que o runtime dele está pronto. Para chaves de automação e OpenAPI, veja Desenvolvedores.

Open tool
Process in the browser — no watermark, files removed after the job.
Open tool