Python—PDF文本与图片抽取


Python—PDF文本与图片抽取

PDF是人们日常使用最多的跨平台文档 。其是一种用独立于应用程序、硬件、操作系统的方式呈现文档的文件格式 。每个PDF文件包含固定布局的平面文档的完整描述,包括文本、字形、图形及其他需要显示的信息 。因此,具有良好的跨平台特性,但同时 , 也为抽取其内容带来了不便 。
PDF最初版本于1993发行,最新版本为2.0 。
今天,我们使得Python来抽取PDF文档中的文本与图片 。

文本抽取

PDF文本抽取相对容易,效果最好的是pdfminer(https://github.com/euske/pdfminer) 。基本能抽取出所有文本 。
pdfminer是开源的纯Python编写,支持最新至PDF 1.7版本 。
pdfminer的使用比较简单
安装:
pip install pdfminer
使用:
python pdf2txt.py -o <抽取保存的文本文件名> -t text -O <源pdf文件>
如上就实现了文本抽?。槿〉氖谴课谋? ,无格式、字体等信息 。
Python—PDF文本与图片抽取

原文
Python—PDF文本与图片抽取

抽取出的文本
pdfminer有个麻烦的地方,对于CJK编码的PDF文档 , 需要手动安装也能正常抽取文字 。

图片抽取

PDF图片抽取是个比较难的问题,目前Python可以调用的比较好的库是PyMuPDF(https://github.com/pymupdf/PyMuPDF) 。PyPDF2(https://github.com/mstamy2/PyPDF2)库也可以实现部分功能 , 但已于2018年停止更新 。
【Python—PDF文本与图片抽取】这些库的问题是,无法抽取出所有的图片,同时,抽取出的图片问题不一 。
这里以 https://arxiv.org/pdf/1703.10135.pdf 文件为例 。
使用PyMuPDF 代码如下:
import fitz# PyMuPDFdef get_pixmaps_in_pdf(pdf_filename):doc = fitz.open(pdf_filename)xrefs = set()for page_index in range(doc.pageCount):for image in doc.getPageImageList(page_index):xrefs.add(image[0])# Add XREFs to set so duplicates are ignoredpixmaps = [fitz.Pixmap(doc, xref) for xref in xrefs]doc.close()return pixmapsdef write_pixmaps_to_pngs(pixmaps):for i, pixmap in enumerate(pixmaps):pixmap.writePNG(f'{i}.png')# Might want to come up with a better namepixmaps = get_pixmaps_in_pdf('Wang_et_al_2017_Tacotron.pdf')write_pixmaps_to_pngs(pixmaps)
抽取效果如下 。整篇PDF文档 , 只抽取出如下的几个图片 。
Python—PDF文本与图片抽取

比如,第二页的图片就无法抽取出来 。
Python—PDF文本与图片抽取

理想状态下,第6页的图片与示例应该合并一成一张图抽取出来,但实际上是分开抽取 。
Python—PDF文本与图片抽取

好的 。Python抽取PDF文字与图片的介绍就到这里 。
大家有更好的图片抽取工具或方法 , 欢迎留言贡献,谢谢

相关经验推荐