Como extrair texto de PDF em Python (3 bibliotecas)
Extrair texto de PDF em Python parece algo simples à primeira vista, mas quem já tentou sabe que o processo está cheio de exceções, layouts quebrados e documentos teimosos baseados em imagem. Este guia vai direto ao ponto. Primeiro, você verá uma comparação prática das melhores bibliotecas Python para a tarefa, para escolher rapidamente a opção certa para o seu projeto.

Depois, vamos passar por exemplos de código com três das bibliotecas mais eficazes: PyPDF2, pdfplumber e PyMuPDF (Fitz), cobrindo desde a extração básica de texto até o tratamento de tabelas complexas. Também vamos abordar o cenário mais difícil: PDFs escaneados que exigem OCR, mostrando uma forma prática de lidar com isso sem depender de configurações locais complicadas. Ao final, você terá tanto o código quanto a estratégia para automatizar seus fluxos de processamento de PDF com mais confiança.
Veredito rápido: melhores bibliotecas Python para extrair texto de PDF
Antes de entrar no código, aqui vai uma visão geral das principais opções. A escolha ideal depende totalmente do que você precisa priorizar: velocidade, simplicidade ou análise de layout com mais precisão.
| Biblioteca | Melhor para | Layout/tabelas | Desempenho | Facilidade de uso (1-5) |
|---|---|---|---|---|
| PyPDF2 | Documentos simples, só com texto; manipulação básica de PDF (mesclar/dividir) | Fraco (extrai o fluxo de texto, sem dados de posição) | Moderado | 5 |
| pdfplumber | Extrair dados de tabelas; documentos com layout estruturado | Excelente (fornece coordenadas de texto, linhas e retângulos) | Mais lento | 4 |
| PyMuPDF (Fitz) | Processamento em lote com alta velocidade; imagens e anotações | Bom (consegue extrair texto com informações básicas de posição) | Excelente (o mais rápido) | 4 |
Resumo prático: Comece com PyPDF2 nos casos mais simples. Passe para pdfplumber assim que aparecer uma tabela. Escolha PyMuPDF quando desempenho for a sua prioridade.
Antes de começar: configurando seu ambiente Python
Para manter as dependências do projeto organizadas e evitar conflitos, trabalhe sempre dentro de um ambiente virtual. Essa é uma prática essencial em qualquer projeto Python mais sério.
Veja como configurar tudo no terminal:
- Crie um ambiente virtual:
# No macOS/Linux
python3 -m venv pdf_env
# No Windows
python -m venv pdf_env
```
2. **Ative o ambiente:**
```plaintext
# No macOS/Linux
source pdf_env/bin/activate
# No Windows
.\pdf_env\Scripts\activate
```
Seu terminal agora deve mostrar `(pdf_env)`.
3. **Instale as bibliotecas:** vamos instalar as três bibliotecas comparadas aqui para que você possa testar cada abordagem com facilidade.
```plaintext
pip install pypdf2 pdfplumber pymupdf
```
Com isso, seu ambiente está pronto para os exemplos de código abaixo.
---
## Método 1: extração básica de texto com PyPDF2
PyPDF2 é a biblioteca mais usada para operações básicas com PDF. Ela é direta, existe há bastante tempo e funciona muito bem com PDFs nativos, em que o texto pode ser selecionado e não faz parte de uma imagem. Se você precisa ler PDF com Python em relatórios simples, artigos ou exportações baseadas em texto, PyPDF2 costuma resolver com pouco código.
A principal limitação? Ela lê o fluxo interno de texto do PDF, que nem sempre corresponde à ordem visual de leitura, especialmente em layouts com múltiplas colunas. Além disso, não entende tabelas: ela simplesmente junta todo o texto das células em um bloco só.
Aqui está um script simples para extrair todo o texto de um PDF:
```python
# requirements: pip install pypdf2
import PyPDF2
def extract_text_with_pypdf2(pdf_path):
"""
Extrai texto de um arquivo PDF usando a biblioteca PyPDF2.
Args:
pdf_path (str): Caminho do arquivo PDF.
Returns:
str: O conteúdo de texto extraído ou uma mensagem de erro.
"""
try:
with open(pdf_path, 'rb') as file:
reader = PyPDF2.PdfReader(file)
num_pages = len(reader.pages)
print(f"Total de páginas: {num_pages}")
full_text = ""
for page_num in range(num_pages):
page = reader.pages[page_num]
full_text += page.extract_text() + "\n"
return full_text
except FileNotFoundError:
return f"Erro: o arquivo em {pdf_path} não foi encontrado."
except Exception as e:
return f"Ocorreu um erro inesperado: {e}"
# --- Exemplo de uso ---
pdf_file = 'path/to/your/document.pdf'
extracted_text = extract_text_with_pypdf2(pdf_file)
if "Error" not in extracted_text:
print("--- Texto extraído ---")
print(extracted_text)
else:
print(extracted_text)
Esse script funciona muito bem para texto simples em coluna única. Mas o que acontece quando você usa isso em um demonstrativo financeiro com tabelas bem organizadas? O resultado é uma mistura de textos e números sem estrutura. É aí que a próxima biblioteca se destaca.
Método 2: tabelas e layout com pdfplumber
Quando a tarefa envolve extrair dados estruturados, o pdfplumber é a escolha certa. Construído sobre o pdfminer.six, ele foi feito para dar acesso detalhado à geometria de uma página PDF. Ele “enxerga” caracteres, linhas e retângulos, além de trazer um método nativo excelente para detectar e extrair tabelas.
Isso faz muita diferença em projetos de ciência de dados e automação de processos. Imagine tentar extrair resultados trimestrais de um relatório em PDF de uma empresa. Com PyPDF2, isso vira um pesadelo de tratamento de strings. Com pdfplumber, você obtém os dados como uma lista de listas limpa, pronta para virar um DataFrame do Pandas.
O principal motivo de o pdfplumber superar o PyPDF2 em dados estruturados é sua capacidade de interpretar o layout visual, e não apenas o fluxo bruto de texto. Ele entende que certos elementos de texto estão alinhados em linhas e colunas, separados por traços.
Veja como extrair tabelas de uma página PDF:
# requisitos: pip install pdfplumber
import pdfplumber
import pandas as pd
def extract_tables_with_pdfplumber(pdf_path, page_number=0):
"""
Extrai todas as tabelas de uma página específica de um PDF usando pdfplumber.
Args:
pdf_path (str): O caminho do arquivo PDF.
page_number (int): O número da página da qual extrair as tabelas (índice começando em 0).
Returns:
list of pandas.DataFrame: Uma lista em que cada elemento é um DataFrame
que representa uma tabela encontrada na página.
"""
tables = []
try:
with pdfplumber.open(pdf_path) as pdf:
if page_number >= len(pdf.pages):
print(f"Erro: a página {page_number} está fora do intervalo. O PDF tem {len(pdf.pages)} páginas.")
return tables
page = pdf.pages[page_number]
# .extract_tables() é o método principal aqui
extracted_tables = page.extract_tables()
for table_data in extracted_tables:
# Converte a lista de listas em um DataFrame do pandas
df = pd.DataFrame(table_data[1:], columns=table_data[0])
tables.append(df)
return tables
except FileNotFoundError:
print(f"Erro: o arquivo em {pdf_path} não foi encontrado.")
return tables
except Exception as e:
print(f"Ocorreu um erro inesperado: {e}")
return tables
# --- Exemplo de uso ---
# Você vai precisar de pandas neste exemplo: pip install pandas
pdf_file_with_table = 'path/to/your/report.pdf'
all_tables = extract_tables_with_pdfplumber(pdf_file_with_table, page_number=0)
if all_tables:
print(f"Encontradas {len(all_tables)} tabela(s) na página 0.")
for i, table_df in enumerate(all_tables):
print(f"\n--- Tabela {i+1} ---")
print(table_df)
else:
print("Nenhuma tabela encontrada na página especificada.")
O preço dessa precisão é a velocidade. O pdfplumber faz mais trabalho analisando a página, então naturalmente é mais lento do que bibliotecas que apenas despejam o texto.
Método 3: extração de alto desempenho com PyMuPDF (Fitz)
Quando você precisa processar centenas ou milhares de PDFs rapidamente, desempenho passa a ser o fator decisivo. É aí que o PyMuPDF, importado como fitz, se destaca. Ele é um binding em Python para o MuPDF, uma biblioteca leve em C, o que o torna excepcionalmente rápido.
Certa vez, trabalhei em um projeto que exigia processar alguns milhares de documentos jurídicos com várias páginas. Minha primeira versão com pdfplumber levaria horas para terminar. Ao trocar para PyMuPDF, o tempo total caiu para menos de 30 minutos. A diferença de velocidade é realmente grande.
Além da velocidade, o PyMuPDF é muito completo em recursos. Ele consegue renderizar páginas como imagens — algo essencial em fluxos com OCR —, extrair imagens incorporadas e lidar com anotações. Embora a extração de tabelas não seja tão pronta para uso quanto no pdfplumber, sua velocidade para extrair texto bruto é difícil de superar.
Aqui está o equivalente em PyMuPDF para extrair texto com rapidez:
# requisitos: pip install PyMuPDF
import fitz # A biblioteca PyMuPDF
def extract_text_with_pymupdf(pdf_path):
"""
Extrai texto de um arquivo PDF usando a biblioteca de alto desempenho PyMuPDF (Fitz).
Args:
pdf_path (str): O caminho do arquivo PDF.
Returns:
str: O conteúdo de texto extraído ou uma mensagem de erro.
"""
try:
doc = fitz.open(pdf_path)
full_text = ""
for page in doc:
# .get_text() é a função principal
full_text += page.get_text() + "\n"
doc.close()
return full_text
except FileNotFoundError:
return f"Erro: o arquivo em {pdf_path} não foi encontrado."
except Exception as e:
# O PyMuPDF pode gerar erros específicos, por exemplo, fitz.fitz.FitzError
return f"Ocorreu um erro com PyMuPDF: {e}"
# --- Exemplo de uso ---
pdf_file = 'path/to/your/document.pdf'
fast_extracted_text = extract_text_with_pymupdf(pdf_file)
if "Error" not in fast_extracted_text:
print("--- Texto extraído (método rápido) ---")
print(fast_extracted_text)
else:
print(fast_extracted_text)
Quando o objetivo é máxima vazão em PDFs com texto selecionável, o PyMuPDF é o campeão absoluto.
Caso especial: como lidar com PDFs escaneados usando OCR
Você pode estar se perguntando: o que acontece quando nenhum desses métodos funciona? Se você rodar o código acima em um documento escaneado — como a imagem de um contrato ou uma página de livro digitalizada —, o retorno será uma string vazia.
Isso acontece porque não existe camada de texto. O PDF contém uma imagem, não caracteres. Para resolver, você precisa de OCR (Reconhecimento Óptico de Caracteres) para “ler” a imagem e convertê-la em texto legível por máquina.
A solução padrão em Python é o pytesseract, um wrapper para o mecanismo Tesseract OCR do Google. Embora seja poderoso, ele traz uma dor de cabeça importante: você precisa instalar o Tesseract separadamente no sistema (por exemplo, via brew no Mac ou com um instalador no Windows) e garantir que o Python consiga localizar o executável. Essa configuração pode ser frágil, especialmente ao publicar seu código em um servidor ou compartilhá-lo com colegas.
Alternativa: pré-processar PDFs complexos com uma ferramenta sem código
Quando o prazo está apertado ou você simplesmente não quer lidar com a complexidade de gerenciar dependências de OCR, uma alternativa prática é terceirizar primeiro a extração de texto para uma ferramenta dedicada. Assim, você separa o problema mais complexo do OCR da lógica principal do seu código em Python.
Uma ferramenta com IA como o extrator de texto de PDF com IA da Lynote pode funcionar como um ótimo pré-processador. Você envia seu PDF escaneado mais problemático, e a ferramenta cuida do OCR nos bastidores, entregando um texto limpo para usar depois no seu script. Isso é especialmente útil em tarefas pontuais ou quando você precisa lidar com um pequeno lote de arquivos problemáticos.
O fluxo é bem simples:
- Envie seu arquivo PDF. Acesse o workspace da Lynote. Na aba 'Upload File', você pode arrastar e soltar seu PDF ou procurar o arquivo no computador. Isso funciona tanto para PDFs com texto selecionável quanto para PDFs escaneados baseados em imagem.
- Extraia o texto do PDF. Depois que o arquivo for enviado, clique no botão "Create Note". O mecanismo de IA da Lynote processa o documento, aplica OCR automaticamente se detectar um arquivo baseado em imagem e gera uma versão de texto limpa e pesquisável.
- Copie o texto extraído. Quando o texto aparecer no editor, você pode revisar o conteúdo, fazer pequenos ajustes se necessário e usar o botão de copiar para capturar tudo. O texto ficará na área de transferência, pronto para ser colado no seu script Python como uma variável string.


Com essa abordagem, você pode focar na parte de análise de dados do seu código, e não na infraestrutura e no tratamento de erros de uma configuração local de OCR.
Erros comuns e dicas avançadas
Extrair texto de PDF em Python raramente é um processo perfeito. Estes são alguns problemas comuns que você provavelmente vai encontrar:
- Codificação de caracteres: Você pode se deparar com um
UnicodeDecodeError. Isso costuma acontecer com PDFs mais antigos ou gerados por softwares pouco comuns. A maioria das bibliotecas modernas lida bem comUTF-8, mas definir a codificação manualmente às vezes ajuda, se a biblioteca permitir. - PDFs protegidos por senha: Se o PDF exige senha para abrir, todas essas bibliotecas vão falhar. Você precisa informar a senha no momento da abertura. Por exemplo,
PyPDF2.PdfReader(file, password='your_password'). - Perda de formatação: Lembre-se de que a extração de texto quase sempre perde formatações como negrito, itálico, tamanho da fonte e cor. O que você obtém é o conteúdo bruto do texto, não a representação visual.
- Texto embaralhado em colunas: Como vimos no caso do PyPDF2, layouts com múltiplas colunas (como artigos acadêmicos) podem gerar texto com linhas misturadas de colunas diferentes. O
pdfplumberé muito melhor nesse cenário, porque entende a geometria da página.
Dica de especialista: Sempre teste seu script com uma amostra representativa dos seus documentos. Uma solução que funciona perfeitamente em um PDF pode falhar completamente em outro de uma fonte diferente.
Perguntas frequentes
Por que o texto extraído da minha tabela virou uma string longa e bagunçada?
Esse é o modo de falha clássico de bibliotecas como o PyPDF2, que não fazem análise de layout da página. Elas leem o fluxo bruto de texto na ordem em que ele está armazenado no arquivo, o que muitas vezes não corresponde à estrutura visual de linhas e colunas. Para corrigir isso, você precisa usar uma biblioteca com análise de layout, como **pdfplumber**, que foi projetada especificamente para reconhecer dados tabulares.
O Python consegue extrair texto de uma área específica da página do PDF?
Sim, mas você precisa de uma biblioteca que forneça informações de coordenadas. pdfplumber e PyMuPDF são excelentes para isso. Com pdfplumber, você pode usar o método .crop((x0, top, x1, bottom)) para criar uma caixa delimitadora e depois executar .extract_text() ou .extract_tables() apenas dentro dessa área recortada.
Por que o texto extraído do meu PDF escaneado está vazio?
Seu PDF contém uma imagem com texto, e não dados de texto reais. Bibliotecas padrão não conseguem “ler” imagens. Você precisa usar um processo de OCR. Você pode configurar um mecanismo de OCR local com pytesseract ou usar uma ferramenta de pré-processamento como Lynote para converter primeiro o PDF baseado em imagem em texto limpo.
Como lidar com PDFs em vários idiomas?
Bibliotecas modernas como PyMuPDF e pdfplumber geralmente lidam bem com Unicode, que oferece suporte à maioria dos idiomas. O principal desafio aparece no OCR. O Tesseract, por exemplo, exige que você baixe e especifique os pacotes de idioma que deseja usar (por exemplo, -l eng+fra para inglês e francês).
Conclusão: qual biblioteca Python usar para PDF
Não existe uma única biblioteca “melhor” para extrair texto de PDF em Python. A escolha certa sempre depende do tipo de documento que você tem e dos objetivos do seu projeto.
Resumindo em uma decisão simples:
- Se seus PDFs são documentos simples, baseados em texto e você só precisa do conteúdo bruto, PyPDF2 é a opção mais fácil e rápida de implementar.
- Se seus PDFs contêm tabelas ou layouts estruturados que você precisa transformar em dados (por exemplo, para carregar em um banco de dados ou em um DataFrame do Pandas), pdfplumber é a melhor escolha.
- Se você processa um grande volume de documentos e velocidade é sua prioridade, PyMuPDF (Fitz) é a opção mais poderosa e com melhor desempenho.
- Se você está lidando com PDFs escaneados, baseados em imagem, precisa usar OCR. Para uma solução rápida e confiável, sem a complexidade de configurar tudo localmente, o caminho mais prático costuma ser pré-processar o arquivo com uma ferramenta externa antes de levar o texto limpo para o seu ambiente Python.
Comece pela ferramenta mais simples que atenda ao que você precisa e esteja pronto para migrar para uma opção mais poderosa conforme a complexidade dos seus documentos aumentar.


