Juntar e dividir PDF com Python: pypdf e pikepdf
Para juntar e dividir PDF com Python, use pypdf ou pikepdf. Veja código testado, quando escolher cada biblioteca e os limites de cada uma.
Para juntar PDF em Python, instale o pypdf com pip install pypdf e use PdfWriter: o método append() adiciona cada arquivo na ordem da lista, e write() grava o resultado. Para dividir o arquivo ou trabalhar com sua estrutura interna, o pikepdf é a alternativa, porque é uma camada sobre o qpdf. Os exemplos deste guia foram testados com pypdf 6.20.1 e pikepdf 10.17.0.
Pypdf ou pikepdf: qual usar
As duas bibliotecas resolvem a maior parte dos casos. A tabela mostra onde cada uma se encaixa melhor:
| Tarefa | Biblioteca indicada | Por quê |
|---|---|---|
| Juntar arquivos inteiros | pypdf (append) ou pikepdf (pages.extend) | Os dois copiam as páginas na ordem da lista |
| Extrair um intervalo de páginas | pypdf, com fatiamento da lista de páginas | Código curto, sem mexer em objetos internos |
| Abrir arquivo com senha | pikepdf, com o parâmetro password | Erro específico para senha errada ou ausente |
| Trabalhar com a estrutura do arquivo | pikepdf | Acesso direto aos objetos, como o qpdf faz na linha de comando |
Instalar em um ambiente virtual
Crie um ambiente virtual dentro da pasta do projeto e instale as duas bibliotecas nele. Assim, as versões do projeto não se misturam com as de outros programas no computador:
python3 -m venv .venv && .venv/bin/pip install pypdf pikepdfNo Windows, o programa do ambiente fica em .venv\Scripts\python. Depois da instalação, rode pip show pypdf pikepdf e anote as versões no projeto, para saber com o que o código foi testado.
Juntar com pypdf
O script abaixo junta dois arquivos na ordem em que aparecem na lista. O append() aceita o caminho do arquivo, e o write() grava o PDF final:
from pypdf import PdfWriter
writer = PdfWriter()
writer.append('01.pdf')
writer.append('02.pdf')
writer.write('juntado.pdf')Para incluir mais arquivos, adicione uma linha de append() para cada um, ou percorra uma lista de nomes ordenada. Quem junta uma pasta inteira deve ordenar os nomes antes, porque a ordem de leitura do sistema de arquivos não é garantida. Os nomes com prefixo numérico, como 01-rg.pdf, resolvem isso.
Extrair um intervalo com pypdf
Para pegar só algumas páginas, leia o arquivo e copie as páginas desejadas para um PdfWriter novo. O fatiamento usa a numeração do Python, que começa em zero, então a primeira página é o índice 0:
from pypdf import PdfReader, PdfWriter
leitor = PdfReader('entrada.pdf')
writer = PdfWriter()
for pagina in leitor.pages[:40]:
writer.add_page(pagina)
writer.write('parte1.pdf')Para a parte seguinte, troque o fatiamento por [40:80] ou por [80:]. Esse é o mesmo raciocínio de quem divide um arquivo grande para cumprir o limite de um portal. Para escolher onde cortar, o guia sobre dividir PDF por capítulo ou intervalo mostra os critérios.
Juntar e abrir com senha usando pikepdf
O pikepdf trabalha com um objeto de destino vazio, pikepdf.new(), e puxa as páginas de cada origem com pages.extend(). Abra as origens antes, mantenha-as abertas até salvar e feche-as depois. Quando o arquivo tem senha para abrir, o parâmetro password resolve, e a senha errada gera um erro que o script pode tratar:
import pikepdf
saida = pikepdf.new()
origens = [pikepdf.open(nome, password='senha') for nome in ['01.pdf', '02.pdf']]
for origem in origens:
saida.pages.extend(origem.pages)
saida.save('juntado.pdf')
for origem in origens:
origem.close()Como o pikepdf usa o qpdf por baixo, a junção segue a mesma lógica do AjustaPDF: copia as páginas e o que pertence a cada uma, e deixa de lado o que pertence ao documento inteiro, como os marcadores. Confira o resultado com um leitor antes de confiar no arquivo final.
Dividir em uma página por arquivo
Quando cada página precisa virar um arquivo, percorra as páginas e salve uma por vez. O nome numerado mantém a ordem na pasta:
import pikepdf
with pikepdf.open('entrada.pdf') as pdf:
for i, pagina in enumerate(pdf.pages, start=1):
novo = pikepdf.new()
novo.pages.append(pagina)
novo.save('pagina-%d.pdf' % i)Esse código faz algo parecido com a divisão sem intervalo do AjustaPDF, que gera um arquivo por página dentro de um ZIP. Em um PDF com fotos, cada parte leva as imagens que a página usa, então o tamanho de cada arquivo mostra o peso daquela página. Fontes compartilhadas aparecem em todos.
O que as bibliotecas não fazem
Nenhuma das duas reduz imagens como o Ghostscript faz. Para isso, chame o programa a partir do Python com subprocess.run, passando os mesmos parâmetros do guia de comprimir com Ghostscript e qpdf. Também não há OCR: um escaneado continua sem texto pesquisável depois de juntado. E as bibliotecas não convertem PDF em Word, então a conversão exige outro programa.
Um cuidado para código que roda em servidor: o arquivo do usuário fica no disco enquanto o script processa. Apague os temporários ao fim da operação, e não grave o conteúdo em log. Se a sua aplicação recebe arquivos de clientes e não quer manter a infraestrutura, a API HTTP do AjustaPDF é outra saída, com as cotas do plano sem conta descritas no guia.
Quando um script resolve melhor que um site
Um script vale a pena quando a tarefa se repete: todo mês, juntar os comprovantes de cem clientes, ou dividir arquivos que chegam de um sistema. Para um arquivo por vez, o site é mais rápido. A ferramenta de juntar PDF do AjustaPDF resolve a operação sem código, e o guia sobre automatizar PDF com n8n, Make ou Zapier mostra como ligar a API a uma automação sem escrever o laço de arquivos.
Se a sua stack é JavaScript, o caminho equivalente está no guia sobre PDF em Node.js com pdf-lib. Para o terminal, a mesma operação de junção aparece no guia sobre juntar e comprimir PDF no Linux.
Perguntas frequentes
Qual biblioteca Python serve para juntar PDF, pypdf ou pikepdf?
Para juntar arquivos inteiros e extrair páginas, pypdf é a escolha mais simples, porque append() adiciona cada arquivo na ordem da lista. Escolha pikepdf quando quiser trabalhar com a estrutura do arquivo ou abrir PDFs com senha. Ele é uma camada sobre o qpdf, o mesmo motor de junção que o AjustaPDF usa.
Como abrir um PDF com senha em Python?
Com pikepdf, passe a senha em pikepdf.open('arquivo.pdf', password='senha'). Se a senha estiver errada ou faltar, a biblioteca levanta pikepdf.PasswordError, que pode ser capturado para mostrar uma mensagem. Sem a senha de abertura, o arquivo não é lido.
Dá para comprimir PDF com pypdf ou pikepdf?
Nenhuma das duas reduz a resolução das imagens como o Ghostscript faz. pikepdf salva o arquivo com a compressão do qpdf, que não perde qualidade e tem pouco efeito em páginas escaneadas. Para reduzir fotos, chame o Ghostscript a partir do Python com subprocess.
Como dividir um PDF em uma página por arquivo?
Abra o arquivo com pikepdf, percorra pdf.pages com enumerate e, para cada página, crie um pikepdf.new(), anexe a página com append e salve com um nome numerado. O código deste guia gera pagina-1.pdf, pagina-2.pdf e assim por diante, um arquivo por página.
Preciso instalar algo além do pip para usar pypdf e pikepdf?
Em geral, não. Os dois são instalados com pip install pypdf pikepdf, sem compilar nada em um computador comum. Use um ambiente virtual com python3 -m venv, para não misturar as versões com outros projetos.