Python处理PDF的实用姿势

本文介绍了Python处理PDF的三个主要模块:PyPDF2、pdfminer.six和pdfplumber。PyPDF2适用于页面级操作,如合并、分割、旋转和加解密;pdfminer.six适合复杂内容处理,而pdfplumber则提供便捷的内容抽取接口。内容包括提取文字、表格、图片和图表等。
摘要由CSDN通过智能技术生成

你不懂得安排自己的人生,会有很多人帮你安排,他们需要你做的事。

PDF文件我们经常用,尤其是这两个场景:

  • 下载参考资料,如各类报告、文档
  • 分享只读资料,方便传播同时保留源文件

场景和模块

所以,对于PDF文件,常见的需求也就是两类:

  • 处理文件本身,属于文件页面级操作,如合并/分拆PDF页面、加/解密、加/去水印;
  • 处理文件内容,属于内容级操作,如提取文字、表格数据、图表等。

目前Python用于处理PDF的模块,主要有3个:

  • PyPDF2:模块成熟,最后一次更新在2年前,适合页面级操作,文字提取效果较差。
  • PDFMiner:擅长文字抽取,目前主分支已停止维护,取而代之的是pdfminer.six
  • pdfplumber:基于pdfminer.six的文本内容抽取工具,使用门槛更低,如支持表格提取。

实战中,可以根据需求的类型选择模块。如果是页面级的操作,就用PyPDF2,如果需要内容抽取,优先使用pdfplumber

对应的模块安装:

  • pip install pypdf2
  • pip install pdfminer.six
  • pip install pdfplumber

下面按使用场景演示3个模块的使用。

PyPDF2

PyPDF2的主要能力在页面级操作,比如:

  • 获取PDF文档基本信息
  • PDF分割及合并
  • PDF的旋转及排序
  • PDF加水印及去水印
  • PDF加密及解密

PyPDF2的核心两个类是PdfFileReaderPdfFileWriter,完成PDF文件的读写操作。

获取PDF文档基本信息
import pathlib
from PyPDF2 import PdfFileReader

path = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/002pdf')
f_path = path.joinpath('2020-新冠肺炎疫情对中国连锁餐饮行业的影响调研报告-中国连锁经营协会.pdf')
with open(f_path, 'rb') as f:
    pdf = PdfFileReader(f)
    info = pdf.getDocumentInfo()
    cnt_page = pdf.getNumPages()
    is_encrypt = pdf.getIsEncrypted()
print(f'''
作者: {info.author}
创建者: {info.creator}
制作者: {info.producer}
主题: {info.subject}
标题: {info.title}
总页数: {cnt_page}
是否加密: {is_encrypt}
''')
PDF分割及合并
import pathlib
from PyPDF2 import PdfFileReader, PdfFileWriter

path = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/002pdf')
f_path = path.joinpath('2020-新冠肺炎疫情对中国连锁餐饮行业的影响调研报告-中国连锁经营协会.pdf')
out_path = path.joinpath('002pdf_split_merge.pdf')
out_path_1 = path.joinpath('002pdf_split_half_front.pdf')
out_path_2 = path.joinpath('002pdf_split_half_back.pdf')
# 把文件分为两半
with open(f_path, 'rb') as f, open(out_path_1, 'wb') as f_out1, open(out_path_2, 'wb') as f_out2:
    pdf = PdfFileReader(f)
    pdf_out1 = PdfFileWriter()
    pdf_out2 = PdfFileWriter()
    cnt_pages = pdf.getNumPages()
    print(f'共 {cnt_pages} 页')
    for i in range(cnt_pages):
        if i <= cnt_pages //2:
            pdf_out1.addPage(pdf.getPage(i))
        else:
            pdf_out2.addPage(pdf.getPage(i))
    pdf_out1.write(f_out1)
    pdf_out2.write(f_out2)
# 再把后半个文件与前半个文件合并,后半个文件在前
with open(out_path, 'wb') as f_out:
    cnt_f, cnt_b = pdf_out1.getNumPages(), pdf_out2.getNumPages()
    pdf_out = PdfFileWriter()
    for i in range
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值