前言:害,又遇到了要处理 PDF 文件的活了,需求是提取表格,还要拜托有某软件会员的同事操作一下,没想到会员早就过期了。毕竟不常用,为了个 PDF 文件充值,大可不必。就凭我的码字速度,在输入支付密码之前就能把内容都敲下来。但转念一想,PDF 的自动化需求种类还是很多的,比如增删改页面、提取文字和图像等等,万一哪天遇到大批量操作的需求可就麻烦了。自动化之王(不是)Python 肯定有办法!让我们来瞅瞅吧。
先看看笔者遇到的问题,要处理的是这样一份 PDF 文件,前几页为文字,文末附了几个表格,其中有一个表格是跨页的。那要如何提取表格呢?核心代码仅需两行,打开 PDF 文件,读取表格即可,十分便利。
import pdfplumber
pdf = pdfplumber.open("test.pdf") for i in range(2, 4): tables = pdf.pages[i].extract_tables() for t in tables: print(t)
wb = xw.books.active # 连接到活动的工作簿 sht = wb.sheets['Sheet1'] # 连接子表1 n = 1 pdf = pdfplumber.open("test.pdf") # 打开PDF for i in range(2, 4): tables = pdf.pages[i].extract_tables() # 获取第3、4页的表格 for t in tables: for row in t: if'序号'in row and n>1: n += 1# 不同表格之间隔一行 sht.range(f'A{n}').value = row # 将表格的一行从A1单元格开始写入 n += 1# 换行
果然起飞,这种看得见的效果,相比其他在内存中执行完才存表的 EXCEL 处理库要更加过瘾。还可以利用 xlwings 对各个表格添加边框、加粗表头等,在此不做赘述,有兴趣的同学可以自行探索,本文的主角可是 PDF 处理库啊,下面有请——
pdfplumber 是一个基于 pdfminer.six 的 PDF 内容抽取工具,如前文的体验一般,操作十分简单,可惜专攻识别而无法直接对 PDF 做修改保存。如果有更复杂的需求,可以学习 pdfminer,但需要对 PDF 文件模型有所了解,学起来有一定的难度。
官网:https://github.com/jsvine/pdfplumber
PyPDF2 也是一个为人所熟知的 PDF 页面级处理工具,它更加擅长对页面进行分割、合并、裁剪和转换等操作,而对内容的提取能力欠缺。
官网:https://pythonhosted.org/PyPDF2
就让我们从常用的 PDF 操作来认识这两位吧!
1、插入/增加页
我们先另外再准备一个 PDF 文件,用作插入试验。PyPDF2 通过读写器来操作 PDF 文件,假如要在第 1 页之后插入页面,需要通过 Reader 对象的 getPage 方法获取页面,再通过 Writer 对象的 addPage 方法来添加页面,最后写入文件流。
下面我们再准备一个带图片的 PDF 文件,用作提取试验。
依照官方提示,想进行可视化操作还需要安装两个依赖工具。(此外,笔者发现还有其他库能提取 PDF 的图片元素或转化 PDF 页面为图片,如 PyMuPDF、pdf2image等,可以拓展学习)安装地址如下,注意要选择和 python 对应位数的版本。