PDFファイルの操作をPythonで自動化する方法を紹介します。
PythonでPDFファイルを操作するためのモジュールはいくつかありますが、今回は最も使い方が簡単(多分)なPyMuPDFの使い方を紹介します。
PyMuPDFは、PDFファイルの修正や結合、文章や画像の抜き出しなど基本的な操作が一通りできます。
PDF操作を自動化したいシーンは少ないかもしれませんが、いつか役に立つかもしれません。
PyMuPDFのインストールとインポート
インストール
PymMuPDFはpip経由でインストールします。
pip install PyMuPDF
PyMuPDFのインポート
PyMuPDFを使うためにライブラリをインポートしますが、ライブラリの名前はPyMuPDFではなく、fitzに変わります。
import fitz
Anacondaで環境構築をしている人はconda経由でインストールしたほうが良いかもしれませんが、私の場合、conda経由でインストールすることはできませんでした(理由は不明)。
PyMuPDFの基本的な使い方
PDFファイルに関する操作を自動化するために、必要な操作を覚えましょう。
PyMuPDFでPDFを開いてページにアクセスする、テキストを取得するといった超基本的な使い方を解説します。キーワード検索や画像の取得などは別の機会に紹介します。
PyMuPDFでPDFファイルを開く
PDFファイルをPyMuPDFで開くには、open()を使います。引数にはファイルのパス(場所)を渡すだけです。もし引数に何も指定しないと、新しいPDFを作成するという意味になります。
変数 = fitz.open(ファイルパス)
変数には、fitzのDocumentオブジェクトが格納されます。
PDFファイルを開いたら、Documentオブジェクトのclose()を使って閉じましょう。なお、ファイルを開いている状態か確認するには、is_closedを使います
#PDFファイル名を指定
filename = "test.pdf"
#PDFファイルを開く
file = fitz.open(filename)
print(file.is_closed)
#=>False
file.close()
print(file.is_closed)
#=>True
close()を忘れてしまうよ!という方は、以下のようにしてPDFファイルを開くといいでしょう。Pythonのopenと同じお作法です。
with fiz.open(filename) as f:
#処理を行う
print(f)
PDFファイルのページ数を調べる
ページ数をカウントするには、Documentオブジェクトのpage_countを使います。
Documentオブジェクト.page_count
num_pages = file.page_count
PDFファイルのしおり(目次)を取得する
PDFファイルにしおり(目次)が設定されている場合は、get_toc()を使うことで目次を取得することができます。
Documentオブジェクト.get_toc()
file.get_toc()
例えば、無料で配布されているProGitマニュアルのPDFファイルから目次を取得したとしましょう。そうすると以下のような形式で表示されるはずです。
[[1, 'Cover', 1], [1, 'Scott Chaconによる序文', 3], [1, 'Ben Straubによる序文', 5], [1, '謝辞', 7], [1, 'コントリビューターの皆さん', 9], [1, '前書き', 13], [1, 'Table of Contents', 17], [1, 'Chapter 1. 使い始める', 29], [2, 'バージョン管理に関して', 29], [3, 'ローカル・バージョン管理システム', 30], [3, '集中バージョン管理システム', 31], [3, '分散バージョン管理システム', 32], [2, 'Git略史', 34], [2, 'Gitの基本', 34],...
目次に表示される形式は以下の通りです。
[レベル, 見出しの名称, ページ番号]
レベルは階層を表しており、1は1階層目、2ならば2階層を表しています。論文のように章・節で表すと、1が章、2が節に対応します。
ページ番号は見出しがあるページを示しています。
ページにアクセスしてテキストを取得する
●特定のページにアクセス
ページにアクセスしたいときは、load_page()を使い引数にページ番号を指定します。ページ番号は0始まりであることに注意してください。
変数 = Documentオブジェクト.load_page(ページ番号)
load_page()を使うと、変数にはPageオブジェクトが格納されます。
テキストを取得するには、DocumentオブジェクトgetPageText()を使うか、のpageオブジェクトのget_text()を使います。
Documentオブジェクト.getPageText(ページ番号, output="text")
outputは省略可能です。また、outputにはhtml、json、xmlを設定することが可能です。
Pageオブジェクト.get_text(output="text")
#5ページ目にアクセスする
page =file.load_page(4)
#または、以下のようにしても良い
page = file[4]
#5ページ目のテキストを取得する
text = page.get_text()
print(text)
また、ページにアクセスするためには、file[4]のようにDocumentオブジェクトに直接ページ番号を指定してもOK です。
● すべてのページにアクセス
すべてのページに対して何らかの処理を行いたい場合は、繰り返し処理(for文)を使います
for page in pdf_file:
print(page.number)
#=>0
#=>1
#=>2