Pythonでは外部ライブラリを使用することで、PDF操作を自動化することができます。
ここではPDF操作用ライブラリの一つであるPyMuPDFの使い方について解説します。
ライブラリのインストール
インストール:必要
ライブラリを利用するには、pip
コマンドでPyPDF2
ライブラリをインストールします。
・関連記事:Pythonライブラリのインストール(pipの使い方)
Successfully installed ・・・・と表示されればインストールは成功です。(依存関係のある他のライブラリも同時にインストールされます。)
ライブラリのインポート
PyMuPDFライブラリを使用するには、fitzをインポートします。
1 | import fitz |
ライブラリ名と違いますが、歴史的な理由によりこのように呼び出します。
PDFファイルを開く
ファイルを開くにはopen()
メソッドを使用します。引数はファイルパスを指定します。
サンプルとして統計局の『高等学校における「情報II」のためのデータサイエンス・データ解析入門』の第1章テキストを使用します。(ファイル名は sample.pdf に変更)
例としてsampel.pdf
を開きます。
1 | doc = fitz.open('sample.pdf') |
doc
にdocumentオブジェクトが格納されます。
PDFファイルを保存する
PDFファイルを保存するには、save()
メソッドを使用します。引数は保存するファイルパスを指定します。
読み込んだ doc
オブジェクトをsample2.pdfとして保存します。
1 | doc.save('sample2.pdf') |
PDFファイルを上書き保存する
編集したPDFファイルを上書き保存するには、saveIncr()
メソッドを使用します。引数は不要です。
documentオブジェクト doc
を上書き保存します。
1 | doc.saveIncr() |
ページ数を取得する
PDFファイルのページ数を取得するには、Documentオブジェクトのpage_count
プロパティを指定します。
1 2 3 4 | page_count = doc.page_count print(page_count) # 23 |
PDFのしおり(目次)情報を取得する
PDFファイルのしおりを取得するには、get_toc()
メソッドを使用します。
出力される形式は以下のようになります。レベルは階層を表しています。
サンプルとして統計局の『高等学校における「情報II」のためのデータサイエンス・データ解析入門』の第1章テキストのしおりを取得してみます。
1 | doc.get_toc() |
[2, ‘はじめに(社会における変化)’, 1],
[2, ‘機械学習とデータ×AIの関係性’, 3],
[2, ‘データとはなにか’, 13],
[2, ‘AIの根幹となる技術・機械学習とは’, 19],
[2, ‘AI最新技術の活用例’, 22]]
ページを削除する
単一のページを削除する場合はdelete_page()
メソッドを使用します。引数はページ番号です。このページ番号は1ページ目が0で、ページ数-1の数字になるので注意してください。
5ページ目を削除する場合は以下のようになります。
1 2 3 4 | doc.delete_page(4) print(doc.page_count) # 22 |
複数ページを削除する場合は、delete_pages()
メソッドを使用します。
もしくは
Documentオブジェクト.delete_pages(from_page=開始ページ番号, to_page=終了ページ番号)
1ページ目から5ページ目までを削除する場合は以下のようになります。
1 | doc.delete_pages(0, 4) |
以下でも同じ結果となります。
1 | doc.delete_pages(from_page=0, to_page=4) |
ファイルを結合する
ファイルを結合するには、ファイルを挿入するinsert_pdf()
メソッドを使用します。引数は結合したいドキュメントオブジェクトを指定すると、結合先のファイルの後ろに追加されます。
doc1の後ろにdoc2を結合(追加)します。
1 | doc1.insert_pdf(doc2) |
挿入するページの範囲、挿入位置を指定することもできます。
挿入するDocumentオブジェクト,
from_page =コピーしたいページの開始ページ番号,
to_page =コピーしたいページの終了ページ番号,
start_at =コピーを挿入するページ番号
)
1 2 3 4 5 | doc1.insert_pdf( doc2, from_page=4, to_page=10, start_at=5 ) |
ファイルを分割する
ファイルを分割するには、空のファイルに必要なページをコピーして別ファイルとして保存します。
ページをコピーするには insert_pdf()
メソッドを使用します。
次の例は、「sample.pdf」の初め5ページと最後5ページを「split1.pdf」それ以外の部分を「split2.pdf」に分割して保存するプログラムです。
1 2 3 4 5 6 7 8 9 10 | doc1 = fitz.open('sample.pdf') doc2 = fitz.open() # 空のPDF doc3 = fitz.open() doc2.insert_pdf(doc1, to_page=4) # doc1の初め5ページ doc2.insert_pdf(doc1, from_page=len(doc1)-5) # doc1の最後5ページ doc2.save("split1.pdf") doc3.insert_pdf(doc1, from_page=5, to_page=len(doc1)-6) #doc1の6ページから最後6ページ目まで doc3.save("split2.pdf") |
テキストデータを取得する
指定したページのテキストデータを取得するには、get_page_text()
もしくは get_text()
を使用します。
もしくは
Documentオブジェクト[ページ番号].get_text()
1ページ目のテキストを取得します。
1 2 3 4 5 6 7 | text = doc.get_page_text(0) print(text) # 第 1 章 # データサイエンス(機械学習のアルゴリズム)による # データ解析が社会にもたらす変化 ・・・ |
以下でも同じ結果になります。
1 | text = doc[0].get_text() |
全ページのテキストデータを取得する方法は以下の記事を御覧ください。
・参考記事:PythonでPDFのテキストを抽出する(PyMuPDF)
画像データを取得する
画像データを取得するためには、get_page_images()
もしくはget_images()
メソッドで画像情報のリストを取得してから、リスト内の画像オブジェクト番号を元にextract_image()
メソッドで画像データを抽出する必要があります。
もしくは
Documentオブジェクト[ページ番号].get_images()
sample.pdf から1番目の画像を抽出してimage.png として保存するプログラムは以下になります。
1 2 3 4 5 6 7 8 9 10 | doc = fitz.open('sample.pdf') # 1ページ目の画像情報を取得 images = doc[0].get_images() # 1番目の画像オブジェクト番号を取得 xref = images[0][0] # 画像データを抽出 d = doc.extract_image(xref) # 画像を保存 img = open(f"image.{d['ext']}", "wb") img.write(d["image"]) |
詳細はこちらの記事で解説していますので参考にしてみてください。
・参考記事:PythonでPDFファイルの画像を抽出する(PyMuPDF)
PyMuPDFの基本的な使い方を解説しました。