Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【Python】PDFMinerを使ってPDFからテキストを抽出するサンプルコードを解説

この記事では、PythonのPDFMinerライブラリを使って、PDFファイルからテキストや目次情報を抽出する方法を学びます。PDFMinerのインストールから、シンプルなテキスト抽出、そして日本語を含むPDFの目次や本文テキストを詳細に取得するサンプルコードまで、システム開発で役立つPDF処理の基本を習得できます。

作成日: 更新日:

開発環境

  • Python version: python 3.10.11

PythonのPDFMinerとは

PDFMiner(ピーディーエフマイナー)とは、PDF文書からテキストを抽出することを目的としたPythonのライブラリです。ここでいう「ライブラリ」とは、特定の機能を持ったプログラムの部品集のようなもので、私たちがプログラムを開発する際に、ゼロから全てを作る手間を省き、効率的に機能を追加できる便利なツールだと考えてください。PDFMinerを使えば、PDFファイルの中にある文字情報をプログラムで読み取り、利用できるようになります。

PDFMinerは、非常にシンプルなテキストの抽出から、PDF内の目次情報を取得するといった高度な機能まで、幅広く提供されています。例えば、大量のPDFファイルから特定のキーワードを含む部分だけを抜き出したり、レポートの目次を自動で作成したりするような場面で活用できます。

PDFからテキストを抽出するためのPythonライブラリはいくつか存在します。その中にはPyPDF2というライブラリもありますが、PyPDF2は日本語のテキスト抽出に対応していません。一方でPDFMinerは日本語にも対応しているため、日本のシステム開発において日本語のPDF文書を扱うことが多い場合でも、安心して使用することができます。この日本語対応が、PDFMinerを選ぶ大きな理由の一つとなります。

公式ドキュメント:https://pdfminersix.readthedocs.io/

PythonのPDFMinerの使い方

このセクションでは、Pythonを使ってPDFファイルの中から文字情報を取り出すための便利なツール、PDFMinerの使い方について解説します。PDFMinerは、PDFファイルの内容を解析し、そこに含まれるテキストデータを抽出するPythonライブラリです。例えば、大量のPDF書類から特定の情報を自動で集めたい場合や、PDFの内容を分析したい場合などに役立ちます。

PDFMinerをインストール

Pythonで外部の便利な機能を使うためには、その機能が提供されている「ライブラリ」を自分の環境に導入する必要があります。PDFMinerもPythonのライブラリの一つです。ライブラリをインストールするには、pipというPythonのパッケージ管理ツールを使用します。pipは、必要なライブラリをインターネットからダウンロードして、Pythonで使えるように設定してくれる役割を持っています。

1pip install pdfminer.six

上記のコマンドをターミナル(コマンドプロンプトやPowerShellなど)で実行すると、PDFMinerのインストールが開始されます。インストールが完了すると、PythonのプログラムからPDFMinerを利用できるようになります。これで、PDFファイルからテキストを抽出するための準備が整いました。

PythonのPDFMinerでテキストを抽出する

PythonのライブラリであるPDFMinerを使用して、PDFファイルからテキスト情報を抽出する方法を解説します。今回は、文字の配置が多様な3554.pdfというPDFファイルからテキストを抽出する例を通じて、具体的なコードと仕組みを学んでいきましょう。PDFMinerは、PDFファイルの内容を解析し、そこから必要なテキストデータを取り出すための強力なツールです。

テキストを抽出する簡単な方法

まずは、PDFファイルからテキストを抽出する最もシンプルな方法をご紹介します。

1from pdfminer.high_level import extract_text
2
3# PDFファイルの指定
4pdf_path = "./3554.pdf"
5
6# テキストを抽出する
7extracted_text = extract_text(pdf_path)
8print(extracted_text)

このコードでは、pdfminer.high_levelモジュールに含まれるextract_text関数を使用しています。この関数は、PDFファイルのパス(ファイルの場所を示す情報)を引数として受け取るだけで、PDF内のすべてのテキストを簡単に抽出してくれます。たとえPDFのレイアウトが複雑であっても、テキストのまとまりごとに順番に抽出されるため、非常に扱いやすいのが特徴です。

作成したファイルは、以下のコマンドで実行できます。

1python pdf.py

このコマンドを実行すると、Pythonスクリプトが起動し、指定されたPDFファイルから抽出されたテキストが画面に表示されます。

目次情報とテキストを抽出するサンプルコード

次に、PDFMinerのより詳細な機能を使って、PDFファイルから目次情報と本文テキストを抽出するサンプルコードを紹介します。このコードでは、3554.pdfから目次情報を取得してoutline.txtというファイルに書き込み、さらにPDFMinerが推奨する詳細な方法でテキストを抽出してcontent.txtというファイルに書き込みます。

1# 必要なライブラリのインポート
2from pdfminer.high_level import extract_text
3from pdfminer.pdfparser import PDFParser
4from pdfminer.pdfdocument import PDFDocument
5from pdfminer.converter import TextConverter
6from pdfminer.layout import LAParams
7from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
8from pdfminer.pdfpage import PDFPage
9from io import StringIO
10
11# PDFファイルの指定
12pdf_path = "./3554.pdf"
13
14# 目次情報を取得する
15outline_parser = PDFParser(open(pdf_path, 'rb'))
16outline_doc = PDFDocument(outline_parser)
17outlines = outline_doc.get_outlines()
18print(outlines)
19
20# 目次情報をファイルに書き込む
21with open("./outline.txt", "w", encoding="utf-8") as outline_file:
22    for outline in outlines:
23        level = outline[0]
24        title = outline[1]
25        outline_file.write(f"{level}: {title}\n")
26
27# テキストの抽出するための一時的なバッファを定義する
28extracted_text_buffer = StringIO()
29
30# PDFファイルの読み込みとテキストの抽出
31with open(pdf_path, 'rb') as pdf_file:
32    # PDFパーサーの初期化
33    pdf_parser = PDFParser(pdf_file)
34    pdf_doc = PDFDocument(pdf_parser)
35
36    # PDFからテキストへ変換するための準備
37    resource_manager = PDFResourceManager()
38    layout_params = LAParams()
39    text_converter = TextConverter(resource_manager, extracted_text_buffer, laparams=layout_params)
40    interpreter = PDFPageInterpreter(resource_manager, text_converter)
41
42    # 各ページに対してテキスト抽出を行う
43    for page in PDFPage.create_pages(pdf_doc):
44        interpreter.process_page(page)
45
46# 抽出したテキストをファイルに書き込む
47with open ("./content.txt", "w", encoding="utf-8") as content_txt:
48    content_txt.write(extracted_text_buffer.getvalue())

目次情報を取得する

まずは、PDFファイルに埋め込まれている目次情報を取得する方法を見ていきましょう。

1outline_parser = PDFParser(open(pdf_path, 'rb'))
2outline_doc = PDFDocument(outline_parser)
3outlines = outline_doc.get_outlines()
4print(outlines)

ここでは、PDFParserとPDFDocumentという二つのクラス(特定の機能を持つプログラムの部品)を使います。 PDFParserは、PDFファイルの内部構造を解析するためのクラスです。一方、PDFDocumentは、解析されたPDFファイル内の構造やメタデータ(ファイルに関する情報、例えば作成者や日付など)にアクセスするためのクラスとなります。

open(pdf_path, 'rb')は、指定されたPDFファイルを「バイナリモード(rb)」で開くという命令です。開いたファイル情報をPDFParserに渡し、その解析結果をPDFDocumentに渡すことで、PDFファイルの全体像をプログラムが認識できるようになります。 そして、outline_doc.get_outlines()を呼び出すことで、PDFファイルに設定されている目次情報(アウトライン)を取得しています。

目次情報をファイルに書き込む

次に、取得した目次情報をファイルに書き込む方法を解説します。

1with open("./outline.txt", "w", encoding="utf-8") as outline_file:
2    for outline in outlines:
3        level = outline[0]
4        title = outline[1]
5        outline_file.write(f"{level}: {title}\n")

取得した目次情報は、1件ずつタプル型という形式で得られます。タプル型は、複数のデータをひとまとめにしたもので、一度作成すると内容を変更できないリストのようなものです。 このタプルの中には、0番目の要素として見出しのレベル(例えば、大見出し、中見出しなど)、1番目の要素として見出しのタイトルが入っています。

このコードでは、with open(...) as ...:という構文を使ってoutline.txtというファイルを新規作成し("w"モード)、文字コードを"utf-8"に指定して開いています。この構文を使うことで、ファイルが安全に開かれ、処理が終わると自動的に閉じられます。 for outline in outlines:というループ処理で、取得した目次情報を1つずつ取り出し、levelとtitleに格納しています。そして、Pythonのf-stringという便利な機能を使って、「レベル: タイトル」という形式で整形した文字列を1行ずつoutline.txtファイルに書き込んでいます。

テキストを抽出する準備をする

ここからは、PDFMinerで推奨されている、より詳細な方法でテキストを抽出するための準備を行います。

1extracted_text_buffer = StringIO()
2
3with open(pdf_path, 'rb') as pdf_file:
4    pdf_parser = PDFParser(pdf_file)
5    pdf_doc = PDFDocument(pdf_parser)
6
7    resource_manager = PDFResourceManager()
8    layout_params = LAParams()
9    text_converter = TextConverter(resource_manager, extracted_text_buffer, laparams=layout_params)
10    interpreter = PDFPageInterpreter(resource_manager, text_converter)

まず、extracted_text_buffer = StringIO()という行では、StringIOというクラスを使って、文字列を一時的に保存できる「バッファ」(一時的な保管場所)を作成しています。抽出したテキストは、いったんこのバッファに書き込まれていきます。

その下のwith open(pdf_path, 'rb') as pdf_file:以降では、PDFファイルを開き、以下の各クラスを準備しています。これらのクラスがそれぞれ役割分担し、テキスト抽出の作業を進めます。

  • PDFResourceManager:PDFファイル内のフォントや画像などの「リソース」(資源)を管理します。
  • LAParams:PDFファイル内のテキストがどこに、どのように配置されているか、といった「レイアウト情報」を保持します。
  • TextConverter:PDFファイル内のテキストを実際に取得し、変換する役割を担います。ここでは、抽出したテキストの書き込み先として、先ほど作成したextracted_text_bufferを指定しています。
  • PDFPageInterpreter:PDFのページを実際に解析し、TextConverterを使ってテキスト抽出の指示を出す中心的な役割を担います。

これらのクラスが連携することで、PDFからテキストを正確に抽出するための基盤が整います。

各ページからテキストを抽出する

準備が整ったら、PDFの各ページから実際にテキストを抽出する処理を行います。

1    for page in PDFPage.create_pages(pdf_doc):
2        interpreter.process_page(page)

このコードでは、forループという繰り返し処理を使って、PDFPage.create_pages(pdf_doc)によってPDFファイル内のページを1ページずつ取り出しています。 そして、取り出した各ページに対してinterpreter.process_page(page)を実行します。これにより、PDFPageInterpreterがそのページの情報を解析し、設定しておいたTextConverterを通じてテキストを抽出します。 抽出されたテキストは、先ほど準備したextracted_text_bufferにどんどん書き込まれていきます。

抽出したテキストをファイルに書き込む

最後に、バッファに一時保存された抽出済みテキストを、永続的なファイルとして保存します。

1with open ("./content.txt", "w", encoding="utf-8") as content_txt:
2    content_txt.write(extracted_text_buffer.getvalue())

この部分では、with open(...) as ...:構文を使ってcontent.txtというファイルを新規作成し、文字コードを"utf-8"に指定して開いています。 extracted_text_buffer.getvalue()を呼び出すことで、バッファにこれまでに書き込まれたすべてのテキストデータを取得します。 そして、取得したテキストデータをcontent_txt.write()を使ってcontent.txtファイルに書き込んでいます。

この一連の処理が完了すると、プログラムを実行したのと同じ場所にoutline.txtとcontent.txtという二つのファイルが作成されます。outline.txtにはPDFの目次情報が、content.txtにはPDFの本文テキストがそれぞれ書き込まれていることを確認できます。

おわりに

この記事では、PythonのPDFMinerライブラリを使用してPDFファイルからテキストや目次情報を抽出する方法を学習しました。pip install pdfminer.sixでライブラリをインストールし、extract_text関数を使うことで手軽にテキストを抽出できます。さらに、PDFParserやPDFDocument、TextConverterなどを活用することで、PDFの目次や本文テキストを詳細に取得する手順を学びました。PDFMinerは日本語のPDF文書にも対応しているため、大量のPDFファイルから必要な情報を自動で集めるなど、システム開発の様々な場面で役立ちます。

関連コンテンツ

関連IT用語