Em nosso tutorial anterior, aprendemos como ler documentos PDF em Python e discutimos os fundamentos da biblioteca PyPDF2. Embora alguns projetos exijam que você extraia dados de documentos PDF, também é muito comum que você precise criar um PDF próprio para coisas como geração automática de faturas ou confirmação de reservas.
Uma biblioteca incrível que você pode usar para criar e editar documentos em Python é a biblioteca PyPDF2. A biblioteca possui um enorme conjunto de recursos que permite fazer todo tipo de coisa, como extrair informações como texto, imagens e metadados do documento PDF que abordamos no tutorial anterior. Você também pode criar e editar um documento PDF, executar criptografia e descriptografia, adicionar ou remover anotações e muito mais.
Neste tutorial, nosso foco será a criação e edição de documentos PDF. Vamos começar.
Criando Documentos PDF
Nós usamos o PdfReader
classe para ler e extrair conteúdo de um documento PDF e usamos o PdfWriter
classe para criar novos arquivos PDF. Uma limitação do PyPDF2 é que você só pode usar a biblioteca para criar novos arquivos PDF a partir de arquivos PDF existentes.
Começaremos criando uma página em branco para nosso arquivo PDF e isso nos obriga a instanciar um objeto usando o PdfWriter()
classe. Esta classe tem um método chamado add_blank_page()
que criará uma página em branco com as dimensões especificadas e a anexará ao objeto existente.
As dimensões da página são especificadas em unidades de espaço do usuário padrão, onde 72 unidades são equivalentes a 1 polegada. Tendo isso em mente, podemos criar uma página de tamanho A4 multiplicando 8,27 por 72 para obter a largura da página e 11,69 por 72 para obter a altura da página.
Eu usei o seguinte código para criar um documento PDF em branco usando PyPDF2:
import math from PyPDF2 import PdfWriter my_pdf_pages = PdfWriter() page_width = math.floor(8.27*72) page_height = math.floor(11.69*72) my_pdf_pages.add_blank_page(page_width, page_height) with open('doc.pdf', 'wb+') as file: my_pdf_pages.write(file)
É importante usar valores inteiros para largura e altura da página. Caso contrário, você terá um documento PDF com dimensões incorretas. eu usei o open()
função em Python e especificou um nome de arquivo junto com o modo de abertura. O valor que wb+
significa que estarei abrindo o arquivo binário para gravação e atualização.
Depois disso, eu uso o write()
método para escrever o conteúdo de my_pdf_pages
objetar ao doc.pdf Arquivo. Concedido, você só verá uma página em branco se abrir o arquivo agora, mas fomos capazes de criá-lo usando a biblioteca.
Lembre-se de como lemos diferentes páginas de um documento PDF no tutorial anterior usando o pages
propriedade? o pages
propriedade armazenou todas as páginas do documento como uma lista de Page
objetos. Podemos extrair um conjunto específico de páginas e incorporá-las em nosso PDF recém-criado usando o add_page()
método.
Aqui está um exemplo em que leio o conteúdo de dois livros PDF diferentes e gravo algumas de suas páginas em um novo arquivo sequencialmente:
import math from PyPDF2 import PdfReader, PdfWriter my_pdf_pages = PdfWriter() with open('secret-doctrine-01.pdf', 'rb') as book_a: with open('secret-doctrine-02.pdf', 'rb') as book_b: with open('excerpts.pdf', 'wb+') as file: book_a_pages = PdfReader(book_a).pages book_b_pages = PdfReader(book_b).pages for i in range(1, 10): book_a_page = book_a_pages[i] my_pdf_pages.add_page(book_a_page) book_b_page = book_b_pages[i] my_pdf_pages.add_page(book_b_page) my_pdf_pages.write(file)
Muito do código aqui é semelhante ao exemplo anterior. A única diferença é que, em vez do add_blank_page()
método, estamos usando o add_page()
método para adicionar um Page
opor-se ao nosso documento. Nós iteramos sobre as páginas com índices de 1 a 9 e depois as adicionamos ao nosso PdfWriter
objeto chamado my_pdf_pages
um por vez. Uma vez que todas as páginas foram adicionadas, nós as escrevemos em nosso arquivo chamado trechos.pdf.
Alguns meses atrás, baixei um livro que queria ler. No entanto, só poderia ser baixado um capítulo por vez e eu queria mesclá-los todos em um único documento. Eu fiz isso com algum serviço terceirizado na época, mas podemos fazer isso com a mesma facilidade usando algumas linhas de código.
Em vez de ler um arquivo página por vez e depois anexar essa página ao nosso documento, também podemos anexar o arquivo inteiro de uma só vez usando o comando append_pages_from_reader()
função. Essa função também aceita um segundo parâmetro que é o nome da função de retorno de chamada que você deseja chamar com cada acréscimo de página.
from PyPDF2 import PdfReader, PdfWriter my_pdf_doc = PdfWriter() for i in range(101, 107): chapter_name="lemh" + str(i) + '.pdf' with open(chapter_name, 'rb') as chapter: chapter_reader = PdfReader(chapter) my_pdf_doc.append_pages_from_reader(chapter_reader) with open('book.pdf', 'wb+') as file: my_pdf_doc.write(file)
Divisão, inserção e concatenação de documentos PDF
Existe uma outra classe chamada PdfMerger
na biblioteca PyPDF2 que você pode usar para criar um documento PDF em Python. Esta classe oferece funcionalidade mais avançada em comparação com o PdfWriter
classe. Existem duas funções importantes que abordaremos aqui: append()
e merge()
.
Vamos começar com append()
. Na seção anterior, usamos o append_pages_from_reader()
função do PdfWriter
classe para anexar os capítulos em nosso livro, um após o outro. A vantagem de usar append()
é que oferece mais opções e flexibilidade.
from PyPDF2 import PdfMerger my_pdf_doc = PdfMerger() with open('book.pdf', 'wb+') as file: for i in range(101, 107): chapter_name="lemh" + str(i) + '.pdf' my_pdf_doc.append(chapter_name) my_pdf_doc.write(file)
Como você pode ver, esse código é muito mais curto do que o que escrevi acima para realizar a mesma tarefa. A diferença importante é que não precisamos instanciar um PdfReader
objeto para anexar os capítulos. o append()
método do PdfMerger
classe só precisa de um nome de arquivo ou um objeto de arquivo.
o append()
O método aceita quatro parâmetros diferentes. O primeiro é o nome do arquivo como vimos acima.
O segundo parâmetro é uma string que identifica um marcador a ser aplicado no início do arquivo incluído. Poderíamos usá-lo para adicionar a contagem de capítulos como um marcador em nosso documento gerado.
O terceiro parâmetro permite adicionar apenas um conjunto específico de páginas ao livro, em vez do capítulo inteiro. pode ser um (start, stop[, step])
tupla para significar o start
índice, o stop
índice e o número de páginas a serem ignoradas.
from PyPDF2 import PdfMerger my_pdf_doc = PdfMerger() with open('bookmarked.pdf', 'wb+') as file: for i in range(101, 107): chapter_name="lemh" + str(i) + '.pdf' outline_name="Chapter " + str(i - 100) my_pdf_doc.append(chapter_name, outline_name, (0, 10)) my_pdf_doc.write(file)
Quando executei o código acima, ele criou um documento PDF com marcadores para cada capítulo. Ele também tinha apenas as primeiras 10 páginas de cada capítulo.
Digamos que você tenha vários livros, mas eles não têm um índice ou prefácio no início. O autor fornece o índice como um documento PDF separado. Como você o anexa ao início dos livros? o append()
método não será de muita ajuda aqui, especialmente se você também quiser adicionar algum conteúdo em algum lugar no meio do livro. Felizmente, outro método semelhante chamado merge()
seria útil aqui.
my_pdf_doc.merge(0, 'lemh1ps.pdf') my_pdf_doc.write(file)
A primeira linha acima adiciona o documento de índice no início do nosso PdfMerger
objeto enquanto a segunda linha grava todos os dados mesclados de volta em nosso arquivo PDF.
Adicionar marcadores a um documento PDF
É totalmente possível que você precise adicionar marcadores para algumas páginas específicas a um documento PDF para facilitar o acesso. Um método prático que você pode usar para adicionar marcadores é chamado add_outline_item()
. Este método está disponível tanto no PdfWriter
classe e o PdfMerger
classe. Dois parâmetros obrigatórios para esse método especificam o título e o número da página do marcador. O título deve ser uma string e o número da página um número inteiro.
Você também pode especificar um item de estrutura de tópicos pai como o terceiro parâmetro para criar itens de marcador aninhados. Os próximos três parâmetros determinam a cor da fonte, o peso e o estilo do marcador. Aqui está um exemplo que usa os dois primeiros parâmetros para criar um marcador para o resumo do Capítulo 1.
my_pdf_doc.add_outline_item("Chapter 1 (Summary)", 52)
Pensamentos finais
Neste tutorial, aprendemos como criar um documento PDF em Python e como adicionar conteúdo ao documento anexando páginas individuais ou um grupo de páginas. Também aprendemos como adicionar conteúdo em locais específicos em nosso documento PDF usando o PdfMerger
classe da biblioteca PyPDF2.