【PDFテキスト化絶版】PHPライブラリ「PdfParser」とPythonライブラリ「pdfminer.six」の使い方

著者:
投稿日:

今回は請求書などのPDFからテキストを抽出する事をゴールに内容をまとめてみます。


PDFファイルからテキストデータを読み取るための手法はPDFのテキスト抽出またはPDFパーシングと呼ばれているようでして、テキスト抽出は機械学習、データマイニング、コンテンツ管理、またはデジタル化プロジェクトなど、さまざまな用途で利用されます。


PHPとPythonで試してみました。

環境構築とサンプルコードも記載致しましたので気になる方はその部分だけ読んで試してみて下さい。


結論を言うとPythonライブラリ「pdfminer.six」の勝利です笑

記事内で試した実行環境

  • CentOS Stream release 8

  • composer

  • PHP8.2

  • PHPライブラリ「PdfParser」

  • Python3.9

  • Pythonライブラリ「pdfminer.six」

もしPHPがインストールされていない状態でしたら、こちらの記事から試して下さい。

2023年版 ConohaのVPS構築をマスターする手順書[centOS8]
松岡宗谷

目次:PHPインストールで飛んでサクッとインストールできます。

目次
  1. PHPライブラリ「PdfParser」を利用してPDFをテキスト化
    1. PHPライブラリ「PdfParser」とは
    2. Composer(コンポーサー)インストール
    3. Composerをどこでも使えるようにする
    4. PHPライブラリ「PdfParser」インストール
    5. PHPライブラリ「PdfParser」を利用してPDFをテキスト化するサンプルコード
  2. Pythonライブラリ「PDFMiner.six」を利用してPDFをテキスト化
    1. CentOS 8でPython 3.8以上をインストールする
    2. PDFMiner.sixのインストール
    3. 「PDFMiner.six」が正常にインストールされたかの確認
    4. ちなみにインタラクティブシェル内から出る時は
    5. Pythonライブラリ「PDFMiner.six」を利用してPDFをテキスト化するサンプルコード
    6. ローカルのファイルではなくURLのPDFをテキスト化するサンプルコード
    7. PHPからPythonを実行して「PDFMiner.six」を通してPDFのテキスト化を行いデータをPHPで受け取る方法
  3. まとめ

PHPライブラリ「PdfParser」を利用してPDFをテキスト化

まず初めにPHPでPDFをテキスト化するための方法を順番よく載せていきます。

PHPライブラリ「PdfParser」とは

PdfParserはスタンドアロンのPHPライブラリで、PDFファイルからデータを抽出するための様々なツールを提供しているオープンソースです。

https://github.com/smalot/pdfparser

依存性がないのは嬉しいですね

Composer(コンポーサー)インストール

PHP環境が必要です。ない場合は8.0〜8.2あたりのPHPをインストールしてからこのコマンドを打って下さい。一応composerを使わずPHPライブラリ「pdfparser」を使用する事も可能なのですが、オートロオーダーなどの独自実装が必要になってきていますのでそんな大変な事をするのであれば公式で推奨している方法で進めましょう。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

このコマンドのみで Composer のインストールは完了です。


つぎに、ダウンロードした composer-setup.php を実行して、Composer の実行ファイル(phar)を作成します。

php composer-setup.php

セットアップ終了後、ls コマンドで composer.phar ができたことを確認します。


確認ができましたら

 これで Composer のセットアップが完了です。

Composerをどこでも使えるようにする

CentOS のどこからでも(Globallyに)使えるようにするために、 /usr/local/bin フォルダに composer.phar を移動させましょう。 /usr/local/bin フォルダに移動させます。

( root ユーザーの権限が必要です。)

mv composer.phar /usr/local/bin/composer

これで、CentOS のどこからでも Composer のコマンドが実行できるようになりました。


試しに

composer

とコマンドを叩いてみて下さい。

   
  / /_   _        _
 / /   /  \/  ` \/  \/  \/ _/ _ \/ _/
/ /_/ /_/ / / / / / / /_/ / /_/ (  )  / /
\/\/_/ /_/ /_/ ._/\//\___/_/
                    /_/
Composer version 2.7.1 2024-02-09 15:26:28

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display help for the given command. When no command is given display help for the list command
(以下略)

が表示されると思います。

PHPライブラリ「PdfParser」インストール

composer require smalot/pdfparser

このコマンドのみでPdfParserのインストールは完了です。

PHPライブラリ「PdfParser」を利用してPDFをテキスト化するサンプルコード

<?php
require 'vendor/autoload.php';
use Smalot\PdfParser\Parser;

$parser = new Parser();
$pdf = $parser->parseFile('test.pdf'); // URLも参照できます。地味にすごい
$text = $pdf->getText();
etho $text;

参考記事

Composer を CentOS にインストールする手順
松岡宗谷

ただ、注意点としては文字化けするPDFが多いです。。

出力されたデータをエンコーディングすれば直るんじゃ?と予測を立てて検証を行ったのですが、結論全てのPDFを正常にテキスト化するのは不可能でした。


ですので、PythonでPDFからテキスト化する方法も記載致します。

Pythonライブラリ「PDFMiner.six」を利用してPDFをテキスト化

Pythonでよく使用されるライブラリには、PDFMiner、pypdf、PyPDF2、PyTesseract、ReportLab などがあります。


表にてまとめてみました。

ライブラリ用途・特徴その他
PDFMiner(six)PDFからテキストを抽出する日本語に対応、縦書きスクリプトに対応、pipにて導入
pypdfPyPDF2からバトンタッチしたライブラリ。テキストを抽出する、画像を抽出する、PDFファイルの結合や分割処理が可能日本語に対応、pip/Githubにて導入
PyPDF2画像を抽出する、PDFファイルの結合や分割処理が可能日本語に非対応、pip/Githubにて導入
PyTesseractOCR(光学文字認識)技術として画像からテキストを抽出する日本語に対応、pip,Githubにて導入
ReportLabPDFを新規作成する(テキスト・図表・グラフ)高性能のライブラリ、pipにて導入
もしPDFがテキストではなく画像でテキストを表現していた場合は「PyTesseract」を使ってテキスト化をするしかありません

ですが、今回はテキストを抽出するだけが目的ですので「PDFMiner」を使っていきたいと思います。

CentOS 8でPython 3.8以上をインストールする

「PDFMiner.six」を使うためにはPython3.8以上にしないと使えないみたいです。筆者自身の試した環境はPython3.6でエラー吐いて調べて気づきました。


一旦、どのバージョンのPythonがインストールされているか確認いたしましょう。

 python3 --version
or
 python3.8 --version
or
 python3.9 --version

他のサーバーがどうなっているかはわかりませんのでまずは三つとも調べて下さい。

3.8と3.9がなければ新たにインストールしましょう。


一応念のためにdnfでインストールできるか確認しましょう。

dnf search python39

python39(3.9です)があればこのコマンドで

dnf install python39

Python3.9のインストールは完了です。


バージョン確認

python3.9 --version

PDFMiner.sixのインストール

pdfminer.sixはいくつかの外部ライブラリに依存していますが、pipを使用することでこれらの依存関係も同時に解決されます。特に追加の手順を踏む必要はありません。

と言う事で、このコマンドでサクッとインストール致しましょう。

pip install pdfminer.six

これで「PDFMiner.six」のインストールは完了です。

「PDFMiner.six」が正常にインストールされたかの確認

インストールが正しく完了したかを確認するには、Pythonのインタラクティブシェルを開き、pdfminerをインポートしてみます。


インタラクティブシェルの起動

python3.9

インタラクティブシェル内で実行

from pdfminer.high_level import extract_text

このコマンドがエラーなく実行できれば、pdfminer.sixは正しくインストールされています。


・・・もし、エラーになる場合は

python3.9にpdfminer.sixが紐づけられているかを確認いたしましょう。

python3.9 -m pip list | grep pdfminer.six

このコマンドはPython 3.9に対応するpipを使用して、インストールされているパッケージをリストします。pdfminer.sixがリストにない場合は、Python 3.9用に再インストールする必要があります。


Python 3.9用にpdfminer.sixを再インストール

python3.9 -m pip install pdfminer.six

これで紐づかれたので

インタラクティブシェルの起動

python3.9

インタラクティブシェル内で実行

from pdfminer.high_level import extract_text

を行ったときにエラーが吐かれないと思います。

ちなみにインタラクティブシェル内から出る時は

exit() とコマンドを打つか
or
control+D のショートカットキー

で抜けれます。

Pythonライブラリ「PDFMiner.six」を利用してPDFをテキスト化するサンプルコード

# 必要なライブラリのインポート
from pdfminer.high_level import extract_text

# テキストを抽出したいPDFファイルのパス
pdf_path = 'test.pdf'  # ここに実際のファイルパスを指定してください

# PDFからテキストを抽出
text = extract_text(pdf_path)

# 抽出したテキストの表示
print(text)

ほぼPHPライブラリ「PdfParser」と似たような書き方だなと感じつつ・・・

これでPDFをテキスト化する事ができるようになります。

ローカルのファイルではなくURLのPDFをテキスト化するサンプルコード

# web上のPDFファイルをローカルに保存せずに文字列情報を取得
from io import BytesIO
from urllib import request
from pdfminer.high_level import extract_text

url = "https://www.nta.go.jp/publication/pamph/shotoku/0023004-063.pdf"

with request.urlopen(url) as res:
    f = BytesIO(res.read())
    text = extract_text(f)
    print(text)

PHPからPythonを実行して「PDFMiner.six」を通してPDFのテキスト化を行いデータをPHPで受け取る方法

$command="python test.py ";
/** 実行してデータを受け取る **/
exec($command,$output);
foreach($output as $key => $value) {
	echo $value;
}

参考記事

【Python×PDF】PDFMinerライブラリでPDFからテキストを抽出方法【徹底解説】
【Python×PDF】PyPDF2はもう古い!PythonでPDFを扱うときにはpypdfを使おう
python3 で利用可能な pdf からテキストを抽出するライブラリについて

まとめ

PHPとPythonでPDFをテキスト化する方法をご説明いたしました。片方だけ使うとかではなく合わせ技がいいのかなと考えています。


ロジックを組んで

PHPライブラリ「PdfParser」で正常にテキスト化ができない場合に

Pythonライブラリ「PDFMiner.six」で再度試すようにしたりするのもアリなのかなと考えています。


今回は「pypdf」を試せませんでしたのでお時間ある際に、別記事で試してみます。


ではまたー。


CMSの悩みはBasicで一気に解決しましょう
  1. 完全無料
    Basicはオープンソースで運営されています。誰しもが自由にBasicを利用できます。
  2. 超軽量化で超高速配信
    通常のCMSよりページ容量を70%以上を自動で圧縮を行い更に自動で静的化・圧縮化されたページが配信されます。
  3. SEOにつよつよ
    70%以上軽量化に加えて最新SEOに対応した構造で静的化・圧縮化されたページはライバルサイトより圧倒的に評価されます
  4. ライバルサイトより一歩前にいけるCMSでサイトを構築しませんか?

    →より詳しく

著者プロフィール
松岡宗谷

Basic https://basic.dance/ を運営しています。スペースナビ 代表取締役。スタートアップ界隈でCTO→Sharetube創業→スペースナビ創業→UXSEOリリース、ResizeCDNリリース、あまてむリリース。世界で最もSEOに効くCMS Basicリリース。個人の夢は完全義体化。会社の夢は宇宙事業。プログラマーは死ぬまで現役でありたい