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文件>
如上就实现了文本抽取,抽取的是纯文本,无格式、字体等信息。
原文
抽取出的文本
pdfminer有个麻烦的地方,对于CJK编码的PDF文档,需要手动安装也能正常抽取文字。
图片抽取
PDF图片抽取是个比较难的问题,目前Python可以调用的比较好的库是PyMuPDF(https://github.com/pymupdf/PyMuPDF)。PyPDF2(https://github.com/mstamy2/PyPDF2)库也可以实现部分功能,但已于2018年停止更新。
这些库的问题是,无法抽取出所有的图片,同时,抽取出的图片问题不一。
这里以 https://arxiv.org/pdf/1703.10135.pdf 文件为例。
使用PyMuPDF 代码如下:
import fitz # PyMuPDF def 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 ignored pixmaps = [fitz.Pixmap(doc, xref) for xref in xrefs] doc.close() return pixmaps def write_pixmaps_to_pngs(pixmaps): for i, pixmap in enumerate(pixmaps): pixmap.writePNG(f'{i}.png') # Might want to come up with a better name pixmaps = get_pixmaps_in_pdf('Wang_et_al_2017_Tacotron.pdf') write_pixmaps_to_pngs(pixmaps)
抽取效果如下。整篇PDF文档,只抽取出如下的几个图片。
比如,第二页的图片就无法抽取出来。
理想状态下,第6页的图片与示例应该合并一成一张图抽取出来,但实际上是分开抽取。
好的。Python抽取PDF文字与图片的介绍就到这里。
大家有更好的图片抽取工具或方法,欢迎留言贡献,谢谢