Guia de Processamento de PDF
Visão Geral
Este guia cobre operações essenciais de processamento de PDF usando bibliotecas Python e ferramentas de linha de comando. Para recursos avançados, bibliotecas JavaScript e exemplos detalhados, consulte o reference.md. Se precisar preencher um formulário PDF, leia o forms.md e siga suas instruções.
Início Rápido
from pypdf import PdfReader, PdfWriter
# Ler um PDF
reader = PdfReader("documento.pdf")
print(f"Páginas: {len(reader.pages)}")
# Extrair texto
texto = ""
for pagina in reader.pages:
texto += pagina.extract_text()
Bibliotecas Python
pypdf - Operações Básicas
Mesclar PDFs
from pypdf import PdfWriter, PdfReader
writer = PdfWriter()
for arquivo_pdf in ["doc1.pdf", "doc2.pdf", "doc3.pdf"]:
reader = PdfReader(arquivo_pdf)
for pagina in reader.pages:
writer.add_page(pagina)
with open("mesclado.pdf", "wb") as saida:
writer.write(saida)
Dividir PDF
reader = PdfReader("entrada.pdf")
for i, pagina in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(pagina)
with open(f"pagina_{i+1}.pdf", "wb") as saida:
writer.write(saida)
Extrair Metadados
reader = PdfReader("documento.pdf")
meta = reader.metadata
print(f"Título: {meta.title}")
print(f"Autor: {meta.author}")
print(f"Assunto: {meta.subject}")
print(f"Criador: {meta.creator}")
Rotacionar Páginas
reader = PdfReader("entrada.pdf")
writer = PdfWriter()
pagina = reader.pages[0]
pagina.rotate(90) # Rotacionar 90 graus no sentido horário
writer.add_page(pagina)
with open("rotacionado.pdf", "wb") as saida:
writer.write(saida)
pdfplumber - Extração de Texto e Tabelas
Extrair Texto com Layout
import pdfplumber
with pdfplumber.open("documento.pdf") as pdf:
for pagina in pdf.pages:
texto = pagina.extract_text()
print(texto)
Extrair Tabelas
with pdfplumber.open("documento.pdf") as pdf:
for i, pagina in enumerate(pdf.pages):
tabelas = pagina.extract_tables()
for j, tabela in enumerate(tabelas):
print(f"Tabela {j+1} na página {i+1}:")
for linha in tabela:
print(linha)
Extração Avançada de Tabelas
import pandas as pd
with pdfplumber.open("documento.pdf") as pdf:
todas_tabelas = []
for pagina in pdf.pages:
tabelas = pagina.extract_tables()
for tabela in tabelas:
if tabela: # Verificar se a tabela não está vazia
df = pd.DataFrame(tabela[1:], columns=tabela[0])
todas_tabelas.append(df)
# Combinar todas as tabelas
if todas_tabelas:
df_combinado = pd.concat(todas_tabelas, ignore_index=True)
df_combinado.to_excel("tabelas_extraidas.xlsx", index=False)
reportlab - Criar PDFs
Criação Básica de PDF
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
c = canvas.Canvas("ola.pdf", pagesize=letter)
largura, altura = letter
# Adicionar texto
c.drawString(100, altura - 100, "Olá, Mundo!")
c.drawString(100, altura - 120, "Este é um PDF criado com reportlab")
# Adicionar uma linha
c.line(100, altura - 140, 400, altura - 140)
# Salvar
c.save()
Criar PDF com Múltiplas Páginas
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
from reportlab.lib.styles import getSampleStyleSheet
doc = SimpleDocTemplate("relatorio.pdf", pagesize=letter)
estilos = getSampleStyleSheet()
bloco = []
# Adicionar conteúdo
titulo = Paragraph("Título do Relatório", estilos['Title'])
bloco.append(titulo)
bloco.append(Spacer(1, 12))
corpo = Paragraph("Este é o corpo do relatório. " * 20, estilos['Normal'])
bloco.append(corpo)
bloco.append(PageBreak())
# Página 2
bloco.append(Paragraph("Página 2", estilos['Heading1']))
bloco.append(Paragraph("Conteúdo da página 2", estilos['Normal']))
# Construir PDF
doc.build(bloco)
Ferramentas de Linha de Comando
pdftotext (poppler-utils)
# Extrair texto
pdftotext entrada.pdf saida.txt
# Extrair texto preservando layout
pdftotext -layout entrada.pdf saida.txt
# Extrair páginas específicas
pdftotext -f 1 -l 5 entrada.pdf saida.txt # Páginas 1-5
qpdf
# Mesclar PDFs
qpdf --empty --pages arquivo1.pdf arquivo2.pdf -- mesclado.pdf
# Dividir páginas
qpdf entrada.pdf --pages . 1-5 -- paginas1-5.pdf
qpdf entrada.pdf --pages . 6-10 -- paginas6-10.pdf
# Rotacionar páginas
qpdf entrada.pdf saida.pdf --rotate=+90:1 # Rotacionar página 1 em 90 graus
# Remover senha
qpdf --password=minhasenha --decrypt criptografado.pdf descriptografado.pdf
pdftk (se disponível)
# Mesclar
pdftk arquivo1.pdf arquivo2.pdf cat output mesclado.pdf
# Dividir
pdftk entrada.pdf burst
# Rotacionar
pdftk entrada.pdf rotate 1east output rotacionado.pdf
Tarefas Comuns
Extrair Texto de PDFs Escaneados
# Requer: pip install pytesseract pdf2image
import pytesseract
from pdf2image import convert_from_path
# Converter PDF para imagens
imagens = convert_from_path('escaneado.pdf')
# OCR em cada página
texto = ""
for i, imagem in enumerate(imagens):
texto += f"Página {i+1}:\n"
texto += pytesseract.image_to_string(imagem)
texto += "\n\n"
print(texto)
Adicionar Marca D'Água
from pypdf import PdfReader, PdfWriter
# Criar marca d'água (ou carregar existente)
marca = PdfReader("marca.pdf").pages[0]
# Aplicar a todas as páginas
reader = PdfReader("documento.pdf")
writer = PdfWriter()
for pagina in reader.pages:
pagina.merge_page(marca)
writer.add_page(pagina)
with open("com_marca.pdf", "wb") as saida:
writer.write(saida)
Extrair Imagens
# Usando pdfimages (poppler-utils)
pdfimages -j entrada.pdf prefixo_saida
# Extrai todas as imagens como prefixo_saida-000.jpg, prefixo_saida-001.jpg, etc.
Proteção por Senha
from pypdf import PdfReader, PdfWriter
reader = PdfReader("entrada.pdf")
writer = PdfWriter()
for pagina in reader.pages:
writer.add_page(pagina)
# Adicionar senha
writer.encrypt("senhausuario", "senhadono")
with open("criptografado.pdf", "wb") as saida:
writer.write(saida)
Referência Rápida
| Tarefa | Melhor Ferramenta | Comando/Código |
|---|---|---|
| Mesclar PDFs | pypdf | writer.add_page(pagina) |
| Dividir PDFs | pypdf | Uma página por arquivo |
| Extrair texto | pdfplumber | pagina.extract_text() |
| Extrair tabelas | pdfplumber | pagina.extract_tables() |
| Criar PDFs | reportlab | Canvas ou Platypus |
| Mesclar via linha de comando | qpdf | qpdf --empty --pages ... |
| OCR em PDFs escaneados | pytesseract | Converter para imagem primeiro |
| Preencher formulários PDF | pdf-lib ou pypdf (veja forms.md) | Veja forms.md |
Próximos Passos
- Para uso avançado do pypdfium2, consulte reference.md
- Para bibliotecas JavaScript (pdf-lib), consulte reference.md
- Se precisar preencher um formulário PDF, siga as instruções em forms.md
- Para guias de solução de problemas, consulte reference.md