Extraia texto de PDFs com PDFMiner no Python
Mestre na extração de texto de PDF com Python
PDFMiner.six é uma poderosa biblioteca Python para extrair texto, metadados e informações de layout de documentos PDF. Este guia faz parte do nosso Ferramentas de Documentação em 2026: Markdown, LaTeX, PDF e Fluxos de Trabalho de Impressão hub.
Ao contrário de leitores de PDF simples, ele fornece uma análise profunda da estrutura do PDF e lida efetivamente com layouts complexos.

O que é PDFMiner e por que usá-lo?
PDFMiner é uma biblioteca puramente em Python projetada para extrair e analisar texto de documentos PDF. A versão .six é o fork ativamente mantido que suporta Python 3.x, enquanto o projeto original PDFMiner não é mais atualizado.
Funcionalidades Principais:
- Implementação puramente em Python (sem dependências externas)
- Análise detalhada do layout e posicionamento do texto
- Detecção de fontes e codificação de caracteres
- Suporte a PDFs criptografados
- Ferramentas de linha de comando incluídas
- Arquitetura extensível para processamento personalizado
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 tornam-no a escolha preferida para pipelines de processamento de documentos. Para o fluxo de trabalho inverso, você também pode estar interessado em gerar PDFs programaticamente em Python.
Instalação e Configuração
Instale PDFMiner.six usando 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 em gerenciamento de pacotes Python, consulte nossa Folha de Dicas de 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- Extrair texto de PDFsdumppdf.py- Descarregar a estrutura interna de PDFslatin2ascii.py- Converter caracteres latinos para ASCII
Essas ferramentas complementam outras ferramentas de manipulação de PDF como o Poppler que oferecem 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)
Essa API de alto nível lida com a maioria dos casos de uso comuns e retorna o documento inteiro 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 0)
text = extract_text('document.pdf', page_numbers=[1, 2, 3, 4])
print(text)
Isso é particularmente útil para documentos grandes onde você precisa apenas de certas seções, melhorando significativamente o desempenho.
Extrair Texto com Iteração por Página
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())
Essa 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 de Layout Avançada
Entendendo LAParams
LAParams (Parâmetros de Análise de Layout) controlam como o PDFMiner interpreta o layout do documento. Entender a diferença entre PDFMiner e bibliotecas mais simples é crucial aqui - o PDFMiner realmente analisa as relações espaciais entre os elementos de texto.
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Criar LAParams personalizados
laparams = LAParams(
line_overlap=0.5, # Sobreponto mínimo para linhas de texto
char_margin=2.0, # Margem de caractere
line_margin=0.5, # Margem de linha
word_margin=0.1, # Espaçamento entre palavras
boxes_flow=0.5, # Limiar de direção do 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 do fluxo de caixas de textodetect_vertical: Ativar a detecção de texto vertical (comum em idiomas asiáticos)
Extrair Informações de Layout
Obter informações detalhadas sobre 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 do retângulo
x0, y0, x1, y1 = element.bbox
print(f"Texto em ({x0}, {y0}): {element.get_text()}")
# Iterar por linhas
for text_line in element:
if isinstance(text_line, LTTextLine):
# Obter detalhes do nível de caractere
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 de forma programática.
Lidando com Tipos Diferentes 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')
Note 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 com 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 mais baixo para melhor detecção de colunas
)
text = extract_text('multi_column.pdf', laparams=laparams)
O parâmetro boxes_flow é particularmente importante para documentos com múltiplas colunas - valores mais baixos ajudam o PDFMiner a distinguir entre colunas separadas.
Texto Não-Ingles e Unicode
O PDFMiner lida bem com Unicode, mas certifique-se de usar a codificação correta:
from pdfminer.high_level import extract_text
# Extrair texto com suporte a Unicode
text = extract_text('multilingual.pdf', codec='utf-8')
# Salvar com codificação UTF-8
with open('output.txt', 'w', encoding='utf-8') as f:
f.write(text)
Trabalhando com PDFs Escaneados
O PDFMiner não pode extrair texto diretamente de PDFs escaneados (imagens). Esses requerem OCR (Reconhecimento Óptico de Caracteres). No entanto, você pode integrar o PDFMiner com ferramentas de OCR.
Aqui está como detectar se um PDF é escaneado 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):
"""Verificar se o PDF parece ser escaneado (muitas 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 escaneado
return image_count > text_count * 2
if is_scanned_pdf('document.pdf'):
print("Este PDF parece ser escaneado - use OCR")
else:
text = extract_text('document.pdf')
print(text)
Para PDFs escaneados, considere integrar com o Tesseract OCR ou usar ferramentas para extrair imagens de PDFs primeiro, depois aplicar OCR a essas imagens.
Uso da Linha de Comando
O PDFMiner inclui ferramentas poderosas de linha de comando:
Extrair Texto com Ferramentas de Linha de Comando
# Extrair texto para stdout
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
Essas 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 esses estratégias de otimização:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LAParams
# Processar apenas as 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
# Desativar 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 de forma eficiente:
from multiprocessing import Pool
from pdfminer.high_level import extract_text
import os
def process_pdf(pdf_path):
"""Processar ú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 desordenado ou confuso.
Solução: Ajuste os LAParams, especialmente boxes_flow:
from pdfminer.layout import LAParams
laparams = LAParams(boxes_flow=0.3) # Experimente diferentes valores
text = extract_text('document.pdf', laparams=laparams)
Problema: Falta de Espaços Entre Palavras
Problema: As palavras ficam juntas sem espaços.
Solução: Aumente word_margin:
laparams = LAParams(word_margin=0.2) # Aumente do valor padrão de 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 a codificação explicitamente:
text = extract_text('document.pdf', codec='utf-8')
Problema: Erros de Memória com PDFs Grandes
Problema: Erros de memória com arquivos grandes.
Solução: Processar página por página:
def extract_text_chunked(pdf_path, chunk_size=10):
"""Extrair 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 = []
# Processar texto restante
if all_text:
yield ''.join(all_text)
Comparando PDFMiner com Alternativas
Entender quando usar PDFMiner versus outras bibliotecas é importante:
PDFMiner vs PyPDF2
PyPDF2 é mais simples e rápido, mas menos preciso:
- Use PyPDF2 para: PDFs simples, extração rápida, mesclagem/divisão de PDFs
- Use PDFMiner para: Layouts complexos, posicionamento preciso de texto, análise detalhada
PDFMiner vs pdfplumber
pdfplumber constrói sobre PDFMiner com uma API de alto nível:
- Use pdfplumber para: Extração de tabelas, API mais simples, prototipagem rápida
- Use PDFMiner para: Máximo controle, processamento personalizado, sistemas de produção
PDFMiner vs PyMuPDF (fitz)
PyMuPDF é significativamente mais rápido, mas tem dependências em C:
- Use PyMuPDF para: Aplicações críticas de desempenho, processamento em grande 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):
"""Extrair texto e fornecer 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 Pipelines de Processamento de Documentos
O PDFMiner funciona bem em fluxos de trabalho de processamento de documentos maiores. Por exemplo, ao construir sistemas RAG (Retrieval-Augmented Generation) ou soluções de gestão de documentos, você pode combiná-lo com outras ferramentas Python para um pipeline completo.
Uma vez que você extraiu texto de PDFs, muitas vezes precisa convertê-lo para outros formatos. Você pode converter conteúdo HTML para Markdown usando bibliotecas Python ou até mesmo aproveitar conversão com LLM usando Ollama para transformação inteligente de documentos. Essas técnicas são particularmente úteis quando a extração de PDF produz texto estruturado semelhante a HTML que precisa ser limpo e reformatado.
Para pipelines completos de conversão de documentos, você também pode precisar lidar com conversão de documentos Word para Markdown, criando um fluxo de trabalho unificado que processa vários formatos de documento em um formato de saída comum.
Boas 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 lotes grandes, teste suas configurações de extração em amostras representativas.
-
Trate exceções com cuidado - Arquivos PDF podem estar corrompidos ou malformados. Sempre envolva o código de extração em blocos try-except.
-
Cache o texto extraído - Para processamento repetido, cache o texto extraído para evitar reprocessamento.
-
Valide o texto extraído - Implemente verificações para garantir a qualidade da extração (por exemplo, comprimento mínimo de texto, palavras-chave esperadas).
-
Considere alternativas para casos 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 obter correções de bugs e melhorias. -
Documente seu código corretamente - Ao compartilhar scripts de extração de PDF, use blocos de código Markdown com destaque de sintaxe para melhor legibilidade.
Conclusão
O PDFMiner.six é uma ferramenta essencial para desenvolvedores Python que trabalham com documentos PDF. Sua implementação puramente em Python, análise detalhada de layout e arquitetura extensível tornam-no ideal para sistemas de processamento de documentos em produção. Embora possa ter uma curva de aprendizado mais acentuada do que bibliotecas mais simples, a precisão e o controle que oferece são incomparáveis para tarefas de extração de PDF complexas.
Seja você construindo um sistema de gestão de documentos, analisando artigos científicos ou extraíndo dados para pipelines de aprendizado de máquina, o PDFMiner fornece a base para uma 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 e Fluxos de Trabalho de Impressão
- Ferramentas de manipulação de PDF no Ubuntu - Poppler - Guia abrangente sobre ferramentas de linha de comando de PDF, incluindo pdftotext, pdfimages e outras utilidades do poppler que funcionam junto com o PDFMiner em fluxos de trabalho de processamento de documentos
- Como extrair imagens de PDF - Guia Rápido - Aprenda como extrair imagens embutidas de PDFs usando ferramentas de linha de comando do 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 da extração de texto de PDF
- Folha de Dicas de Python - Referência essencial de sintaxe Python incluindo manipulação de arquivos, operações de string e melhores práticas para escrever scripts de processamento de PDF limpos