
ピーター
pikepdfの結果はファイル保存しかできないのか?
pikepdfでパスワードを解除はできた。けどページの画像等を取得するできない。
一旦ファイルで出力すると考えましたが、ちょっとダサい。。。
もう少しいい感じの方法がないのか?と困ったので、備忘録メモです。
pikepdfとPyPDF2は保持するデータ形式が異なる
pikepdfとPyPDF2は保持しているデータ形式が異なります。そのため、pikepdfでせっかく解除したPDFデータをそのまま、ページの画像取得などの処理に利用することができない問題があります。
そのため、データ形式を変える必要があります
- pikepdfでパスワード解除したPDFをファイル保存し、その保存したファイルをPyPDF2で読み込む
- pikepidfでパスワード解除したPDFを中間データを保持し、中間データをPyPDF2で読み込む
1の方法はSSD/HDDの容量に制限がない場合や、シンプルでわかりやすいと思います。しかし、容量制限だったり、中間ファイルの出力ができない状況もあります。その場合には2の方法を試す必要があります。
BytesIOを使うことでバイナリ保存可能になる
Pythonの場合、BytesIOを使うことで、文字列等ではないバイナリ形式でデータを取り扱うことができます。
バイナリ形式のオブジェクトを用意し、格納/呼び出しをすることで、ファイル出力せずにデータのやり取りをすることが可能となります!
サンプルコード
今回紹介するサンプルコードでは、以下の流れでPDFのページ数を表示するサンプルを紹介します
- pikepdfでsample.pdfを読み込む
- bytesオブジェクト生成する
- 1で読み込んだPDFデータをバイナリ形式で保存する
- PyPDF2でバイナリ形式で保存したPDFファイルを読み込む
- ページ数を取得する
import pikepdf
import io
from PyPDF2 import PdfFileReader
pdf = pikepdf.open("sample.pdf")
byte_mem = io.BytesIO()
pdf.save(byte_mem) ### PDFデータをバイナリで保存する
pdf2 = PdfFileReader(byte_mem) ### バイナリで保存したPDFを読み込む
print(pdf2.getNumPages())
過去に紹介した記事
pikepdfを使ってパスワードを解除して読み込む方法について紹介しました。
まとめ
中間データをファイル出力しないで方法の一つに、バイナリ形式で保存する方法があります。
他の場合でも応用できるので、ぜひ活用してみてください!
コメント