Pular para o conteúdo principal
Guia para desenvolvedores

Tesseract OCR em Python
com pytesseract.

Guia completo e testado do pytesseract: instalação, API principal, pré-processamento de imagens, PDF, pontuações de confiança, configuração PSM/OEM, desempenho e os erros mais comuns.

Início rápido (três linhas)

Instale o motor primeiro e execute isto. A configuração completa vem a seguir.

ocr.py
import pytesseract
from PIL import Image

text = pytesseract.image_to_string(Image.open("image.png"))
print(text)

Instalar o pytesseract

pytesseract é apenas um wrapper: ele chama o binário do Tesseract, então instale o motor primeiro.

bash
pip install pytesseract pillow
# opcional, para pré-processamento:
pip install opencv-python numpy
# opcional, para entrada PDF:
pip install pdf2image

Se o motor não estiver no seu PATH (comum no Windows), aponte explicitamente:

python
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

Novo no motor? Veja o guia de instalação para Windows, macOS, Linux, Docker e WSL.

API principal

O pytesseract expõe uma função por tipo de saída. Escolha a que corresponde ao que você precisa.

FunçãoRetornaUse quando
image_to_stringTexto simplesVocê só precisa do texto reconhecido
image_to_dataCaixas por palavra + confiançaDestacar texto, filtrar palavras de baixa confiança
image_to_boxesCaixas por caractereGeometria em nível de caractere
image_to_pdf_or_hocrPDF pesquisável ou hOCRCriar PDFs pesquisáveis ou overlays web
image_to_osdDetecção de orientação e escritaDetectar rotação ou escrita antes do OCR
image_to_alto_xmlALTO XMLPipelines de arquivo / bibliotecas

Configuração: PSM, OEM, idiomas e lista de caracteres

Passe as opções como uma string separada por espaços para config=.

config.py
# Um único bloco de texto, motor LSTM, português
text = pytesseract.image_to_string(img, lang="por", config="--oem 3 --psm 6")

# Somente dígitos (totais de recibos, leituras de medidores)
text = pytesseract.image_to_string(img, config="--psm 7 -c tessedit_char_whitelist=0123456789.")

# Idiomas combinados
text = pytesseract.image_to_string(img, lang="eng+por")
PSMModoIdeal para
3Totalmente automático (padrão)Documentos padrão
4Uma coluna de tamanhos variáveisArtigos, páginas de uma coluna
6Um bloco uniforme de textoParágrafos, etiquetas
7Uma única linha de textoLegendas de uma linha, campos isolados
8Uma única palavraPalavras individuais
11Texto esparsoRecibos, texto de interface espalhado
13Linha brutaUma linha sem truques específicos

Modos OEM: --oem 1 (somente LSTM, padrão na v5), --oem 0 (legado), --oem 3 (automático). Referência completa na documentação.

Pré-processamento de imagens

Uma entrada limpa é o maior fator de precisão. Estes são os passos que mais importam.

preprocessamento.py
import cv2, numpy as np, pytesseract
from PIL import Image

image = cv2.imread("recibo.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Amplie o texto pequeno para ~300 DPI equivalentes
gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

# Remova ruído e aplique limiar de Otsu para preto e branco puro
blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

text = pytesseract.image_to_string(Image.fromarray(binary))

Posições e pontuações de confiança

Use image_to_data para obter caixas por palavra e uma confiança de 0 a 100, e filtre o ruído.

confianca.py
from pytesseract import Output

data = pytesseract.image_to_data(img, output_type=Output.DICT)
for text, conf in zip(data["text"], data["conf"]):
    if text.strip() and float(conf) > 60:   # descarta ruído de baixa confiança
        print(round(float(conf)), text)

OCR de um PDF em Python

O Tesseract trabalha com imagens, então rasterize as páginas do PDF primeiro com pdf2image (que requer as ferramentas poppler).

pdf.py
import io, pytesseract
from pdf2image import convert_from_path
from pypdf import PdfWriter, PdfReader

pages = convert_from_path("digitalizado.pdf", dpi=300)   # requer poppler
writer = PdfWriter()
for page in pages:
    pdf_bytes = pytesseract.image_to_pdf_or_hocr(page, extension="pdf")
    writer.add_page(PdfReader(io.BytesIO(pdf_bytes)).pages[0])
with open("digitalizado_pesquisavel.pdf", "wb") as f:
    writer.write(f)

No Windows, passe a pasta bin do poppler com poppler_path=. Para um fluxo mais completo, veja a documentação sobre formatos de saída.

Desempenho

O pytesseract chama a CLI a cada chamada, então o desempenho depende de como você estrutura o processo.

AbordagemQuandoCompromisso
pytesseract por chamadaScripts e tarefas pontuaisInicia um processo por chamada — lento em laços
Agrupar em TIFF multipáginaMuitas páginas com as mesmas opçõesUm processo para muitas páginas
multiprocessingMuitas imagens independentesUsa todos os núcleos; mais memória
tesserocrAlto volume, em processoBinding nativo, mais configuração

Catálogo de erros

Estes erros cobrem a maioria dos problemas com o pytesseract.

ErroCausaCorreção
TesseractNotFoundErrorBinário não instalado ou fora do PATHInstale o motor ou defina pytesseract.pytesseract.tesseract_cmd.
(-215:Assertion failed) src.type() == CV_8UC1Limiar em imagem de 3 canaisConverta com cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) primeiro.
Error opening data file ...fra.traineddataPacote de idioma ausenteInstale o idioma ou defina TESSDATA_PREFIX.
Saída vaziaDPI baixo, PSM errado ou sem textoAmplie, teste --psm 6/7/11 e pré-processe.
Muito lento em laçoUm processo por chamadaAgrupe, use multiprocessing ou tesserocr.

Medir a precisão

Meça a taxa de erro de caracteres e palavras em vez de avaliar a saída a olho.

eval.py
import pytesseract, jiwer
from PIL import Image

hypothesis = pytesseract.image_to_string(Image.open("amostra.png"))
reference  = open("amostra.gt.txt").read()

print("CER:", jiwer.cer(reference, hypothesis))
print("WER:", jiwer.wer(reference, hypothesis))

Mantenha um pequeno conjunto de imagens representativas com texto de referência como testes de regressão e reexecute ao mudar o pré-processamento ou a configuração.

Perguntas frequentes de Python

Como uso o Tesseract OCR em Python?

Instale primeiro o motor Tesseract e depois pip install pytesseract pillow. Abra a imagem com o Pillow e chame pytesseract.image_to_string(img).

Por que recebo TesseractNotFoundError?

O pytesseract não encontra o binário. Instale o motor, coloque-o no PATH ou defina pytesseract.pytesseract.tesseract_cmd com o caminho completo.

Como melhoro a precisão?

Escale a ~300 DPI, escala de cinza, limiar, remoção de ruído, alinhamento e o --psm correto. Use o lang= adequado e, para campos fixos, uma lista de caracteres permitidos.

Como faço OCR de um PDF?

Use pdf2image (com poppler) para converter as páginas em imagens, rode o pytesseract em cada uma e combine com image_to_pdf_or_hocr(..., extension="pdf").

Como obtenho pontuações de confiança?

Use image_to_data(..., output_type=Output.DICT) e filtre pela lista conf.

O pytesseract é lento?

Cada chamada inicia um processo. Agrupe, use multiprocessing ou mude para o binding em processo tesserocr para alto desempenho.

Aprofunde-se no motor e no ecossistema.