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çãoPráticas recomendadasrazão
Extraia pelo menos 40 caracteres que não sejam espaços em branco de uma única páginaExtraçã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áginaEnviar para fila de candidatos de OCRDigitalizaçõ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 complexoInspeçã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áginasSimulação página por página, processamento não concluídoEvite 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çãoDesvio deste artigoAinda preciso de atenção
Pelo menos 40 caracteres sem espaço em brancoTEXT_CANDIDATECamadas ocultas de OCR ruins também podem conter muitas palavras
Menos de 40 palavras e uma única imagem cobrindo pelo menos 70%OCR_CANDIDATEFotos puras também atenderão às condições, o OCR pode não ser significativo
Resto dos casosREVIEWEspaç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

rotaCondição de gatilhopágina adequadaPrincipais riscos
Extração direta (TEXT_CANDIDATE)Pelo menos 40 caracteres sem espaço em brancoPágina de texto com camada de texto existenteA 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 inteiraFotos 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 acimaPágina em branco, tipo de vetor, título esparso, quebra-cabeça complexoO 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

Atualizado em 2026-11-15