【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インストールで飛んでサクッとインストールできます。
- PHPライブラリ「PdfParser」を利用してPDFをテキスト化
- PHPライブラリ「PdfParser」とは
- Composer(コンポーサー)インストール
- Composerをどこでも使えるようにする
- PHPライブラリ「PdfParser」インストール
- PHPライブラリ「PdfParser」を利用してPDFをテキスト化するサンプルコード
- Pythonライブラリ「PDFMiner.six」を利用してPDFをテキスト化
- CentOS 8でPython 3.8以上をインストールする
- PDFMiner.sixのインストール
- 「PDFMiner.six」が正常にインストールされたかの確認
- ちなみにインタラクティブシェル内から出る時は
- Pythonライブラリ「PDFMiner.six」を利用してPDFをテキスト化するサンプルコード
- ローカルのファイルではなくURLのPDFをテキスト化するサンプルコード
- PHPからPythonを実行して「PDFMiner.six」を通してPDFのテキスト化を行いデータをPHPで受け取る方法
- まとめ
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にて導入 |
pypdf | PyPDF2からバトンタッチしたライブラリ。テキストを抽出する、画像を抽出する、PDFファイルの結合や分割処理が可能 | 日本語に対応、pip/Githubにて導入 |
PyPDF2 | 画像を抽出する、PDFファイルの結合や分割処理が可能 | 日本語に非対応、pip/Githubにて導入 |
PyTesseract | OCR(光学文字認識)技術として画像からテキストを抽出する | 日本語に対応、pip,Githubにて導入 |
ReportLab | PDFを新規作成する(テキスト・図表・グラフ) | 高性能のライブラリ、pipにて導入 |
ですが、今回はテキストを抽出するだけが目的ですので「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」を試せませんでしたのでお時間ある際に、別記事で試してみます。
ではまたー。
- 完全無料Basicはオープンソースで運営されています。誰しもが自由にBasicを利用できます。
- 超軽量化で超高速配信通常のCMSよりページ容量を70%以上を自動で圧縮を行い更に自動で静的化・圧縮化されたページが配信されます。
- SEOにつよつよ70%以上軽量化に加えて最新SEOに対応した構造で静的化・圧縮化されたページはライバルサイトより圧倒的に評価されます
ライバルサイトより一歩前にいけるCMSでサイトを構築しませんか?