O Formato de Documento Portátil, ou PDF, é um formato de arquivo usado para apresentar e trocar documentos de maneira confiável em diferentes sistemas operacionais. Embora tenha sido criado originalmente pela Adobe, agora é um padrão aberto mantido pela Organização Internacional de Normalização (ISO). No Python, você pode trabalhar com arquivos PDF usando a biblioteca PyPDF2.
PyPDF2 é uma biblioteca em Python que oferece muitas funcionalidades para operações com PDFs.
Neste artigo, vamos aprender como fazer o seguinte:
- Extrair informações de um documento PDF usando PyPDF2
- Rotacionar páginas de PDF
- Mesclar PDFs
- Dividir PDFs
- Adicionar marcas d’água
- Criptografar um PDF
História do PyPDF2
Vamos começar! PyPDF2 é uma biblioteca Python evoluída do pyPdf original, sendo uma escolha bem popular. Alternativamente, pdfrw é uma opção similar.
Instalação Para instalar o PyPDF2, você pode usar o pip:
$ pip install pypdf2
Como Extrair Informações de Documentos de um PDF em Python
O PyPDF2 permite extrair metadados e algum texto de um PDF. Isso pode ser útil para automação de tarefas.
Aqui estão os tipos de dados que você pode extrair:
- Autor
- Criador
- Produtor
- Assunto
- Título
- Número de páginas
Vamos usar um exemplo para extrair informações de um PDF:
from PyPDF2 import PdfFileReader
def extract_information(pdf_path):
with open(pdf_path, 'rb') as f:
pdf = PdfFileReader(f)
information = pdf.getDocumentInfo()
number_of_pages = pdf.getNumPages()
txt = f"""
Information about {pdf_path}:
Author: {information.author}
Creator: {information.creator}
Producer: {information.producer}
Subject: {information.subject}
Title: {information.title}
Number of pages: {number_of_pages}
"""
print(txt)
return information
if __name__ == '__main__':
path = 'C:/Users/User/Desktop/Tenda-2023-03-31-PpDwRJkL.pdf'
extract_information(path)
Neste exemplo, você usa o PdfFileReader do PyPDF2 para obter informações do documento, como o número de páginas e outros metadados. Você pode imprimir essas informações ou usá-las posteriormente.
Apesar de o PyPDF2 ter um recurso .extractText() para páginas, ele não funciona consistentemente. Para uma extração de texto confiável de PDFs, é recomendável usar o PDFMiner, que é mais eficaz e projetado especificamente para essa finalidade.
from PyPDF2 import PdfFileReader
def extract_text_from_pdf(pdf_path):
try:
with open(pdf_path, 'rb') as pdf_file:
pdf_reader = PdfFileReader(pdf_file)
num_pages = pdf_reader.numPages
pdf_text = ""
for page_num in range(num_pages):
page = pdf_reader.getPage(page_num)
page_text = page.extractText()
pdf_text += page_text
print(page_text)
return pdf_text
except Exception as e:
return f"Erro: {e}"
if __name__ == "__main__":
pdf_path = 'C:/Users/User/Desktop/Tenda-2023-03-31-PpDwRJkL.pdf' # Substitua pelo caminho do seu arquivo PDF
extracted_text = extract_text_from_pdf(pdf_path)
print(extracted_text)
Como Girar Páginas
Às vezes, PDFs têm páginas viradas de lado ou de cabeça para baixo, geralmente quando alguém digitaliza um documento. Você pode usar Python para girar essas páginas.
Vamos aprender como girar algumas páginas desse artigo com o PyPDF2:
Neste exemplo, você importa o PdfFileWriter junto com o PdfFileReader para criar um novo PDF. A função rotate_pages() recebe o caminho do PDF que você deseja modificar. Dentro dela, você cria um objeto pdf_writer para escrever e um objeto pdf_reader para ler.
Use .GetPage() para escolher a página desejada, como a primeira página (zero). Gire-a 90 graus com .rotateClockwise() e adicione-a ao objeto de escrita com .addPage().
Para concluir, use .write() para criar o novo PDF com três páginas. As duas primeiras estarão giradas em direções opostas, e a terceira será normal
# rotate_pages.py
from PyPDF2 import PdfFileReader, PdfFileWriter
def rotate_pages(pdf_path):
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(pdf_path)
# Rotate page 90 degrees to the right
page_1 = pdf_reader.getPage(0).rotateClockwise(90)
pdf_writer.addPage(page_1)
# Rotate page 90 degrees to the left
page_2 = pdf_reader.getPage(1).rotateCounterClockwise(90)
pdf_writer.addPage(page_2)
# Add a page in normal orientation
pdf_writer.addPage(pdf_reader.getPage(2))
with open('rotate_pages.pdf', 'wb') as fh:
pdf_writer.write(fh)
if __name__ == '__main__':
path = 'C:/Users/User/Desktop/Tenda-2023-03-31-PpDwRJkL.pdf'
rotate_pages(path)
Como Mesclar um ou mais PDF
Muitas vezes, você pode precisar combinar vários PDFs em um só, como adicionar uma capa a diferentes relatórios. Python pode ser útil para essa tarefa.
Vamos criar um código para combinar PDFs. Use a função merge_pdfs() com uma lista de PDFs que deseja unir. Ela requer a lista de PDFs de entrada e o local para salvar o resultado.
Você cria objetos leitores de PDF para cada input e depois adiciona as páginas ao próprio arquivo usando .addPage()
Quando terminar de percorrer todas as páginas de todos os PDFs em sua lista, você gravará o resultado no final.
É possível melhorar este script permitindo a selecionar páginas específicas e desafiar-se criando uma interface de linha de comando com o módulo argparse do Python.
# pdf_merging.py
from PyPDF2 import PdfFileReader, PdfFileWriter
def merge_pdfs(paths, output):
pdf_writer = PdfFileWriter()
for path in paths:
pdf_reader = PdfFileReader(path)
for page in range(pdf_reader.getNumPages()):
# Add each page to the writer object
pdf_writer.addPage(pdf_reader.getPage(page))
# Write out the merged PDF
with open(output, 'wb') as out:
pdf_writer.write(out)
if __name__ == '__main__':
paths = ['C:/Users/User/Desktop/Tenda-2023-03-31-PpDwRJkL.pdf', 'C:/Users/User/Desktop/food_logistics.pdf']
merge_pdfs(paths, output='merged.pdf')
Como Dividir um PDF
Às vezes, você precisa dividir um PDF em vários. Isso é útil para PDFs com conteúdo digitalizado e muitas outras razões.
Veja como usar o PyPDF2 para dividir seu PDF em vários arquivos: Crie um leitor de PDF, percorra as páginas e salve cada página como um arquivo PDF separado. Ao final, você terá várias páginas do PDF original como arquivos individuais.
# pdf_splitting.py
from PyPDF2 import PdfFileReader, PdfFileWriter
def split(path, name_of_split):
pdf = PdfFileReader(path)
for page in range(pdf.getNumPages()):
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf.getPage(page))
output = f'{name_of_split}{page}.pdf'
with open(output, 'wb') as output_pdf:
pdf_writer.write(output_pdf)
if __name__ == '__main__':
path = 'C:/Users/User/Desktop/Tenda-2023-03-31-PpDwRJkL.pdf'
split(path, 'jupyter_page')
Como Adicionar Marcas d’Água
Marcas d’água são imagens ou padrões em documentos, usadas para proteger sua propriedade intelectual, como imagens ou PDFs. Outro nome para marca d’água é sobreposição.
Você pode usar o Python e o PyPDF2 para adicionar marcas d’água aos seus documentos. Você precisa ter um PDF que contenha apenas a imagem ou texto da sua marca d’água.
Aprenda a adicionar uma marca d’água usando create_watermark(): forneça o PDF de entrada, o caminho para salvar o PDF com a marca d’água e o PDF que contém a marca. O código abre o PDF da marca, pega sua primeira página e cria objetos leitor e escritor de PDF para a marca d’água.
O próximo passo é percorrer as páginas do input_pdf. É aqui que a mágica acontece. Você precisará chamar .mergePage() e passar a página da marca d’água. Quando você faz isso, ela será sobreposta à página atual. Então você adiciona essa página recém-fundida ao seu objeto escritor de PDF.
Por fim, você grava o novo PDF com a marca d’água no disco e terminou!
# pdf_watermarker.py
from PyPDF2 import PdfFileWriter, PdfFileReader
def create_watermark(input_pdf, output, watermark):
watermark_obj = PdfFileReader(watermark)
watermark_page = watermark_obj.getPage(0)
pdf_reader = PdfFileReader(input_pdf)
pdf_writer = PdfFileWriter()
# Watermark all the pages
for page in range(pdf_reader.getNumPages()):
page = pdf_reader.getPage(page)
page.mergePage(watermark_page)
pdf_writer.addPage(page)
with open(output, 'wb') as out:
pdf_writer.write(out)
if __name__ == '__main__':
create_watermark(
input_pdf='C:/Users/User/Desktop/Tenda-2023-03-31-PpDwRJkL.pdf',
output='watermarked_notebook.pdf',
watermark='watermark.pdf')
Como Criptografar um PDF
Com o PyPDF2, você pode adicionar uma senha de administrador e uma senha de leitura a um PDF existente. A senha de administrador controla as permissões do PDF, enquanto a de leitura apenas permite abrir o documento.
Pelo que posso perceber, o PyPDF2 na verdade não permite definir permissões no documento, embora permita definir a senha de proprietário.
Para adicionar uma senha e criptografar o PDF, use add_encryption(). Forneça os caminhos de entrada e saída do PDF, além da senha. O código abrirá o PDF, criará um escritor e um leitor, e criptografará todas as páginas do PDF de entrada.
Finalize chamando .encrypt(), especificando as senhas do usuário e do proprietário, e escolhendo se deseja criptografia de 128 bits (o padrão) ou 40 bits (se definido como False). Em resumo, o PyPDF2 é útil e eficiente para automatizar tarefas grandes e melhorar seu trabalho!
# pdf_encrypt.py
from PyPDF2 import PdfFileWriter, PdfFileReader
def add_encryption(input_pdf, output_pdf, password):
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(input_pdf)
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
pdf_writer.encrypt(user_pwd=password, owner_pwd=None,
use_128bit=True)
with open(output_pdf, 'wb') as fh:
pdf_writer.write(fh)
if __name__ == '__main__':
add_encryption(input_pdf='C:/Users/User/Desktop/Tenda-2023-03-31-PpDwRJkL.pdf',
output_pdf='reportlab-encrypted.pdf',
password='twofish')
Conclusão
Neste tutorial, você aprendeu a fazer o seguinte:
- Extrair metadados de um PDF
- Girar páginas
- Mesclar e dividir PDFs
- Adicionar marcas d’água
- Adicionar criptografia
Também fique de olho no novo pacote PyPDF4, pois provavelmente substituirá o PyPDF2 em breve. Você também pode conferir o pdfrw, que pode fazer muitas das mesmas coisas que o PyPDF2 pode fazer.
Outras Referências
Link para a página oficial da PyPDF2: https://pypi.org/project/PyPDF2/