【MindSpore易点通】Python在手,PDF不愁
【MindSpore易点通】Python在手,PDF不愁
宝子们!时隔大半年(实在对不起大家),久违的办公系列又更新啦!之前我们已经给大家种草了利用Python批量处理word和excel文件,今天继续带领家人们学习如何利用Python处理PDF!
废话不多说,我们就开干吧~~
1 库介绍
通过之前的学习,我们其实也可以总结发现,常规的操作基本可以分为:创建PDF、提取PDF中的内容、操作PDF页面的内容等,那么通过这样的操作,我们找到了一堆可以使用的相关库,比如PDFrw 、Python-PDFkit、PDFplumber、PDFtabextract、PDF-redactor等等。

那么既然知道有这些库了(因为它们都不是Python的标准库),因此接下来的工作就是pip install安装各种库文件啦~
这里是小编安装部分库的展示:
pip install PyPDF2

pip insatll PDFplumber

2 常规操作
2.1 文字信息提取
案例:提取test2.PDF文件第2页的文字信息
思路分析:
1.利用PDFplumber打开一个 PDF 文件
2.获取指定的页,或者遍历每一页
3.利用.extract_text()方法提取当前页的文字
示例代码:
import PDFplumber
file_path = r'C:\Users\hangtian\Desktop\test2.PDF'
with PDFplumber.open(file_path) as PDF:
page = PDF.pages[1]
print(page.extract_text())
运行结果:

2.2 批量拆分
案例:将一个完整的 PDF 拆分成几个小的 PDF,由于这里的文件太大,我们只拆分成两个PDF文件。
思路分析:
1.读取PDF的整体信息、总页数等
2.遍历每一页内容,以每个 step 为间隔将PDF存成每一个小的文件块
3.将小的文件块重新保存为新的PDF文件
代码展示:
import os
from PyPDF2 import PDFFileWriter, PDFFileReader
def split_PDF(filename, filepath, save_dirpath, step=5):
"""
拆分PDF为多个小的PDF文件,
@param filename:文件名
@param filepath:文件路径
@param save_dirpath:保存小的PDF的文件路径
@param step: 每step间隔的页面生成一个文件,例如step=5,表示0-4页、5-9页...为一个文件
@return:
"""
if not os.path.exists(save_dirpath):
os.mkdir(save_dirpath)
PDF_reader = PDFFileReader(filepath)
# 读取每一页的数据
pages = PDF_reader.getNumPages()
for page in range(0, pages, step):
PDF_writer = PDFFileWriter()
# 拆分PDF,每 step 页的拆分为一个文件
for index in range(page, page+step):
if index < pages:
PDF_writer.addPage(PDF_reader.getPage(index))
# 保存拆分后的小文件
save_path = os.path.join(save_dirpath, filename+str(int(page/step)+1)+'.PDF')
print(save_path)
with open(save_path, "wb") as out:
PDF_writer.write(out)
print("文件已成功拆分,保存路径为:"+save_dirpath)
split_PDF(filename, filepath, save_dirpath, step=5)
通过这个代码逻辑我们也可以明白,写入器初始化和输出的位置一定都在读取PDF循环每一页的循环体内,而不是在循环体外。同理,批量合并的思路更加简单啦——确定要合并的文件顺序、循环追加到一个文件块中、保存成一个新的文件,那么我们批量合并的问题也轻松解决!
2.3 添加水印
案例:将下图作为水印添加到test2.PDF中

思路分析:
1.将需要作为水印的图片插入word中调整合适位置后保存为PDF文件,同时需要额外用到copy模块:

2.把读取器和写入器初始化,并且把水印PDF页先读取好备用。

3.加水印本质上就是把水印PDF页和需要加水印的每一页都合并一遍。由于需要加水印的PDF可能有很多页,而水印PDF只有一页,那么就会造成水印PDF和原始PDF页数不匹配的问题。因此需要把水印PDF页不断复制作为new_page备用,再通过mergePage完成每一页的合并,最后交给写入器统一输出。
当然啦,关于Python处理PDF还有很多别的操作,比如加密PDF文件、html网页自动转为PDF等等,欢迎各位宝子们复现、纠错上述操作,并在小编的基础上大放异彩!本次抽5名宝子赠送MindSpore精美周边一份!