Labo288

プログラミングのこと、GISのこと、パソコンのこと、趣味のこと

PythonのPDF処理まとめ(結合・分割, 画像変換, パスワード解除)


はじめに

PythonでPDFを扱う方法を目的別にまとめます。
シンプルなファイル読み書き、画像への変換やパスワードロック解除等について記載します。

PDFファイル読み書き

基本的な読み書きについてはPyPDF2というライブラリを使う事で実装可能です。

pip install PyPDF2

以下は、複数のPDFファイルをひとつのPDFに結合する関数の参考例です。

def integratePdf(fileList):
	merger = PyPDF2.PdfFileMerger()
	for file in fileList:
		merger.append(file)
	OUTPUT_DIR = os.path.dirname(fileList[0])
	merger.write(OUTPUT_DIR + '/output.pdf')
	merger.close()

mergerでPyPDF2のPdfFileMergerクラスのインスタンスを生成し、そこにPDFファイルのパスを渡しています。
merger.write()関数により結合後のPDFファイルを出力します。
もし特定のページを追加したいのであれば以下のとおり書けば良いです。

merger.append(file, pages=(0,2))

この場合、1ページ目から3ページ目までを、mergerに追加しています。

PDF同士の結合のパターンを紹介しましたが、シンプルなRead&Writeにも対応しています。
しかしながら、PDFをPDFのまま扱う場合の処理というのは、結合・分割にほぼ限られるのかな、と思います。

画像への変換

pdf2imageというライブラリで非常にシンプルに書けます。
※pillowとpopplerというライブラリに依存

pip install pdf2image
pip install pillow
pip install poppler

これでインストールして

from pdf2image import convert_from_path

でライブラリをインポートし

imgs = convert_from_path(pdf_filepath)
for img in imgs:
	img.save('output.png','png')

例えばこんな感じで、pngファイルとして保存する事ができます。非常にかんたん。

パスワードロックの解除

以下の記事でも解説したとおり、最もポピュラーなPyPDF2では近年作成されたPDFのパスワード解除には対応出来ません。

www.labo288.site

ということでpikepdfというライブラリを使います。
github.com

pip install pikepdf
from pikepdf import Pdf

でPdfクラスをインポート

以下は「(パスワードの文字列).pdf」を読み込んで、パスワードロックを解除した別ファイル「decrypted.pdf」として保存する関数の参考例です。

def unlockPdf(filepath):
	PSWD = os.path.basename(filepath)[0:-4]
	pdffile = Pdf.open(filepath, password=PSWD)
	newPdf = Pdf.new()
	newPdf.pages.extend(pdffile.pages)
	OUTPUT_DIR = os.path.dirname(filepath)
	newPdf.save(OUTPUT_DIR + '/decrypted.pdf')

パスワードは既知である必要があります(パスワードのわからないPDFファイルのロックを解除するものではない)。

pdffile = Pdf.open(filepath, password=PSWD)

この行で、パスワードが必要なPDFを、そのパスワードを用いて読み込んでいます。
そして以下の行で新たなPDFファイルとして出力しています。
とてもシンプルに書けますね。

終わりに

以上、実装したい処理別にライブラリを紹介しました。
他には、PDFファイルからのデータマイニング(OCR機能を用いてPDFファイルからテキストデータへの変換)なんかも需要があるようです。
今後紹介できればと考えています。
さて本記事は結局、PDFを○○したいときにはどのライブラリを使うべきか、という記事になっております。
先人が、「こういう機能があれば便利」と思って書いてくれたライブラリ、活用しない手はありません。
でもいつかはそういったライブラリを提供する側に回りたいなと思うこの頃です。