更多详情请点击查看原文:Python 实战 | 拆分、合并、转换……请查收这份 PDF 操作手册
Python教学专栏,旨在为初学者提供系统、全面的Python编程学习体验。通过逐步讲解Python基础语言和编程逻辑,结合实操案例,让小白也能轻松搞懂Python!
>>>点击此处查看往期Python教学内容
本文目录
一、引言
二、使用工具介绍
三、PDF 文档操作方法
1. PDF 页面转为图片
2. 使用图片文字生成 PDF
3. 拆分与合并 PDF
四、总结
五、相关推荐
本文共1136个字,阅读大约需要3分钟,欢迎指正!
一、引言
PDF 文件是非常稳定的文档格式,我们在多种科研场景下都会接触 PDF 文档,大部分时候处理它都是提取内容,转换格式等,这些操作的教程在我们过往发布的文章中已经提及:
然而在一些场景下,我们需要对 PDF 文件进行拆分、合并、转换为图像,甚至是使用图片文字生成 PDF 文件。网络上这方面的内容分享不多,所以本期文章我们就来给大家分享这些 PDF 的特殊操作方法。
二、使用工具介绍
-
fitz:是第三方库 PyMuPDF 的一部分,可用于将 PDF 页面转为自定义清晰度图片。
-
PyPDF2:Python 中一个专业的拆分、组合、转化 PDF 文件的第三方库。
-
reportlab:一个强大的专门用于创建PDF文档的 Python 第三方库。
三、PDF 文档操作方法
1. PDF 页面转为图片
# 导入相关库
import fitz,os
# 打开PDF文件
pdf_file = fitz.open('./001872_2011-12-31_2011.PDF')
# 新建一个文件用于保存另存后的图片,前提是该文件夹不存在
if not os.path.exists('./Pistures'): os.mkdir('./Pistures')
## 使用 fitz 库将 pdf 页面转存为图片
for pagenum in range(pdf_file.page_count):
# 获取一个页面
pdfpage = pdf_file[pagenum]
# 定义缩放系数,这个操作将使得到的图片质量相对较高,这里相当于是保存放大四倍后的图像
zoom_x, zoom_y = 4,4
mat = fitz.Matrix(zoom_x, zoom_y).prerotate(0)
# 获取图片矩阵对象
pix = pdfpage.get_pixmap(matrix=mat, alpha=False)
# 将图片对象写入本地图片
PNG_path = f'./Pistures/page_{pagenum+1}.png'
pix.save(PNG_path)
# 作为测试,这里只转换几个页面,当转换结果超过 5 个,循环就会终止
if len(os.listdir('./Pistures')) > 5:
break
这个程序实际上就是逐页转换并保存,所以需要转换的页面是可以自定义的,只需在循环中设置条件即可。
2. 使用图片文字生成 PDF
有时候需要批量将图片或者文字存为 PDF 格式时也可以使用 Python 来完成。
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# 注册中文字体,防止中文无法正常显示
pdfmetrics.registerFont(TTFont('msyhbd', r'C:\Windows\Fonts\msyhbd.ttc'))
# PDF文件名称
pdf_file = "创建的PDF.pdf"
# 创建Canvas实例
c = canvas.Canvas(pdf_file, pagesize=A4)
# 文本和图片的列表
contents = [
('test TEST', './python.PNG'), # 一个页面下还可以存放更多内容
('这是第二页的文本内容', './python.PNG'),
# 可以根据需要继续添加更多内容
]
for text_content, image_path in contents:
# 设置字体为中文字体
c.setFont('msyhbd', 12)
# 添加文本
c.drawString(100, 750, text_content) # 位置可以根据需要调整
# 添加图片,# 位置和大小可以根据需要调整
c.drawImage(image_path, 10, 500, width=8*inch, height=3*inch)
# 创建新的一页
c.showPage()
# 保存PDF文档
c.save()
![图片](https://img-blog.csdnimg.cn/img_convert/25b5787de50ca3495c1d7faa011a2268.png)
当然,如果你的需求很少,那么先存为 Word 文档,再转为 PDF 会更加轻松高效。
3. 拆分与合并 PDF
拆分、合并 PDF 可以说是一个冷门的应用场景了,但也有些时候确实需要做这件事情,例如分析上市公司年报的某部分内容时,就可以从一个几百页的 PDF 文档中挑出其中几页进行另存,这样既有利于节省计算机空间,在人工校验查看原文档时也会更加方便。
下面是使用 PyPDF2 拆分与合并 PDF 文档的代码,如果希望实现上面所说的那种根据内容挑选指定页面的功能,可以自行添加功能逐页读取内容并判断是否为所需的页面。
import PyPDF2
# 待拆分的 PDF 文档的路径
pdf_file_to_split = './001872_2011-12-31_2011.PDF'
pdf_reader = PyPDF2.PdfFileReader(pdf_file_to_split)
# 拆分 PDF 文档,举例说明,将原始 PDF 的第 1-10 页和第 21-30 页分别拆分另存为一个单独的 PDF
# 注意这里说的拆分是在内存中运行的,不会直接修改原始 PDF 文件
page_range_1 = list(range(1,11))
page_range_2 = list(range(21,31))
def Split_pdf(target_pages=[], save_path=''):
'''
target_pages: 所包含的页面序号,从 1 开始算起
save_path: 最后的保存路径
'''
if not target_pages or not save_path:
raise Exception('请输入正确的参数')
maxpage = max(target_pages)
# 新建一个空白 PDF
pdf_writer = PyPDF2.PdfFileWriter()
for page_num in range(pdf_reader.numPages):
page_num += 1
if page_num > maxpage:
# 循环过程中,如果某页面的序号大于所需页面的最大序号则跳出循环
break
if page_num in target_pages:
# 由于上面的 page_num 已经增加 1,所以这里增加页面时要减去 1
page = pdf_reader.getPage(page_num-1)
pdf_writer.addPage(page)
# 开始写入 PDF
with open(save_path, 'wb') as out_file:
pdf_writer.write(out_file)
Split_pdf(page_range_1, './page_1-10.pdf')
Split_pdf(page_range_2, './page_21-30.pdf')
合并 PDF 是指将多个 PDF 的文件合并为一个 PDF 文档,代码如下。
# PDF 文件列表
pdf_files = ['./page_1-10.pdf', './page_21-30.pdf']
# 创建 PDF 文件写入器
pdf_writer = PyPDF2.PdfFileWriter()
# 遍历所有 PDF 文件
for pdf_file in pdf_files:
pdf_reader = PyPDF2.PdfFileReader(pdf_file)
# 将每一页添加到写入器
for page_num in range(pdf_reader.numPages):
page = pdf_reader.getPage(page_num)
pdf_writer.addPage(page)
# 写入合并后的 PDF 文件
with open('Somepages.pdf', 'wb') as out_file:
pdf_writer.write(out_file)
四、总结
💡本期文章分享了几个使用 Python 处理 PDF 文件的方法,希望这些方法能够在大家遇到需要批量拆分、合并 PDF 文件时帮上忙。我们将本文用到的文件和代码分享给大家,欢迎大家交流讨论。
👉数据 Seminar 公众号后台回复关键词“20240510”即可获取本文所有演示代码以及演示用的数据。
如果你想学习各种 Python 编程技巧,提升个人竞争力,那就加入我们的数据 Seminar 交流群吧(请查看原文,以获取客服联系方式),欢迎大家在社群内交流、探索、学习,一起进步!同时您也可以分享通过数据 Seminar 学到的技能以及得到的成果。
五、相关推荐
Python 教学