当前位置: 首页 > news >正文

Python玩转PDF的各种骚操作

Portable Document Format(可移植文档格式),或者PDF是一种文件格式,可以用于跨操作系统的呈现和文档交换。尽管PDF最初是由Adobe发明的,但它现在是由国际标准化组织(ISO)维护的开放标准。你可以通过使用PyPDF2包在Python中处理已先存在的PDF。

PyPDF2是一个纯Python包,可用于许多不同类型的PDF操作。

本文将带你了解如何执行以下操作:

从Python中提取PDF中的文档信息

  • 旋转页面
  • 合并PDF
  • 拆分PDF
  • 添加水印
  • 加密PDF

一、pyPdf,PyPDF2和PyPDF4的历史

最初的pyPdf软件包于2005年发布。pyPdf的最后一个正式版本是在2010年。大约一年后,一家名为Phasit的公司赞助了一个名为PyPDF2的pyPdf分支。该代码编写为向后与原始代码兼容,并且用了好多年,效果一直很好,其最后一个版本是在2016年。

有一个名为PyPDF3的软件包简短系列版本,然后该项目被重命名为PyPDF4。所有这些项目都完全相同,但pyPdf和PyPDF2 +之间的最大区别在于后者版本增加了Python 3支持。Python 3的原始pyPdf有一个不同的Python 3分支,但是这个分支已经多年没有维护了。

虽然最近放弃了PyPDF2,但新的PyPDF4与PyPDF2没有完全的向后兼容性。本文中的大多数示例都可以与PyPDF4完美配合,但也有一些不能,这就是为什么PyPDF4在本文中没有更多的特色。随意用PyPDF4替换PyPDF2的导入,看看它是如何工作的。

二、pdfrw:一个替代的PDF操作包

Patrick Maupin创建了一个名为pdfrw的软件包,它可以完成许多与PyPDF2相同的工作。除了加密的特殊情况外,本文后面提到PyPDF2的所有操作,pdfrw均可以实现。

pdfrw的最大区别在于它与ReportLab软件包集成,因此你可以使用一些或所有预先存在的PDF构建一个新的PDF。

三、PyPDF2的安装

如果使用Anaconda而不是常规Python,可以使用pip或conda安装PyPDF2。以下是使用pip安装PyPDF2的方法:

$ pip install pypdf2

由于PyPDF2没有任何依赖,因此安装非常快。

四、如何从Python中提取PDF文档信息

我们可以使用PyPDF2从PDF中提取元数据和一些文本,尤其是当在预先存在的PDF文件上执行某些类型的自动化时是非常有用的。

以下是当前可以提取的数据类型:

  • Author
  • Creator
  • Producer
  • Subject
  • Title
  • Number of page

可以在自己的电脑上随便找一个PDF文件进行尝试操作。下面是使用该PDF编写一些代码,并了解如何访问这些属性:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

fromPyPDF2importPdfFileReader

defextract_information(pdf_path):

withopen(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)

returninformation

if__name__=='__main__':

path='xxxx.pdf'

extract_information(path)

首先从PyPDF2包导入PdfFileReader。PdfFileReader是一个具有多种与PDF文件交互的方法的类。在此示例中,我们调用了.getDocumentInfo(),它将返回DocumentInformation的实例,包含了我们感兴趣的大部分信息。我们还可以在reader对象上调用.getNumPages(),让它返回文档中的页数。

information这个变量具有多个实例属性,可以使用这些属性从文档中获取所需的其余元数据。我们可以打印出该信息并将其返回以备将来使用。

虽然PyPDF2具有.extractText(),可以在其页面对象上使用提取文本(本例中未显示),但它的效果不是很好。有些PDF会返回文本,有些会返回空字符串。如果要从PDF中提取文本,建议应该看一下PDFMiner项目。PDFMiner更加强大,专门用于从PDF中提取文本。

五、如何旋转页面?

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

下面看一下如何使用PyPDF2旋转文章的一些页面:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

fromPyPDF2importPdfFileReader, PdfFileWriter

defrotate_pages(pdf_path):

pdf_writer=PdfFileWriter()

pdf_reader=PdfFileReader(path)

# 顺时针旋转90度

page_1=pdf_reader.getPage(0).rotateClockwise(90)

pdf_writer.addPage(page_1)

# 逆时针旋转90度

page_2=pdf_reader.getPage(1).rotateCounterClockwise(90)

pdf_writer.addPage(page_2)

# 在正常方向上添加一页

pdf_writer.addPage(pdf_reader.getPage(2))

withopen('rotate_pages.pdf','wb') as fh:

pdf_writer.write(fh)

if__name__=='__main__':

path='新路径.pdf'

rotate_pages(path)

上面除了pdfileReader之外,还导入了pdfileWriter,因为我们需要编写一个新的pdf。rotate_pages()获取要修改的PDF的路径。在这个函数中,需要创建一个可以命名为pdf-writer的writer对象和一个名为pdf-reader的reader对象。

接下来,可以使用.get page()获取所需的页面。上面开始输入了第0页,也就是第一页,调用page对象的.rotateClockwise()顺时针旋转方法并输入90。然后同样地,对于第二页,调用.rotateCounterLockwise()逆时针旋转并输入90。

每次调用Rotation旋转方法后,都会调用.addPage(),这将向writer对象添加页面的旋转版本。最后一页是第3页,没有对其进行任何旋转。最后,使用.write()把所有新页写入新的PDF。

六、如何合并PDF?

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

下面是实现的代码,完成PDF合并的操作:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

fromPyPDF2importPdfFileReader, PdfFileWriter

defmerge_pdfs(paths, output):

pdf_writer=PdfFileWriter()

forpathinpaths:

pdf_reader=PdfFileReader(path)

forpageinrange(pdf_reader.getNumPages()):

# 将每页添加到writer对象

pdf_writer.addPage(pdf_reader.getPage(page))

# 写入合并的pdf

withopen(output,'wb') as out:

pdf_writer.write(out)

if__name__=='__main__':

paths=['document1.pdf','document2.pdf']

merge_pdfs(paths, output='merged.pdf')

假如有一个要合并到一起的pdf列表时,可以直接使用merge_pdf函数完成。此函数采用了输入路径和输出路径作为参数。

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

如果不想合并每个PDF的所有页面,可以通过添加一系列要添加的页面来稍微增强这个脚本。挑战一点的话,也可以使用Python的argparse模块为这个函数创建一个命令行接口。

七、如何拆分PDF?

有时可能需要将PDF拆分为多个PDF,对于包含大量扫描内容的PDF来说尤其重要。以下是如何使用PyPDF2将PDF拆分为多个文件:

1

2

3

4

5

6

7

8

9

10

11

12

fromPyPDF2importPdfFileReader, PdfFileWriter

defsplit(path, name_of_split):

pdf=PdfFileReader(path)

forpageinrange(pdf.getNumPages()):

pdf_writer=PdfFileWriter()

pdf_writer.addPage(pdf.getPage(page))

output=f'{name_of_split}{page}.pdf'

withopen(output,'wb') as output_pdf:

pdf_writer.write(output_pdf)

if__name__=='__main__':

path='xxx.pdf'

split(path,'jupyter_page')

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

http://www.jsqmd.com/news/704623/

相关文章:

  • 如何在3分钟内完成音频转文字:AsrTools终极免费解决方案
  • 商业保险的庖丁解牛
  • 布隆过滤器(Bloom Filter)技术详解
  • 2026年3月专业的304不锈钢工字钢供应商推荐,304不锈钢工字钢/不锈钢工字钢,304不锈钢工字钢厂家哪家强 - 品牌推荐师
  • Git04-同步1-2:在feat/B分支上同步origin/main新代码【git fetch origin⮕git rebase origin/main】
  • 术语俗话 --- 什么是DBI,和hook什么区别
  • 仅限首批200家技术团队获取:Docker AI沙箱性能-安全平衡模型(Latency <8ms CVE拦截率99.97%)
  • Cursor Pro免费激活指南:3步解锁AI编程完整功能
  • Visual C++运行库修复工具终极指南:从故障诊断到批量管理
  • 3步轻松备份QQ空间所有历史说说:GetQzonehistory完整指南
  • 别再死记硬背公式了!用Python的NumPy库5分钟搞定矩阵特征值与特征向量计算
  • MCP 2026固件级漏洞修复全流程,含华为/思科/Juniper设备兼容性适配表(附厂商未发布的Beta补丁包)
  • 终极配置指南:如何让你的Honey Select 2游戏体验全面升级
  • 跨模态特征崩塌问题全解析,手把手修复CLIP+PointPillar+ASR联合训练中的语义漂移
  • 为什么阿里的小游戏有支付宝和淘宝两个平台在做?
  • 如何在5分钟内用Python打造你的专属微信智能助手:WechatBot完整指南
  • 从浏览器新标签页到个人工作台:NewTab-Redirect的个性化革命
  • 揭秘Cursor Free VIP:如何免费解锁AI编程的完整体验
  • 借助AI设计让用户“根本停不下来”的游戏机制
  • 百万医疗险的庖丁解牛
  • 手把手教你用VASP和p4vasp模拟STM图像:从DOS计算到PARCHG文件处理
  • 2026年人工智能论文降AI工具推荐:算法研究和模型分析部分降AI方案
  • GSE-Advanced-Macro-Compiler:重新定义魔兽世界技能自动化
  • Windows Defender 深度卸载:创新模块化架构彻底释放系统性能
  • 如何快速部署多语言语义匹配模型:5个高效优化方案完整指南
  • 前端GIF处理效率提升300%?gifuct-js深度解析与应用实践
  • 【Linux】开发工具3 : gcc/g++的使用
  • MCP 2026安全补丁落地失败率骤降83%的关键配置(2026年Q1全网TOP3企业已验证)
  • 自动驾驶算法岗必备:手把手教你优化C++角度归一化代码(从Apollo源码说起)
  • 4.17 拦截器