Python 实战 | 拆分、合并、转换……请查收这份 PDF 操作手册

更多详情请点击查看原文: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()

图片

当然,如果你的需求很少,那么先存为 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 教学

Python实战

数据可视化

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值