614|3

553

帖子

3

TA的资源

纯净的硅(初级)

楼主
 

书籍《Python编程快速上手(第2版)》阅读心得8、处理PDF文件 [复制链接]

本帖最后由 xinmeng_wit 于 2024-6-2 11:19 编辑

PDF文件是二进制文件,比纯文本文件要复杂得多。除了文本,它还保持了许多字体、颜色和布局信息。

如果希望程序能读取或写入PDF文档,那么需要做的就不只是将它们的文件名传递给open()了。

好在有些Python模块使得处理PDF文档变得容易。

本篇将学习PDF处理模块PyPDF2。

正式使用这个PyPDF2模块之前,需要先安装该模块,因为该模块并不是python自带的模块。

安装过程不再赘述,请参考之前的系列文章。

 

PyPDF2没有办法从PDF文档中提取图像、图标或者其它媒体,但它可以提取文本,并将文本返回为Python字符串。

如下例子用于打开pdf文件,并打印该pdf的总页数,另外还提取pdf文件中第一页的文本内容,并打印出来。

import PyPDF2

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中
pdfFileObj = open('D:\\Machine Learning\\TinyML_ Machine Learning with TensorFlow Lite on Arduino.pdf', 'rb')
# 获取pdfFileReader对象
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
# 打印pdf文件的总页数
print(pdfReader.numPages)
# 获取某一页的page对象
pageObj = pdfReader.getPage(0)
# 打印获取到的page内容
print(pageObj.extractText())
# 关闭pdf文件
pdfFileObj.close()

程序中首先使用了open函数打开了这个pdf文件,然后使用PyPDF2的函数PdfFileReader函数创建了Reader对象。

接下来利用pdfReader.numPages获取总的页码数。

再使用pdfReader.getPage(0)获取pdf第一页的怕个对象,再用pageObj.extractText()提取文本。

运行结果:

 

 

上面学习了pdf文件的读取,下面将使用PdfFileWriter进行pdf的写入处理。

PdfFileWriter对象可以创建一个新的PDF文档。

但是PyPDF2不能将任意文本写入PDF,不像Python可以写入纯文本文件。

PyPDF2写入PDF的能力,仅限于从其它PDF中复制页面、旋转页面、重叠页面和加密文件。

PyPDF2不允许直接编辑PDF。必须创建一个新的PDF,然后从已有的文档复制内容。

 

下面的例子将两个pdf文件合并为一个pdf文件。

import PyPDF2

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中
pdf1FileObj = open('D:\\Python\\pdf1.pdf', 'rb')
pdf2FileObj = open('D:\\Python\\pdf2.pdf', 'rb')
# 获取pdfFileReader对象
pdf1Reader = PyPDF2.PdfFileReader(pdf1FileObj)
pdf2Reader = PyPDF2.PdfFileReader(pdf2FileObj)
# 创建pdfFileWriter对象
pdfWriterObj = PyPDF2.PdfFileWriter()

# 将pdf1的所有page写入到pdfWriterObj对象中
for pageNum in range(pdf1Reader.numPages):
    pageObj = pdf1Reader.getPage(pageNum)
    pdfWriterObj.addPage(pageObj)
# 将pdf2的所有page写入到pdfWriterObj对象中
for pageNum in range(pdf2Reader.numPages):
    pageObj = pdf2Reader.getPage(pageNum)
    pdfWriterObj.addPage(pageObj)

# 定义新的pdf文件对象
pdfOutputFile = open('D:\\Python\\pdf_write.pdf', 'wb')
# 写入到新的pdf
pdfWriterObj.write(pdfOutputFile)

# 关闭所有pdf文件
pdfOutputFile.close()
pdf1FileObj.close()
pdf2FileObj.close()

运行后,确实将pdf1.pdf和pdf2.pdf合并为了一个pdf_write.pdf。

其实这个就是pdf的创建和复制的功能。

 

接下来,再来看一下PDF的旋转的例子。

import PyPDF2

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中
pdf2FileObj = open('D:\\Python\\pdf2.pdf', 'rb')
# 获取pdfFileReader对象
pdf2Reader = PyPDF2.PdfFileReader(pdf2FileObj)
# 获取第一页的内容
page = pdf2Reader.getPage(0)
# 顺时针旋转90度
page.rotateClockwise(90)

# 创建pdfFileWriter对象
pdfWriterObj = PyPDF2.PdfFileWriter()
# page内容写入到pdfWriterObj
pdfWriterObj.addPage(page)

# 定义新的pdf文件对象
pdfOutputFile = open('D:\\Python\\pdf_rotate.pdf', 'wb')
# 写入到新的pdf
pdfWriterObj.write(pdfOutputFile)

# 关闭所有pdf文件
pdfOutputFile.close()
pdf2FileObj.close()

运行完成后确实生成了一个旋转了90度的新的pdf。

前面已经说明过了,PyPDF2不能对原始的pdf进行编辑,只能将改变过内容另存为新的pdf。

 

再来看一个页面叠加的例子,该例子中会将两个pdf的页面叠加在一起形成一个新的pdf,这个的作用是能够很方便的为pdf加上水印,公司标签等等,实际使用中还是相对有用的。

为了演示方便,我这里就不单独制作水印了,直接将前面的pdf1和pdf2进行叠加看一看效果。

import PyPDF2

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中
pdf1FileObj = open('D:\\Python\\pdf1.pdf', 'rb')
# 获取pdfFileReader对象
pdf1Reader = PyPDF2.PdfFileReader(pdf1FileObj)
# 获取第一页的内容
page = pdf1Reader.getPage(0)

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中,并获取pdfFileReader对象
pdfWaterMarkReader = PyPDF2.PdfFileReader(open('D:\\Python\\pdf2.pdf', 'rb'))
# 合并2个page
page.mergePage(pdfWaterMarkReader.getPage(0))

# 创建pdfFileWriter对象
pdfWriterObj = PyPDF2.PdfFileWriter()
# page内容写入到pdfWriterObj
pdfWriterObj.addPage(page)

# 定义新的pdf文件对象
pdfOutputFile = open('D:\\Python\\pdf_water_mark.pdf', 'wb')
# 写入到新的pdf
pdfWriterObj.write(pdfOutputFile)

# 关闭所有pdf文件
pdfOutputFile.close()
pdf1FileObj.close()

 

运行完成后,就会看到生成了pdf_water_mark.pdf,打开该pdf就能看到已经将pdf1和pdf2的内容进行了一个合并。

下面的pdf看上去比较乱,是因为合并了pdf1和pdf2的内容,在实际应用中是将水印或者公司图标与具体内容合并。

 

 

再来看看pdf的另外一个功能,就是pdf文件的加密。

比如,我们想对前面pdf2文件进行加密,需要先将pdf2的文件的内容提取出来,然后写将密码和内容写到一个新的pdf中,这样就完成了对pdf2的加密,最后将原始的pdf1删除。

import PyPDF2

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中
pdf2FileObj = open('D:\\Python\\pdf2.pdf', 'rb')
# 获取pdfFileReader对象
pdf2Reader = PyPDF2.PdfFileReader(pdf2FileObj)

# 创建pdfFileWriter对象
pdfWriterObj = PyPDF2.PdfFileWriter()

# 写入全部的内容
for pageNum in range(pdf2Reader.numPages):
    pdfWriterObj.addPage(pdf2Reader.getPage(pageNum))

# 写入pdf的密码
pdfWriterObj.encrypt('pdf2_password')

# 定义新的pdf文件对象
pdfOutputFile = open('D:\\Python\\pdf_encrypt.pdf', 'wb')
# 写入到新的pdf
pdfWriterObj.write(pdfOutputFile)

# 关闭所有pdf文件
pdfOutputFile.close()
pdf2FileObj.close()

程序运行后,就会生成加密的pdf文件pdf_encrypt.pdf,打开该pdf的时候就会提示输入密码,输入字符串pdf2_password后就能成功打开该pdf了。

 

 

 

以上就是关于pdf文档处理的全部内容,虽然不能编辑原pdf,但是能够改变一些内容后生成一个新的pdf,在一定程度上也类似与编辑了原来的pdf,在实际项目中用处还是有的,可以实现pdf文档处理的自动化操作了,比如快速提取pdf的指定页的文本内容,给pdf加上水印,给pdf加密,合并、旋转pdf等等。

 

 

最新回复

通过PyPDF2模块的加载就可以简单的对pdf文件进行处理,也很不错,学习了。   详情 回复 发表于 2024-11-19 16:14
点赞 关注
 
 

回复
举报

6828

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

原来Python模块是这样处理PDF文档的

点评

实际上,不能直接在原来的pdf上进行编辑,只能提取文字等,然后创建新的pdf,在新建的pdf上进行操作  详情 回复 发表于 2024-6-4 19:25
 
 
 

回复

553

帖子

3

TA的资源

纯净的硅(初级)

板凳
 
Jacktang 发表于 2024-6-4 07:23 原来Python模块是这样处理PDF文档的

实际上,不能直接在原来的pdf上进行编辑,只能提取文字等,然后创建新的pdf,在新建的pdf上进行操作

 
 
 

回复

228

帖子

2

TA的资源

一粒金砂(高级)

4
 

通过PyPDF2模块的加载就可以简单的对pdf文件进行处理,也很不错,学习了。

个人签名

波光潋滟.~

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表