##はじめに
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にしか対応していません。という事で、pikepdfというライブラリを使います。Documantationを読む限り、qpdfのラッパーです。
※既知のパスワードのロックを解除するコード例です
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ファイルとして出力しています。
とてもシンプルに書けますね。
ちなみに、Windows32bit環境で動作する実行ファイルを作ってあります。
[GitHub - Kanahiro/PdfUnlocker]
(https://github.com/Kanahiro/PDFUnlocker)
##終わりに
以上、実装したい処理別にライブラリを紹介しました。
他には、PDFファイルからのデータマイニング(OCR機能を用いてPDFファイルからテキストデータへの変換)なんかも需要があるようです。
今後紹介できればと考えています。
さて本記事は結局、PDFを○○したいときにはどのライブラリを使うべきか、という記事になっております。
先人が、「こういう機能があれば便利」と思って書いてくれたライブラリ、活用しない手はありません。
でもいつかはそういったライブラリを提供する側に回りたいなと思うこの頃です。