PDFファイルは、様々なPC・デバイス環境でもレイアウトを同じ見た目で表示する事が出来るフォーマットです。
PDFの規格自体は、アドビシステムズが開発したフォーマットですが、仕様が公開されているため、アドビ製以外のメーカーが開発したPDFソフトウェアも沢山存在します。
テキストだけでなく画像も扱えて、「しおり」機能、スタンプ、署名、テキスト検索、等など機能も豊富なので、様々な企業や公的機関で重宝されているファイルフォーマットなのですが、内容をデータとして扱うとなると、途端に扱いにくいモノになってしまいます。
PDFファイルは、言わば「紙の代わりに電子的に印刷したモノ」なので納得できなくも無いのですが、数値や表などデータとして扱いたい内容の資料がPDFファイルでガッカリなんて事も。
PythonにはPDFファイルを操作できるライブラリがあり、その中でも本記事で紹介するライブラリ「PDFMiner」を使用すると、PDFファイルの中身を抽出できます。
PythonでPDFファイルの中身をテキストとして取得し扱いたい場合に有効なので参考にしてみてください。
|
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が如何に複雑な構造をしているのかがこれで分かりますね。
クラス | 機能 |
---|---|
PDFResourceManager | PDFファイル内のリソースを管理するクラス |
TextConverter | PDFファイル内のテキストを取得するクラス |
PDFPageInterpreter | 取得したページを解析するクラス |
PDFPage | PDFファイルの1ページずつ取得し纏めて保持するクラス |
LAParams | PDFファイルのレイアウトを保持するクラス |
PDFファイルを読み込んでテキストを取り出す
PDFファイル「Vuforia Developer Agreement.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ファイルを操作し、テキスト抽出したい場合は是非試してみてください。
■本記事を執筆するにあたり下記雑誌を参考にしました。
日経ソフトウエア 2020年3月号
特集1 2大人気言語 Python&JavaScript同時入門特集2 不動産価格「予測AI」を作る特集3 PygameZeroゲームプログラミング入門特集4 Python×PDF活用術特集5 iOS/AndroidでPythonプログラミング!特集6 はじめての「AR」アプリ開発特集7 実験! 「HTML5音声API」と「対話ボットAI」の間で会話は成立するか?
|
Adobeのプラチナパートナーに認定されているデジタルハリウッドのオンラインCGスクール「デジハリONLINE」が提供する「Adobeマスター講座」。
基礎動画教材とAdobe creative cloudの一年版ライセンスがセットになった、コスパ最強のパッケージプランです。
学習ノルマは一切ありません。AdobeCCだけを目的に契約してもOK!
>> デジハリONLINE「Adobeマスター講座」
|
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
|
|
|
|
|