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 

如上就实现了文本抽取,抽取的是纯文本,无格式、字体等信息。

Python—PDF文本与图片抽取

原文

Python—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文档,只抽取出如下的几个图片。

Python—PDF文本与图片抽取

比如,第二页的图片就无法抽取出来。

Python—PDF文本与图片抽取

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

Python—PDF文本与图片抽取

好的。Python抽取PDF文字与图片的介绍就到这里。

大家有更好的图片抽取工具或方法,欢迎留言贡献,谢谢


分享到:


相關文章: