>>> from env_helper import info; info()
页面更新时间: 2024-04-05 10:28:26
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

4.3. pypdf的页面处理

前面使用了 pypdf 提取了文字和图片,下面继续测试其他方法。

4.3.1. 旋转页面

旋转页面功能需要导入PdfWriter模块,有时候PDF是横向模式而不是纵向模式,甚至是颠倒的。 当有人扫描文档为PDF或电子邮件时,很可能会发生这种情况。我们可以打印出文档并阅读纸质版本,也可以使用Python的强大功能来旋转有问题的页面。

>>> from pypdf import PdfReader
>>> from pypdf import PdfWriter
>>> pdf_writer=PdfWriter()
>>> pdf_reader=PdfReader('./servers.pdf')
>>> direction='right'
>>> pages=[0]
>>> for page in pages:
>>>     if direction=='right':
>>>         page_r=pdf_reader.pages[page].rotate(90)
>>>         pdf_writer.add_page(page_r)
>>>     elif direction=='left':
>>>         page_r=pdf_reader.pages[page].rotateCounterClockwise(90)
>>>         pdf_writer.addPage(page_r)
>>>     else:
>>>         print("Encountered an improper argument! Input right or left.")
>>>
>>> with open('./xx_rotate.pdf','wb') as fh:
>>>     pdf_writer.write(fh)

4.3.2. 拆分PDF

有时可能需要将PDF拆分为多个PDF,对于包含大量扫描内容的PDF来说尤其重要。以下为每一页为一个单独的PDF文件。

>>> name_of_split='./xx_test'
>>> pdf_path='./servers.pdf'
>>> pdf_reader=PdfReader(pdf_path)
>>> for page in range( len(pdf_reader.pages) ):
>>>     pdf_reader=PdfReader(pdf_path)
>>>     pdf_writer=PdfWriter()
>>>     pdf_writer.add_page(pdf_reader.pages[page])
>>>     output=f'{name_of_split}{page}.pdf'
>>>     with open(output,'wb') as output_pdf:
>>>         pdf_writer.write(output_pdf)

这个函数中再次创建了PDF的reaer对象,并对其所读取的页面进行遍历。对于PDF中的每个页面,创建一个新的PDF的writer实例并向其添加单个页面。然后,将该页面写入一个唯一命名的文件。脚本运行完毕后,就可以将原始PDF的每个页面拆分为单独的PDF。

4.4. 合并PDF

我们希望将两个或多个PDF合并到一个PDF中。例如,现在可能有一个标准的封面,需要转到许多类型的报告中。这时候就可以使用Python来帮助完成这类工作。

>>> from pypdf import PdfReader
>>> from pypdf import PdfWriter
>>>
>>> paths=['./xx_test0.pdf','./xx_rotate.pdf']
>>> output='./xx_merge.pdf'
>>> pdf_writer=PdfWriter()
>>> for path in paths:
>>>     pdf_reader=PdfReader(path)
>>>     for page in range( len(pdf_reader.pages)):
>>>         pdf_writer.add_page(pdf_reader.pages[page])
>>>
>>> with open(output,'wb') as out:
>>>     pdf_writer.write(out)

首先遍历输入的paths,paths内是要合并的所有的pdf文件,并为每个输入创建一个PDF阅读对象。然后遍历PDF文件中的所有页面,并使用 .addpage() 将这些页面写入writer对象。当完成对列表中所有PDF的所有页面的写入后,将在末尾写入新的结果中。

4.4.1. 加密PDF

目前仅支持将用户密码和所有者密码添加到预先存在的PDF。在PDF版本中,所有者密码会提供PDF的管理员权限,并允许设置文档的权限,而用户密码只允许打开文档。

>>> input='./servers.pdf'
>>> output='./xx_pwd.pdf'
>>> secret='hello'
>>> pdf_w=PdfWriter()
>>> pdf_r=PdfReader(input)
>>> for page in range( len(pdf_r.pages)):
>>>     pdf_w.add_page(pdf_r.pages[page])
>>>
>>> pdf_w.encrypt(user_password=secret,owner_pwd=secret,use_128bit=True)
>>> with open(output,'wb') as f:
>>>     pdf_w.write(f)

add_encryption 以输入输出PDF路径和要添加到PDF的密码为参数。由于需要加密整个输入PDF,因此需要遍历其所有页面并将其添加到writer编写器。最后一步是调用 .encrypt() ,以用户密码,所有者密码以及是否应该添加128位加密为参数。默认情况下,要启用128位加密。如果将其设置为False,则将应用40位加密。