O PDF requer OCR? Use PyMuPDF para fazer uma simulação página por página em vez de um novo reconhecimento completo
Se você deseja fazer o OCR do PDF, não há necessidade de reconhecer novamente o PDF inteiro. Use PyMuPDF para determinar página por página se há uma camada de texto e se é uma imagem de página inteira, e envie apenas as páginas que são realmente necessárias para o reconhecimento. Em anexo estão amostras executáveis, testes de páginas rotativas e instruções de limites de ramificação.
Quando muitas equipes lidam com tradução ou arquivamento de PDF, elas estão acostumadas a rotular o documento inteiro como"digitalizado"ou"copiável"na entrada. Um PDF de 300 páginas pode ter as primeiras 280 páginas com camadas de texto e apenas as últimas 20 páginas como anexos digitalizados. Se classificado por partes inteiras, todo o OCR aumentará o tempo de espera e também poderá identificar incorretamente os números originalmente corretos. Por outro lado, se você só consegue copiar o texto da página inicial e pular o OCR em todas as páginas, também é arriscado.
Uma abordagem mais confiável é permitir que cada página prossiga para a próxima etapa com os resultados da simulação. Este artigo implementa uma divisão conservadora de três vias: extração direta, envio para a fila de candidatos de OCR e inspeção manual. É uma heurística de engenharia interpretável, não um classificador universal para avaliar a qualidade do texto. Após a leitura, você poderá obter um programa de simulação executável página por página, bem como limites de desvio e ideias comuns de tratamento de falhas.
Conclusão de uma frase
Não há necessidade de julgar se o PDF requer OCR. Use PyMuPDF para pré-verificar página por página e enviar para OCR apenas as páginas que realmente precisam ser reconhecidas.
| sua situação | Práticas recomendadas | razão |
|---|---|---|
| Extraia pelo menos 40 caracteres que não sejam espaços em branco de uma única página | Extração direta (TEXT_CANDIDATE) | Já tem caracteres suficientes, mas ainda precisa verificar se há camadas ocultas de OCR ruins |
| Menos de 40 palavras e uma única imagem cobrindo pelo menos 70% da página | Enviar para fila de candidatos de OCR | Digitalizações de página inteira são adequadas para identificação, mas fotos puras também serão suficientes. |
| Página em branco, tipo de vetor, título esparso ou quebra-cabeça complexo | Inspeção manual (REVISÃO) | Estas situações não podem ser classificadas de forma confiável nas duas primeiras categorias e não podem ser automaticamente ignoradas ou descartadas. |
| Um documento híbrido de 300 páginas | Simulação página por página, processamento não concluído | Evite fazer OCR em todas as páginas por causa de alguns anexos digitalizados ou pular todo o OCR porque há texto na página inicial |
Nota: O conteúdo da imagem vem do PDF sintetizado gerado pelo código abaixo, não do arquivo do cliente, nem da interface do OmniDoc. O texto na página da imagem é composto por pixels rasterizados; o texto na página de texto possui uma camada de texto real.
Decida o que verificar primeiro
Dois sinais são usados aqui: o número de caracteres de texto após a remoção dos espaços em branco e a proporção da área da página ocupada pela maior imagem da página. O primeiro responde "Foram extraídos caracteres suficientes?" e o último ajuda a diferenciar entre uma digitalização de página inteira e uma página em branco. A área da imagem cruzará primeiro com a caixa de corte para evitar exceder a taxa de ampliação da imagem na página.
| observação | Desvio deste artigo | Ainda preciso de atenção |
|---|---|---|
| Pelo menos 40 caracteres sem espaço em branco | TEXT_CANDIDATE | Camadas ocultas de OCR ruins também podem conter muitas palavras |
| Menos de 40 palavras e uma única imagem cobrindo pelo menos 70% | OCR_CANDIDATE | Fotos puras também atenderão às condições, o OCR pode não ser significativo |
| Resto dos casos | REVIEW | Espaço em branco, tipo de vetor, títulos esparsos e quebra-cabeças complexos são possíveis aqui |
Os limites 40 e 0,70 destinam-se a tornar este conjunto de testes fácil de auditar e não são padrões multilíngues. Chinês, fórmula, capa e formulários curtos devem ser calibrados separadamente. Aqui, a foto com a maior área é tirada em vez de simplesmente adicionar as áreas de fotos sobrepostas, portanto, uma página digitalizada composta de múltiplas fotos pode cair em REVISÃO. Este é um limite intencionalmente reservado.
Exemplo executável completo
O exemplo usaPyMuPDF==1.28.0, não depende do Tesseract e não chama nenhum serviço de OCR ou tradução online. Salve-o como example.py e execute-o em um diretório vazio. O nome do arquivo criado é fixado em routing-fixture.pdf. Por favor, não substitua o arquivo de entrada em projetos reais.
import json
import pymupdf
def inspect_page(page):
chars = len("".join(page.get_text().split()))
bounds = page.cropbox
# 图片坐标与文本坐标都是未旋转坐标;不要混用旋转后的 page.rect。
bounds = pymupdf.Rect(0, 0, bounds.width, bounds.height)
ratios = []
for image in page.get_image_info():
rect = pymupdf.Rect(image["bbox"]) & bounds
ratios.append(max(0, rect.get_area()) / bounds.get_area())
largest = max(ratios, default=0.0)
route = ("TEXT_CANDIDATE" if chars >= 40 else
"OCR_CANDIDATE" if largest >= 0.70 else "REVIEW")
return {"page": page.number + 1, "chars": chars,
"largest_image_ratio": round(largest, 3), "route": route}
with pymupdf.open() as source:
page = source.new_page(width=360, height=480)
page.insert_text((28, 60), "Sample invoice 2026-09-26", fontsize=16)
page.insert_text((28, 100), "Quantity 12 Unit price USD 15.00", fontsize=12)
page.insert_text((28, 132), "Amount USD 180.00 Checked manually", fontsize=12)
scan = page.get_pixmap(matrix=pymupdf.Matrix(2, 2)).tobytes("png")
page = source.new_page(width=360, height=480)
page.insert_image(page.rect, stream=scan)
source.new_page(width=360, height=480)
source.save("routing-fixture.pdf")
with pymupdf.open("routing-fixture.pdf") as pdf:
result = [inspect_page(page) for page in pdf]
assert [r["route"] for r in result] == [
"TEXT_CANDIDATE", "OCR_CANDIDATE", "REVIEW"]
assert result[1]["chars"] == 0
assert result[1]["largest_image_ratio"] == 1.0
pdf[1].set_rotation(90)
assert inspect_page(pdf[1])["route"] == "OCR_CANDIDATE"
print(json.dumps(result, indent=2))
Ao acessar o OCR, o TextPage é armazenado em cache em vez de uma marca de sucesso.
A interface OCR do PyMuPDF é page.get_textpage_ocr(...). O Tesseract e os dados de idioma correspondentes precisam ser preparados separadamente. Depois de obter o TextPage, ele deve ser passado como parâmetro textpage durante a extração subsequente para evitar o reconhecimento repetido da mesma página. Consulte Documentação de OCR PyMuPDF para métodos e parâmetros de instalação específicos.
Este artigo não executou o mecanismo de OCR, portanto, os resultados do teste só podem provar que a lógica e as coordenadas de desvio são usadas corretamente e não representam a taxa de reconhecimento chinês, a taxa de recuperação de tabela ou a qualidade da tradução. A versão do mecanismo de OCR, o pacote de idiomas, o número da página, o resumo do arquivo de entrada e os resultados da inspeção manual devem ser registrados no ambiente de produção. Não guarde apenas a string final, caso contrário será difícil explicar de qual página vem um determinado número.
Três tipos de falhas que são mais facilmente ignoradas
A camada de texto oculta pode estar distorcida. Se o número de caracteres atingir o padrão, significa apenas "você pode continuar tentando extrair". Você também precisa verificar se os caracteres de substituição, linhas repetidas e campos-chave correspondem à renderização. Conteúdos importantes, como número do contrato e valor, devem ser verificados aleatoriamente.
As palavras desenhadas por caminhos vetoriais não são texto nem imagens. Entrarão em REVISÃO. Não os marque automaticamente como em branco e não descarte páginas silenciosamente.
Fechar o documento e depois usar a página gerará objetos inválidos. Por favor, mantenha o escopo de with pymupdf.open(...) e conclua a simulação, renderização e extração antes de liberar o arquivo. Para obter mais detalhes sobre coordenadas, informações de imagem e ciclo de vida da página, consulte PyMuPDF Page API.
PDFs não confiáveis também devem ter tamanho de arquivo, contagem de páginas, pixels renderizados, tempo e limites de memória definidos em um processo separado. O exemplo testa apenas arquivos pequenos e não fornece uma sandbox de arquivos maliciosos. Antes de usar o PyMuPDF em produção, você também deve verificar as condições de licença e o método de distribuição.
Insira o fluxo de trabalho de tradução do desvio
A saída qualificada não é uma sequência de texto, mas um registro com números de páginas e motivos da decisão. Antes de traduzir, confirme quais páginas podem ser extraídas de forma confiável; verifique e aceite o conteúdo, números e layout após a tradução. Você pode visualizar os serviços de processamento de documentos em Portal de produtos OmniDoc. O programa local neste artigo é executado de forma independente e não depende da conta OmniDoc, nem significa que seja o algoritmo dentro do produto.
📊 Comparação principal
| rota | Condição de gatilho | página adequada | Principais riscos |
|---|---|---|---|
| Extração direta (TEXT_CANDIDATE) | Pelo menos 40 caracteres sem espaço em branco | Página de texto com camada de texto existente | A camada oculta de OCR incorreta pode conter caracteres distorcidos |
| Candidato a OCR (OCR_CANDIDATE) | Menos de 40 palavras e uma única imagem cobrindo pelo menos 70% | Digitalização de página inteira | Fotos puras também atenderão às condições, mas os resultados do OCR podem não ser significativos. |
| Inspeção manual (REVISÃO) | Não atende às duas categorias acima | Página em branco, tipo de vetor, título esparso, quebra-cabeça complexo | O julgamento manual é necessário e não pode ser automaticamente ignorado ou descartado. |
🎯 Qual método é adequado para você?
se você……
- Estamos lidando com documentos mistos, e a qualidade da frente e do verso é muito diferente: verifique previamente página por página e insira rotas diferentes respectivamente.
- Lidar principalmente com documentos que contenham números-chave, como contratos e finanças: a página TEXT_CANDIDATE também deve ser verificada aleatoriamente quanto à correspondência entre números e representações.
- Necessidade de processar digitalizações em lotes: registre a versão do mecanismo, o pacote de idiomas e o número da página para resultados de OCR para facilitar o retrocesso.
- Recebendo PDFs de fontes desconhecidas: Defina limites de recursos em um processo separado, não os processe diretamente no programa principal.
❓ Perguntas frequentes (FAQ)
1. O texto pode ser copiado na página inicial. Posso pular o OCR de todo o PDF?
Não pode. Só porque a página inicial tem uma camada de texto não significa que as páginas subsequentes a terão e devem ser avaliadas página por página.
2. Por que não adicionar as áreas da imagem diretamente?
Adicionar áreas de imagens sobrepostas superestimará a cobertura. Este artigo usa a imagem maior, portanto, uma página digitalizada com várias imagens unidas pode cair em REVISÃO, que é um limite retido intencionalmente.
3. Se o número de caracteres chegar a 40, significa que não há problema com a qualidade do texto?
Não se pode concluir dessa forma. Camadas de OCR ruins ocultas também podem ter muitas palavras, portanto, verifique se há caracteres de substituição, linhas duplicadas e campos-chave de verificação pontual.
4. Como deve ser processado o texto desenhado pelo caminho vetorial?
Eles não são texto nem imagens, entram em REVISÃO, são julgados por humanos e não devem ser automaticamente marcados como em branco ou descartados silenciosamente.
5. O programa local depende da conta OmniDoc?
Não dependente. O programa local deste artigo é executado de forma independente e não chama nenhum serviço online de OCR ou tradução.
📝 Resumo
Deixe as evidências página por página primeiro e depois decida se deseja fazer o OCR. É mais útil deixar páginas incertas na fila do que disfarçar resultados incertos como sucesso.
Experimente agora: carregue o documento para iniciar a tradução, mantendo o layout original


