Programador Leigo
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.

Continue lendo

Compartilhar