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文字與圖片的介紹就到這裡。

大家有更好的圖片抽取工具或方法,歡迎留言貢獻,謝謝


分享到:


相關文章: