1 Python 的 PDF 工具

  • PyMuPDF: 支持更多高级功能和处理复杂 PDF 文件
  • pdfplumber:从 PDF 中提取文本、表格或生成简单的 PDF 文档
  • 联合使用两个库是一种常用方法

2 PyMuPDF

最近需要把扫描的 PDF 转换成文本,试用了 pdfminer,pypdf2 等工具,解析图片的效果都不太好,用起来也比较麻烦,后来试用了 PyMuPDF,相对其它工具,它最新版本屏蔽了更多细节,围绕 Page 进行操作,调用非常方便。除了 PDF 它还支持解析 epub 等电子书格式。

目前网上例程大多是只抽取图片,没有同时转换图片和文字,且因为旧版本 API,大多已无法正常运行。本文将示例其用法。

3 安装

1
$ pip install pymupdf==1.18.19

如果提取找不到 fiz.h,建议更新 pip 版本

1
$ pip3.6 install --upgrade pip

4 例程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
def parse(inpath, outpath):
remove(TMPDIR) # 清除临时目录
os.mkdir(TMPDIR)
remove(outpath) # 清除输出文件

t0 = time.clock()
doc = fitz.open(inpath)
lenXREF = doc.xrefLength()
print("文件名:{}, 页数: {}, 对象: {}".format(inpath, len(doc), lenXREF - 1))

imgcount = 0
for i,page in enumerate(doc):
t1 = time.clock()
# 文字
text = page.get_text()
if len(text) > 0:
write_file(outpath, text, 'a')
# 图片
imglist = page.get_images() # 解析该页中图片
for item in imglist:
xref = item[0]
pix = fitz.Pixmap(doc, xref)
new_name = "{}.png".format(imgcount)
# 如果pix.n<5,可以直接存为PNG
path = os.path.join(TMPDIR, new_name)
if pix.n < 5:
pix.writePNG(path)
# 否则先转换CMYK
else:
pix0 = fitz.Pixmap(fitz.csRGB, pix)
pix0.writePNG(path)
pix0 = None
pix = None
if OCR_ONLINE:
text = img_to_str_baidu(path)
else:
text = img_to_str_tesseract(path)
print("img->text", text)
write_file(outpath, text, 'a')
write_file(outpath, '\n' + '-----------' + '\n', 'a')
imgcount += 1
print("page {} 运行时间:{}s".format(i, {t1 - t0}))

完整例程请见参考部分

5 参考

帮助文档 https://pymupdf.readthedocs.io/en/latest/tutorial.html

源码地址 https://github.com/pymupdf/PyMuPDF

完整例程 https://github.com/xieyan0811/pdfconv.git