• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何在 Python 中创建和编辑 PDF 文档

在我们之前的教程中,我们学习了如何使用python 阅读 pdf 文档并讨论了 PyPDF2 库的基础知识。虽然某些项目会要求您从 PDF 文档中提取数据,但您可能需要创建自己的 PDF 以用于自动生成***或预订确认之类的事情也是很常见的。

如何在 Python 中创建和编辑 PDF 文档  第1张

PyPDF2 库是您可以用来在 Python 中创建和编辑文档的一个很棒的库。这个库有一个巨大的功能集,可以让你做各种各样的事情,比如从我们在上一个教程中介绍的 PDF 文档中提取文本、图像和元数据等信息。您还可以创建和编辑 PDF 文档、执行加密和解密、添加或删除注释等。

在本教程中,我们的重点是创建和编辑 PDF 文档。让我们开始吧。

创建 PDF 文档

我们使用PdfReader该类从 PDF 文档中读取和提取内容,并使用PdfWriter该类创建新的 PDF 文件。PyPDF2 的一个限制是您只能使用该库从现有的 PDF 文件创建新的 PDF 文件。

我们将从为我们的 PDF 文件创建一个空白页面开始,这需要我们使用PdfWriter()该类实例化一个对象。此类有一个名为的方法,该方法add_blank_page()将创建一个具有指定尺寸的空白页面并将其附加到现有对象。

页面的尺寸以默认用户空间单位指定,其中 72 个单位相当于 1 英寸。记住这一点,我们可以通过将 8.27 乘以 72 得到页面宽度,将 11.69 乘以 72 得到页面高度来创建 A4 尺寸的页面。

我使用以下代码使用 PyPDF2 创建了一个空白的 PDF 文档:

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)

对页面的宽度和高度使用整数值很重要。否则,您最终会得到尺寸不正确的 PDF 文档。我open()在 Python 中使用了该函数并指定了文件名和打开模式。该值wb+意味着我将打开二进制文件进行写入和更新。

之后,我使用该write()方法将my_pdf_pages对象的内容写入doc.pdf文件。当然,如果您现在打开文件,您只会看到一个空白页面,但我们能够使用库创建它。

还记得我们 在上一教程中如何使用该属性从 PDF 文档中读取不同的页面吗?pages该pages属性将文档的所有页面存储为Page对象列表。我们可以提取一组特定的页面,然后使用该方法将它们嵌入到我们新创建的 PDF 中add_page()。

这是一个示例,其中我阅读了两本不同的 PDF 书籍的内容并将其中的一些页面顺序写入新文件:

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)

这里的很多代码与前面的示例相似。唯一的区别是add_blank_page()我们使用方法而不是add_page()方法来将Page对象添加到我们的文档中。我们遍历索引为 1 到 9 的页面,然后一次将它们添加到我们的PdfWriter对象my_pdf_pages中。添加所有页面后,我们将它们写入名为excerpts.pdf的文件中。

几个月前,我下载了一本我想读的书。但是,一次只能下载一章,我想将它们全部合并到一个文档中。那时我是用一些第三方服务做的,但我们可以用几行代码轻松地做到这一点。

与其一次读取一个文件一页,然后将该页附加到我们的文档,我们还可以使用该append_pages_from_reader()函数一次附加整个文件。此函数还接受第二个参数,该参数是您要在每个页面追加时调用的回调函数的名称。

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)

PDF 文档的切片、插入和串联

PyPDF2 库中还有另一个类PdfMerger,您可以使用它在 Python 中创建 PDF 文档。与类相比,此类提供了更高级的功能PdfWriter。我们将在这里介绍两个重要的功能:append()和merge()。

让我们从append(). 在上一节中,我们使用了类中的append_pages_from_reader()函数来PdfWriter一个接一个地附加我们书中的章节。使用的好处append()是它为您提供了更多选择和灵活性。

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)

如您所见,这段代码比我上面为完成相同任务而编写的代码短得多。重要的区别是我们不必PdfReader为了追加章节而实例化一个对象。类中的append()方法PdfMerger只需要一个文件名或一个文件对象。

该append()方法接受四个不同的参数。第一个是我们在上面看到的文件名。

第二个参数是一个字符串,用于标识要在包含文件的开头应用的书签。我们可以使用它在生成的文档中将章节计数添加为书签。

第三个参数允许您只向书中添加一组特定的页面而不是整个章节。它可以是一个(start, stop[, step])元组来表示start索引,stop索引和要跳过的页数。

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)

当我执行上面的代码时,它创建了一个 PDF 文档,每个章节都有书签。它也只有每章的前 10 页。

假设您有一堆书,但开头没有索引或序言。作者将索引作为单独的 PDF 文档提供给您。你怎么把它放在书的开头?该append()方法在这里不会有太大帮助,特别是如果您还想在本书中间的某处添加一些内容。幸运的是,另一个类似的方法merge()call 在这里会很方便。

my_pdf_doc.merge(0, 'lemh1ps.pdf')
my_pdf_doc.write(file)

上面的第一行在我们的对象的开头添加了索引文档,PdfMerger而第二行将所有合并的数据写回我们的 PDF 文件。

为 PDF 文档添加书签

您很可能需要将某些特定页面的书签添加到 PDF 文档以便于访问。一种可用于添加书签的简便方法称为add_outline_item()。该方法在PdfWriter类和PdfMerger类中均可用。此方法的两个必需参数指定书签的标题和页码。标题必须是字符串,页码必须是整数。

您还可以将父大纲项指定为第三个参数,以创建嵌套的书签项。接下来的三个参数确定书签的字体颜色、粗细和样式。下面是一个使用前两个参数创建第 1 章摘要书签的示例。

my_pdf_doc.add_outline_item("Chapter 1 (Summary)", 52)

最后的想法

在本教程中,我们学习了如何使用 Python 创建 PDF 文档以及如何通过附加单个页面或一组页面来向文档添加内容。我们还学习了如何使用PdfMergerPyPDF2 库中的类在 PDF 文档的特定位置添加内容。



文章目录
  • 创建 PDF 文档
  • PDF 文档的切片、插入和串联
  • 为 PDF 文档添加书签
  • 最后的想法
  • 发表评论