Automação
9 min leitura
13 MAR 2026
Manipulação de PDFs com Python: extrair, unir e criar
Extraia texto, junte arquivos e gere PDFs com PyPDF2 e reportlab. Automatize documentos.
PDFs e Python
PDFs estão em todo lugar: contratos, relatórios, boletos, notas fiscais. Com Python, você pode extrair texto, juntar arquivos, dividir páginas e até gerar PDFs do zero.
pip install PyPDF2 reportlab
Extraindo texto de um PDF
from PyPDF2 import PdfReader
reader = PdfReader("documento.pdf")
print(f"Total de paginas: {len(reader.pages)}")
# Texto de todas as paginas
for i, pagina in enumerate(reader.pages):
texto = pagina.extract_text()
print(f"\n--- Pagina {i + 1} ---")
print(texto)
Extraindo metadados
from PyPDF2 import PdfReader
reader = PdfReader("documento.pdf")
info = reader.metadata
print(f"Titulo: {info.title}")
print(f"Autor: {info.author}")
print(f"Criado em: {info.creation_date}")
print(f"Paginas: {len(reader.pages)}")
Juntando múltiplos PDFs
from PyPDF2 import PdfMerger
merger = PdfMerger()
arquivos = ["parte1.pdf", "parte2.pdf", "parte3.pdf"]
for pdf in arquivos:
merger.append(pdf)
merger.write("documento_completo.pdf")
merger.close()
print("PDFs unidos com sucesso!")
Juntando todos os PDFs de uma pasta
from pathlib import Path
from PyPDF2 import PdfMerger
pasta = Path("pdfs")
merger = PdfMerger()
for pdf in sorted(pasta.glob("*.pdf")):
print(f"Adicionando {pdf.name}")
merger.append(str(pdf))
merger.write("todos_unidos.pdf")
merger.close()
Dividindo um PDF
Extrair páginas específicas
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("documento.pdf")
writer = PdfWriter()
# Extrair paginas 2 a 5 (indice 1 a 4)
for i in range(1, 5):
writer.add_page(reader.pages[i])
with open("paginas_2_a_5.pdf", "wb") as f:
writer.write(f)
Uma página por arquivo
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("documento.pdf")
for i, pagina in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(pagina)
nome = f"pagina_{i + 1}.pdf"
with open(nome, "wb") as f:
writer.write(f)
print(f"Salvo: {nome}")
Rotacionando páginas
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("documento.pdf")
writer = PdfWriter()
for pagina in reader.pages:
pagina.rotate(90) # 90, 180 ou 270 graus
writer.add_page(pagina)
with open("rotacionado.pdf", "wb") as f:
writer.write(f)
Protegendo com senha
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("documento.pdf")
writer = PdfWriter()
for pagina in reader.pages:
writer.add_page(pagina)
writer.encrypt("minha_senha_123")
with open("protegido.pdf", "wb") as f:
writer.write(f)
print("PDF protegido com senha!")
Lendo PDF protegido
from PyPDF2 import PdfReader
reader = PdfReader("protegido.pdf")
reader.decrypt("minha_senha_123")
texto = reader.pages[0].extract_text()
print(texto)
Criando PDFs do zero com reportlab
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
c = canvas.Canvas("relatorio.pdf", pagesize=A4)
largura, altura = A4
# Titulo
c.setFont("Helvetica-Bold", 24)
c.drawString(50, altura - 80, "Relatorio Mensal")
# Subtitulo
c.setFont("Helvetica", 14)
c.drawString(50, altura - 110, "Gerado automaticamente com Python")
# Linha separadora
c.line(50, altura - 120, largura - 50, altura - 120)
# Conteudo
c.setFont("Helvetica", 12)
y = altura - 160
dados = [
"Vendas totais: R$ 45.230,00",
"Pedidos realizados: 342",
"Ticket medio: R$ 132,25",
"Novos clientes: 58",
]
for linha in dados:
c.drawString(50, y, linha)
y -= 25
c.save()
print("PDF criado!")
Exemplo prático: relatório com tabela
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
doc = SimpleDocTemplate("relatorio_tabela.pdf", pagesize=A4)
elementos = []
estilos = getSampleStyleSheet()
# Titulo
elementos.append(Paragraph("Vendas por Produto", estilos["Title"]))
# Tabela
dados = [
["Produto", "Qtd", "Preco Unit.", "Total"],
["Camiseta", "50", "R$ 59,90", "R$ 2.995,00"],
["Caneca", "120", "R$ 29,90", "R$ 3.588,00"],
["Adesivo", "300", "R$ 5,00", "R$ 1.500,00"],
["TOTAL", "", "", "R$ 8.083,00"],
]
tabela = Table(dados, colWidths=[150, 60, 100, 100])
tabela.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#333333")),
("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("ALIGN", (1, 0), (-1, -1), "CENTER"),
("GRID", (0, 0), (-1, -1), 0.5, colors.grey),
("BACKGROUND", (0, -1), (-1, -1), colors.HexColor("#f0f0f0")),
("FONTNAME", (0, -1), (-1, -1), "Helvetica-Bold"),
]))
elementos.append(tabela)
doc.build(elementos)
print("Relatorio com tabela criado!")
Resumo
| Biblioteca | Para que serve |
|---|---|
PyPDF2.PdfReader |
Ler e extrair texto de PDFs |
PyPDF2.PdfWriter |
Criar/modificar PDFs |
PyPDF2.PdfMerger |
Juntar múltiplos PDFs |
reportlab |
Criar PDFs do zero com layout completo |
Com PyPDF2 e reportlab, você automatiza todo o ciclo de trabalho com PDFs: ler, juntar, dividir, proteger e criar do zero.