お役立ち

【Python】pdfから文字を抽出。pdfminer.sixの使い方

  • このエントリーをはてなブックマークに追加

おすすめのライブラリは?

Pythonで日本語のPDFを取り扱う場合、
pdfminerというライブラリがおすすめです。
ただし、pdfminerには、様々なバージョンがあります。

  • pdfminer Python2のみ対応 最終更新は2014年
  • pdfminer3k Python3のみ対応 最終更新は2016年
  • pdfminer.six Python2,3対応 最終更新は2017年7月

pdfminerの中では、pdfminer.sixが最近まで更新されていて
Python2と3どちらにも対応しているため
基本的には、pdfminer.sixを選択することになります。
日本語以外のpdfの取り扱いは、
PyPDF2というライブラリがメジャーです。
とはいえ、日本語以外のPDFをPythonで処理する機会は
なかなか無いので今回は、割愛します。

pdfminer.sixをインストール

pipでインストールできるのでお手軽です。

pip install pdfminer.six

pdfから文字を抽出してファイルに書き出す

下記のコードは”input.pdf”から文字を抽出し、
“result.txt”に抽出した文字を書き出すスクリプトです。

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
input_path = "input.pdf"
output_path = "result.txt"
rsrcmgr = PDFResourceManager()
codec = 'utf-8'
params = LAParams()
with open(output_path, "wb") as output:
    device = TextConverter(rsrcmgr, output, codec=codec, laparams=params)
    with open(input_path, 'rb') as input:
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        for page in PDFPage.get_pages(input):
            interpreter.process_page(page)
    device.close()

高度な処理

上記の例では、直接ファイルに書き出すだけです。
これだと、
抽出した文字列に何らかの処理を施すときに不便です。
そのような場合は、TextConverterの第二引数に
ioモジュールのStringIOインスタンスを渡します。

標準出力に表示する

下記のコードは、pdfから抽出した文字列を表示します。

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
input_path = "input.pdf"
rsrcmgr = PDFResourceManager()
codec = 'utf-8'
params = LAParams()
with StringIO() as output:
    device = TextConverter(rsrcmgr, output, codec=codec, laparams=params)
    with open(input_path, 'rb') as input:
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        for page in PDFPage.get_pages(input):
            interpreter.process_page(page)
            print(output.getvalue())
    device.close()

空白を削除する処理を行ってファイルに書き出す

下記のコードはテキスト抽出後に
空白文字の削除を行いファイルに書き出すコードです。

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
input_path = "input.pdf"
output_path = "result.txt"
rsrcmgr = PDFResourceManager()
codec = 'utf-8'
params = LAParams()
text = ""
with StringIO() as output:
    device = TextConverter(rsrcmgr, output, codec=codec, laparams=params)
    with open(input_path, 'rb') as input:
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        for page in PDFPage.get_pages(input):
            interpreter.process_page(page)
            text += output.getvalue()
    device.close()
text = text.strip()
with open(output_path, "wb") as f:
    f.write(text.encode('cp932', "ignore"))
  • このエントリーをはてなブックマークに追加