Extrair texto de PDFs com PDFMiner em Python
Domine a extração de texto de PDF com Python
PDFMiner.six é uma biblioteca Python poderosa para extrair texto, metadados e informações de layout de documentos PDF.
Este guia faz parte do nosso hub Ferramentas de Documentação em 2026: Markdown, LaTeX, PDF e Fluxos de Impressão.
Diferente de leitores PDF simples, ele oferece uma análise profunda da estrutura PDF e lida com layouts complexos de forma eficaz.

O que é o PDFMiner e Por Que Usá-lo?
O PDFMiner é uma biblioteca pura em Python projetada para extrair e analisar texto de documentos PDF. A versão .six é o fork mantido ativamente que suporta Python 3.x, enquanto o projeto original PDFMiner não é mais atualizado.
Principais Funcionalidades:
- Implementação pura em Python (sem dependências externas)
- Análise detalhada de layout e posicionamento de texto
- Detecção de codificação de fontes e caracteres
- Suporte para PDFs criptografados
- Ferramentas de linha de comando incluídas
- Arquitetura extensível para processamento personalizado
O PDFMiner é particularmente útil quando você precisa de controle preciso sobre a extração de texto, precisa preservar informações de layout ou trabalha com documentos complexos de múltiplas colunas. Embora possa ser mais lento do que algumas alternativas, sua precisão e capacidades de análise detalhada o tornam a escolha preferida para fluxos de trabalho de processamento de documentos. Para o fluxo de trabalho inverso, você também pode se interessar por gerar PDFs programaticamente em Python.
Instalação e Configuração
Instale o PDFMiner.six usando o pip:
pip install pdfminer.six
Para ambientes virtuais (recomendado):
python -m venv venv
source venv/bin/activate # No Windows: venv\Scripts\activate
pip install pdfminer.six
Se você é novo na gestão de pacotes Python, confira nossa Lista de Atalhos Python para mais detalhes sobre pip e ambientes virtuais.
Verifique a instalação:
pdf2txt.py --version
A biblioteca inclui várias ferramentas de linha de comando:
pdf2txt.py- Extrai texto de PDFsdumppdf.py- Exporta a estrutura interna do PDFlatin2ascii.py- Converte caracteres latinos para ASCII
Estas ferramentas complementam outras utilidades de manipulação de PDF como o Poppler que fornecem funcionalidades adicionais, como extração de páginas e conversão de formatos.
Extração Básica de Texto
Extração de Texto Simples
A maneira mais direta de extrair texto de um PDF:
from pdfminer.high_level import extract_text
# Extrair todo o texto de um PDF
text = extract_text('document.pdf')
print(text)
Esta API de alto nível lida com a maioria dos casos de uso comuns e retorna todo o documento como uma única string.
Extrair Texto de Páginas Específicas
Para extrair texto de páginas específicas:
from pdfminer.high_level import extract_text
# Extrair texto das páginas 2-5 (índice iniciando em 0)
text = extract_text('document.pdf', page_numbers=[1, 2, 3, 4])
print(text)
Isso é particularmente útil para documentos grandes onde você só precisa de certas seções, melhorando significativamente o desempenho.
Extrair Texto com Iteração de Páginas
Para processar páginas individualmente:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
for page_layout in extract_pages('document.pdf'):
for element in page_layout:
if isinstance(element, LTTextContainer):
print(element.get_text())
Esta abordagem oferece mais controle sobre como cada página é processada, útil quando se trabalha com documentos onde a estrutura da página varia.
Análise Avançada de Layout
Compreendendo os LAParams
LAParams (Parâmetros de Análise de Layout) controlam como o PDFMiner interpreta o layout do documento. Compreender a diferença entre o PDFMiner e bibliotecas mais simples é crucial aqui - o PDFMiner analisa efetivamente as relações espaciais entre elementos de texto.
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Criar LAParams personalizados
laparams = LAParams(
line_overlap=0.5, # Sobreposição mínima para linhas de texto
char_margin=2.0, # Margem de caracteres
line_margin=0.5, # Margem de linhas
word_margin=0.1, # Espaçamento de palavras
boxes_flow=0.5, # Limiar de fluxo de caixas
detect_vertical=True, # Detectar texto vertical
all_texts=False # Extrair apenas texto em caixas
)
text = extract_text('document.pdf', laparams=laparams)
Explicação dos Parâmetros:
line_overlap: Quanto as linhas devem se sobrepor verticalmente para serem consideradas a mesma linha (0.0-1.0)char_margin: Espaçamento máximo entre caracteres na mesma palavra (como múltiplo da largura do caractere)line_margin: Espaçamento máximo entre linhas no mesmo parágrafoword_margin: Limiar de espaçamento para separar palavrasboxes_flow: Limiar para direção de fluxo de caixas de textodetect_vertical: Habilitar detecção de texto vertical (comum em línguas asiáticas)
Extraindo Informações de Layout
Obtenha informações detalhadas de posição e fonte:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextBox, LTTextLine, LTChar
for page_layout in extract_pages('document.pdf'):
for element in page_layout:
if isinstance(element, LTTextBox):
# Obter coordenadas da caixa delimitadora
x0, y0, x1, y1 = element.bbox
print(f"Texto em ({x0}, {y0}): {element.get_text()}")
# Iterar através das linhas
for text_line in element:
if isinstance(text_line, LTTextLine):
# Obter detalhes ao nível de caracteres
for char in text_line:
if isinstance(char, LTChar):
print(f"Caractere: {char.get_text()}, "
f"Fonte: {char.fontname}, "
f"Tamanho: {char.height}")
Este nível de detalhe é inestimável para análise de documentos, extração de formulários ou quando você precisa entender a estrutura do documento programaticamente.
Lidando com Diferentes Tipos de PDF
PDFs Criptografados
O PDFMiner pode lidar com PDFs protegidos por senha:
from pdfminer.high_level import extract_text
# Extrair de PDF protegido por senha
text = extract_text('encrypted.pdf', password='your_password')
Observe que o PDFMiner só pode extrair texto de PDFs - ele não pode contornar restrições de segurança que impedem a extração de texto no nível do PDF.
Documentos de Múltiplas Colunas
Para documentos com múltiplas colunas, ajuste os LAParams:
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Otimizar para layouts de múltiplas colunas
laparams = LAParams(
detect_vertical=False,
line_margin=0.3,
word_margin=0.1,
boxes_flow=0.3 # Valor menor para melhor detecção de colunas
)
text = extract_text('multi_column.pdf', laparams=laparams)
O parâmetro boxes_flow é particularmente importante para documentos de múltiplas colunas - valores menores ajudam o PDFMiner a distinguir entre colunas separadas.
Texto Não-Inglês e Unicode
O PDFMiner lida bem com Unicode, mas garanta a codificação adequada:
from pdfminer.high_level import extract_text
# Extrair texto com suporte Unicode
text = extract_text('multilingual.pdf', codec='utf-8')
# Salvar em arquivo com codificação UTF-8
with open('output.txt', 'w', encoding='utf-8') as f:
f.write(text)
Trabalhando com PDFs Digitalizados
O PDFMiner não pode extrair texto de PDFs digitalizados (imagens) diretamente. Estes requerem OCR (Reconhecimento Óptico de Caracteres). No entanto, você pode integrar o PDFMiner com ferramentas de OCR.
Veja como detectar se um PDF é digitalizado e precisa de OCR:
from pdfminer.high_level import extract_text
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTFigure, LTImage
def is_scanned_pdf(pdf_path):
"""Verifica se o PDF parece ser digitalizado (principalmente imagens)"""
text_count = 0
image_count = 0
for page_layout in extract_pages(pdf_path):
for element in page_layout:
if isinstance(element, (LTFigure, LTImage)):
image_count += 1
elif hasattr(element, 'get_text'):
if element.get_text().strip():
text_count += 1
# Se houver mais imagens do que texto, provavelmente é digitalizado
return image_count > text_count * 2
if is_scanned_pdf('document.pdf'):
print("Este PDF parece ser digitalizado - use OCR")
else:
text = extract_text('document.pdf')
print(text)
Para PDFs digitalizados, considere integrar com o OCR Tesseract ou usar ferramentas para extrair imagens de PDFs primeiro, e depois aplicar OCR nessas imagens.
Uso da Linha de Comando
O PDFMiner inclui ferramentas de linha de comando poderosas:
Extrair Texto com Ferramentas de Linha de Comando
# Extrair texto para a saída padrão
pdf2txt.py document.pdf
# Salvar em arquivo
pdf2txt.py -o output.txt document.pdf
# Extrair páginas específicas
pdf2txt.py -p 1,2,3 document.pdf
# Extrair como HTML
pdf2txt.py -t html -o output.html document.pdf
Opções Avançadas
# Parâmetros de layout personalizados
pdf2txt.py -L 0.3 -W 0.1 document.pdf
# Extrair com layout detalhado (XML)
pdf2txt.py -t xml -o layout.xml document.pdf
# Definir senha para PDF criptografado
pdf2txt.py -P mypassword encrypted.pdf
Estas ferramentas de linha de comando são excelentes para testes rápidos, scripts de shell e integração em fluxos de trabalho automatizados.
Otimização de Desempenho
Processamento de PDFs Grandes
Para documentos grandes, considere estas estratégias de otimização:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LAParams
# Processar apenas páginas necessárias
def extract_page_range(pdf_path, start_page, end_page):
text_content = []
for i, page_layout in enumerate(extract_pages(pdf_path)):
if i < start_page:
continue
if i >= end_page:
break
text_content.append(page_layout)
return text_content
# Desabilitar análise de layout para velocidade
from pdfminer.high_level import extract_text
text = extract_text('large.pdf', laparams=None) # Muito mais rápido
Processamento em Lote
Para processar múltiplos PDFs com eficiência:
from multiprocessing import Pool
from pdfminer.high_level import extract_text
import os
def process_pdf(pdf_path):
"""Processa um único arquivo PDF"""
try:
text = extract_text(pdf_path)
output_path = pdf_path.replace('.pdf', '.txt')
with open(output_path, 'w', encoding='utf-8') as f:
f.write(text)
return f"Processado: {pdf_path}"
except Exception as e:
return f"Erro ao processar {pdf_path}: {str(e)}"
# Processar PDFs em paralelo
def batch_process_pdfs(pdf_directory, num_workers=4):
pdf_files = [os.path.join(pdf_directory, f)
for f in os.listdir(pdf_directory)
if f.endswith('.pdf')]
with Pool(num_workers) as pool:
results = pool.map(process_pdf, pdf_files)
for result in results:
print(result)
# Uso
batch_process_pdfs('/path/to/pdfs', num_workers=4)
Problemas Comuns e Soluções
Problema: Ordem de Texto Incorreta
Problema: O texto extraído aparece embaralhado ou fora de ordem.
Solução: Ajuste os LAParams, especialmente boxes_flow:
from pdfminer.layout import LAParams
laparams = LAParams(boxes_flow=0.3) # Tente valores diferentes
text = extract_text('document.pdf', laparams=laparams)
Problema: Espaços Ausentes Entre Palavras
Problema: Palavras aparecem juntas sem espaços.
Solução: Aumente o word_margin:
laparams = LAParams(word_margin=0.2) # Aumente do padrão 0.1
text = extract_text('document.pdf', laparams=laparams)
Problema: Erros de Codificação
Problema: Caracteres estranhos ou erros de codificação.
Solução: Especifique o codec explicitamente:
text = extract_text('document.pdf', codec='utf-8')
Problema: Erros de Memória com PDFs Grandes
Problema: Erros de falta de memória com arquivos grandes.
Solução: Processe página por página:
def extract_text_chunked(pdf_path, chunk_size=10):
"""Extrai texto em blocos para reduzir o uso de memória"""
all_text = []
page_count = 0
for page_layout in extract_pages(pdf_path):
page_text = []
for element in page_layout:
if hasattr(element, 'get_text'):
page_text.append(element.get_text())
all_text.append(''.join(page_text))
page_count += 1
# Processar em blocos
if page_count % chunk_size == 0:
yield ''.join(all_text)
all_text = []
# Renderizar texto restante
if all_text:
yield ''.join(all_text)
Comparando PDFMiner com Alternativas
Compreender quando usar o PDFMiner versus outras bibliotecas é importante:
PDFMiner vs PyPDF2
PyPDF2 é mais simples e mais rápido, mas menos preciso:
- Use PyPDF2 para: PDFs simples, extração rápida, mesclar/dividir PDFs
- Use PDFMiner para: Layouts complexos, posicionamento preciso de texto, análise detalhada
PDFMiner vs pdfplumber
pdfplumber constrói sobre o PDFMiner com uma API de nível superior:
- Use pdfplumber para: Extração de tabelas, API mais simples, prototipagem rápida
- Use PDFMiner para: Controle máximo, processamento personalizado, sistemas de produção
PDFMiner vs PyMuPDF (fitz)
PyMuPDF é significativamente mais rápido, mas tem dependências C:
- Use PyMuPDF para: Aplicações críticas de desempenho, processamento em larga escala
- Use PDFMiner para: Requisito de Python puro, análise detalhada de layout
Exemplo Prático: Extrair e Analisar Documento
Aqui está um exemplo completo que extrai texto e fornece estatísticas do documento:
from pdfminer.high_level import extract_pages, extract_text
from pdfminer.layout import LTTextBox, LTChar
from collections import Counter
import re
def analyze_pdf(pdf_path):
"""Extrai texto e fornece análise do documento"""
# Extrair texto completo
full_text = extract_text(pdf_path)
# Estatísticas
stats = {
'total_chars': len(full_text),
'total_words': len(full_text.split()),
'total_lines': full_text.count('\n'),
'fonts': Counter(),
'font_sizes': Counter(),
'pages': 0
}
# Análise detalhada
for page_layout in extract_pages(pdf_path):
stats['pages'] += 1
for element in page_layout:
if isinstance(element, LTTextBox):
for line in element:
for char in line:
if isinstance(char, LTChar):
stats['fonts'][char.fontname] += 1
stats['font_sizes'][round(char.height, 1)] += 1
return {
'text': full_text,
'stats': stats,
'most_common_font': stats['fonts'].most_common(1)[0] if stats['fonts'] else None,
'most_common_size': stats['font_sizes'].most_common(1)[0] if stats['font_sizes'] else None
}
# Uso
result = analyze_pdf('document.pdf')
print(f"Páginas: {result['stats']['pages']}")
print(f"Palavras: {result['stats']['total_words']}")
print(f"Fonte principal: {result['most_common_font']}")
print(f"Tamanho principal: {result['most_common_size']}")
Integração com Fluxos de Trabalho de Processamento de Documentos
O PDFMiner funciona bem em fluxos de trabalho de processamento de documentos maiores. Por exemplo, ao construir sistemas RAG (Geração Aumentada por Recuperação) ou soluções de gestão documental, você pode combiná-lo com outras ferramentas Python para um pipeline completo.
Uma vez que você tenha extraído texto de PDFs, frequentemente precisa convertê-lo para outros formatos. Você pode converter conteúdo HTML para Markdown usando bibliotecas Python ou até mesmo aproveitar conversão impulsionada por LLM com Ollama para transformação inteligente de documentos. Estas técnicas são particularmente úteis quando a extração de PDF produz texto estruturado semelhante a HTML que precisa de limpeza e reformatação.
Para pipelines de conversão de documentos abrangentes, você também pode precisar lidar com conversão de documentos Word para Markdown, criando um fluxo de trabalho unificado que processa múltiplos formatos de documentos para um formato de saída comum.
Melhores Práticas
-
Sempre use LAParams para documentos complexos - As configurações padrão funcionam para documentos simples, mas ajustar os LAParams melhora significativamente os resultados para layouts complexos.
-
Teste com páginas de amostra primeiro - Antes de processar grandes lotes, teste suas configurações de extração em amostras representativas.
-
Lide com exceções de forma elegante - Arquivos PDF podem estar corrompidos ou malformados. Sempre envolva o código de extração em blocos try-except.
-
Armazene em cache o texto extraído - Para processamento repetido, armazene em cache o texto extraído para evitar reprocessamento.
-
Valide o texto extraído - Implemente verificações para verificar a qualidade da extração (ex: comprimento mínimo de texto, palavras-chave esperadas).
-
Considere alternativas para casos de uso específicos - Embora o PDFMiner seja poderoso, às vezes ferramentas especializadas (como tabula-py para tabelas) são mais apropriadas.
-
Mantenha o PDFMiner atualizado - O fork
.sixé mantido ativamente. Mantenha-o atualizado para correções de bugs e melhorias. -
Documente seu código adequadamente - Ao compartilhar scripts de extração de PDF, use blocos de código Markdown adequados com realce de sintaxe para melhor legibilidade.
Conclusão
O PDFMiner.six é uma ferramenta essencial para desenvolvedores Python que trabalham com documentos PDF. Sua implementação pura em Python, análise detalhada de layout e arquitetura extensível o tornam ideal para sistemas de processamento de documentos de produção. Embora possa ter uma curva de aprendizado mais íngreme do que bibliotecas mais simples, a precisão e o controle que oferece são inigualáveis para tarefas complexas de extração de PDF.
Seja construindo um sistema de gestão documental, analisando artigos científicos ou extraindo dados para pipelines de aprendizado de máquina, o PDFMiner fornece a base para extração confiável de texto de PDF em Python.
Recursos Relacionados
Artigos Relacionados Neste Site
- Ferramentas de Documentação em 2026: Markdown, LaTeX, PDF & Fluxos de Impressão
- Ferramentas de manipulação de PDF no Ubuntu - Poppler - Guia abrangente de ferramentas de linha de comando PDF incluindo pdftotext, pdfimages e outros utilitários poppler que funcionam ao lado do PDFMiner em fluxos de trabalho de processamento de documentos
- Como extrair imagens de PDF - Lista de Atalhos - Aprenda a extrair imagens embutidas de PDFs usando ferramentas de linha de comando poppler, complementando as capacidades de extração de texto do PDFMiner
- Gerando PDF em Python - Bibliotecas e exemplos - Explore bibliotecas Python para geração de PDF incluindo ReportLab, PyPDF2 e FPDF para criar o fluxo de trabalho inverso de extração de texto de PDF
- Lista de Atalhos Python - Referência essencial de sintaxe Python incluindo manipulação de arquivos, operações de strings e melhores práticas para escrever scripts de processamento de PDF limpos