liquidjumper Python Pythonのライブラリ「PDFMiner」でPDFファイルからテキストを取得する方法

Pythonのライブラリ「PDFMiner」でPDFファイルからテキストを取得する方法

python_pdf_import_text_pdfminer_topimage

PDFファイルは、様々なPC・デバイス環境でもレイアウトを同じ見た目で表示する事が出来るフォーマットです。

PDFの規格自体は、アドビシステムズが開発したフォーマットですが、仕様が公開されているため、アドビ製以外のメーカーが開発したPDFソフトウェアも沢山存在します。

テキストだけでなく画像も扱えて、「しおり」機能、スタンプ、署名、テキスト検索、等など機能も豊富なので、様々な企業や公的機関で重宝されているファイルフォーマットなのですが、内容をデータとして扱うとなると、途端に扱いにくいモノになってしまいます。

PDFファイルは、言わば「紙の代わりに電子的に印刷したモノ」なので納得できなくも無いのですが、数値や表などデータとして扱いたい内容の資料がPDFファイルでガッカリなんて事も。

PythonにはPDFファイルを操作できるライブラリがあり、その中でも本記事で紹介するライブラリ「PDFMiner」を使用すると、PDFファイルの中身を抽出できます。

PythonでPDFファイルの中身をテキストとして取得し扱いたい場合に有効なので参考にしてみてください。


SAMURAI ENGINEER Plus+

Pythonライブラリ「PDFMiner」をインストール

Pythonのライブラリ「PDFMiner」はパッケージ管理コマンド「pip」でインストールできます。

その際に「PDFMiner」のバージョンは、「pdfminer.six」を使用します。

pip install pdfminer.six

PDFファイルからテキストを取得する

さっそく、PythonでPDFファイルを読み込み、「pdfminer.six」でテキストを取得してみましょう。

「pdfminer.six」で使用するクラス

「pdfminer.six」でPDFファイルからテキストを取り出すには、以下に挙げた5つのクラスを使用する必要があります。

テキストを取り出すだけでなのに5のクラスも必要なんて、PDFが如何に複雑な構造をしているのかがこれで分かりますね。

クラス機能
PDFResourceManagerPDFファイル内のリソースを管理するクラス
TextConverterPDFファイル内のテキストを取得するクラス
PDFPageInterpreter取得したページを解析するクラス
PDFPagePDFファイルの1ページずつ取得し纏めて保持するクラス
LAParamsPDFファイルのレイアウトを保持するクラス

PDFファイルを読み込んでテキストを取り出す

PDFファイル「Vuforia Developer Agreement.pdf」のテキストを取り出してみたいと思います。

PDFファイルを読み込んでテキストを取り出す


まず、Pythonの組み込み関数 open()でPDFファイルを開きます。

その際に第2引数には、読み取り専用の「”r”」、そしてバイナリデータとして開くことを指定する「”b”」をあわせた「”rb”」を指定します。

ファイルオブジェクトを取得後に、「StringIO」のオブジェクトを「pdfminer.six」のオブジェクトと連携させる処理をしテキストを取り出します。

from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.converter import TextConverter
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.layout import LAParams
from io import StringIO

pdf_file_path = "Vuforia Developer Agreement.pdf"

with open(pdf_file_path , "rb") as pdf_file: #ファイルオブジェクトを受け取り、変数「pdf_file」に代入。
    output = StringIO() #コンソールに出力されたテキストを取得するため、IOクラス「StringIO」使用
    resource_manager = PDFResourceManager()
    laparams = LAParams() #レイアウトの変更がなければデフォルトのままで 
    text_converter = TextConverter(resource_manager, output, laparams=laparams)
    page_interpreter = PDFPageInterpreter(resource_manager, text_converter)

    for i_page in PDFPage.get_pages(pdf_file): #1ベージずづ処理 
        page_interpreter.process_page(i_page)

    output_text = output.getvalue()
    output.close()
    text_converter.close()

print(output_text)


実行すると、PDFファイル「Vuforia Developer Agreement.pdf」のテキストを取り出すことができました。

2018/10/24
Vuforia Developer Agreement
Vuforia Developer Agreement
Print [1]
Effective: June 6, 2018
VUFORIA™ DEVELOPER AGREEMENT
THIS  VUFORIA  DEVELOPER  AGREEMENT  (THIS  “AGREEMENT”  OR  THIS
“Agreement”) IS A LEGALLY BINDING AGREEMENT BETWEEN PTC INC. ("PTC")
AND  THE  LEGAL  ENTITY  YOU  REPRESENT  (“YOU”  OR  “You”).  IF  YOU  USE  OR
ARE  SEEKING  TO  USE  THE  SOFTWARE  OR  SERVICES  DISCUSSED  HEREIN  IN
CONNECTION  WITH  ANY  WORK  OR  UNDERTAKING  YOU  ARE  DOING  FOR  A
BUSINESS,  COMPANY  OR  CORPORATE  ENTITY  (“COMPANY”),  WHETHER  AS  AN
EMPLOYEE OR CONTRACTOR, THE TERMS “YOU” AND “YOU” INCLUDE, AND THE
TERMS  AND  CONDITIONS  HEREOF  ARE  BINDING  ON,  BOTH  YOU  AS  AN
INDIVIDUAL AS WELL AS SUCH COMPANY. IN ADDITION, YOU REPRESENT AND
WARRANT  THAT  YOU  HAVE  THE  AUTHORITY  TO  BIND  SUCH  COMPANY,  AND
THAT SUCH COMPANY HAS AUTHORIZED YOU TO ACCEPT THE TERMS OF THIS
AGREEMENT ON ITS BEHALF.
PTC  IS  WILLING  TO  PROVIDE  YOU  THE  SERVICES  (AS  DEFINED  BELOW)  AND
LICENSE TO YOU THE SOFTWARE AND DOCUMENTATION (AS DEFINED BELOW)
ONLY  ON  THE  CONDITION  THAT  YOU  ACCEPT  AND  AGREE  TO  ALL  OF  THE
TERMS  AND  CONDITIONS  IN  THIS  AGREEMENT.  YOU  ACKNOWLEDGE  AND
AGREE  THAT  YOU  HAVE  READ  THIS  AGREEMENT,  UNDERSTAND  IT  AND  AGREE
TO  BE  BOUND  BY  ITS  TERMS  AND  CONDITIONS.  IF  YOU  DO  NOT  AGREE  TO
THESE  TERMS  AND  CONDITIONS,  PTC  IS  UNWILLING  TO  AND  DOES  NOT  AND
WILL  NOT  LICENSE  THE  SOFTWARE  AND  DOCUMENTATION  OR  PROVIDE  THE
SERVICES TO YOU. IF YOU DO NOT AGREE TO THESE TERMS AND CONDITIONS
YOU  MAY  NOT  COMMENCE  ANY  INSTALLATION  PROCESS  AND  YOU  SHALL  NOT
USE  THE  SOFTWARE  OR  RETAIN  ANY  COPIES  OF  THE  SOFTWARE  OR
DOCUMENTATION,  EVEN  IF  YOU  HAVE  IN  ANY  MANNER  COME  INTO
POSSESSION  THEREOF.  ANY  USE  OR  POSSESSION  OF  THE  SOFTWARE,
SERVICES, AND/OR DOCUMENTATION BY YOU IS SUBJECT TO THE TERMS AND
CONDITIONS  SET  FORTH  IN  THIS  AGREEMENT,  INCLUDING  WITHOUT
LIMITATION THE FEES DUE FOR SUCH USE OR POSSESSION. PTC MAY SUSPEND
OR  TERMINATE  YOUR  USE  OF  THE  SOFTWARE,  DOCUMENTATION,  SERVICES
AND/OR  STATISTICS  IF  YOU  FAIL  TO  COMPLY  WITH  ANY  PART  OF  THIS
AGREEMENT.

PDFファイルの日本語テキストを取得する

PDFファイルを操作できるPythonライブラリは様々なありますが、「pdfminer.six」の特徴は日本語テキストが扱える事。

日本語を含んだPDFファイルのテキストを同様のコードで取り出すと、文字化けすること無く取得できました。

令和4年3月 14 日 

国 税

庁 

  令和4年3月 14 日 21 時 00 分現在、e-Tax でシステムにつながり

づらい状況となっております。 

  e-Tax による申告・納税手続につきましては、時間を空けてから行

っていただきますようお願いします(確定申告期は 24 時間ご利用可

  納税者の皆様には大変ご不便をおかけしておりますことをお詫び

  国税庁では、現在、原因の解明及びシステムの復旧に努めておりま

能です。)。 

申し上げます。 

す。 

  今後の対応につきましては、改めて国税庁ホームページ等におい

てお知らせを掲載します。 


ただ、改行コード (“\n”) が含まれているので不要な場合は、replace(“\n” , “”)で削除すると扱いやすくなるでしょう。

output_text = output_text.replace("\n", "")
print(output_text)


改行が削除されて出力されました。更に空白やタブ等も削除するとより良いかも知れません。

令和4年3月 14 日 国 税庁   令和4年3月 14 日 21 時 00 分現在、e-Tax でシステムにつながりづらい状況となっております。   e-Tax による申告・納税手続につきましては、時間を空けてから行っていただきますようお願いします(確定申告期は 24 時間ご利用可  納税者の皆様には大変ご不便をおかけしておりますことをお詫び  国税庁では、現在、原因の解明及びシステムの復旧に努めておりま能です。)。 申し上げます。 す。   今後の対応につきましては、改めて国税庁ホームページ等においてお知らせを掲載します。

「しおり」を取得する

PDFには「しおり」機能があり、書籍の章や目次のような使い方ができて便利。

「しおり」を取得する


そして「pdfminer.six」は、この「しおり」も取り出す事ができます。

「pdfminer.six」で「しおり」のテキストを取得する場合は、「PDFDocument」と「PDFParser」に例外処理用の「PDFNoOutlines」を加えた3つのクラスを使用します。

from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfdocument import PDFNoOutlines
from pdfminer.pdfparser import PDFParser

pdf_file_path = "ebook.pdf"

with open(pdf_file_path , "rb") as pdf_file:
    parser = PDFParser(pdf_file) #ファイルオブジェクトからParserオブジェクトを取得 
    document = PDFDocument(parser) #ParserオブジェクトからDocumentオブジェクトを作成
    try:
        outlines = document.get_outlines() 
        for i_outline in outlines:
            print(i_outline)
    except PDFNoOutlines:
        print("no data")


実行すると、PDFファイルに設定された「しおり」のデータがタプルで取得できました。

各タプルのインデックス0の数字は、しおりの階層を表しています

(1, '第1部', None, <PDFObjRef:1219>, None)
(1, 'はじめに', None, <PDFObjRef:11347>, None)
(2, 'はじめに', None, <PDFObjRef:11419>, None)
(3, '1.1\u2002本書の概要', None, <PDFObjRef:11425>, None)
(4, '1.1.1\u2002対象とする読者の範囲', None, <PDFObjRef:11527>, None)
(4, '1.1.2\u2002職種アイコン', None, <PDFObjRef:11528>, None)
(3, '1.2\u2002付録データ', None, <PDFObjRef:11428>, None)
(4, '1.2.1\u2002データのダウンロード方法', None, <PDFObjRef:11529>, None)
(4, '1.2.2\u2002付録データの使用許諾範囲', None, <PDFObjRef:11530>, None)



まとめ

Pythonライブラリ「PDFMiner」を使って、PDFファイルの中身をテキストとして取得する方法を紹介しました。

「PDFMiner」は、PDFファイルの中身をデータとして扱う際に便利なうえ、数あるPDFライブラリの中でも日本語テキストに対応なので、インストールしておいて損はないライブラリです。

PythonでPDFファイルを操作し、テキスト抽出したい場合は是非試してみてください。



■本記事を執筆するにあたり下記雑誌を参考にしました。



【デジハリONLINEの 基礎動画 + AdobeCC一年ライセンス のお得プラン】

Adobeのプラチナパートナーに認定されているデジタルハリウッドのオンラインCGスクール「デジハリONLINE」が提供する「Adobeマスター講座」
基礎動画教材とAdobe creative cloudの一年版ライセンスがセットになった、コスパ最強のパッケージプランです。

学習ノルマは一切ありません。AdobeCCだけを目的に契約してもOK!

>> デジハリONLINE「Adobeマスター講座」





SAMURAI ENGINEER Plus+

𝕏 ( 旧Twitter ) Facebook Pocket LINE はてブ

おすすめの関連記事



あわせてよく読まれている記事