✍️
pdfrw でページのサイズを取得できないときの備忘録
pdfrw を使うことで Python から PDF を操作するのがとても楽になりました。
とはいえハマりポイントが無いわけでもなかったので個人的な備忘録です。今回はページサイズの取得編。
ページサイズを取得できない問題
pdfrw では MediaBox
プロパティを使ってページのサイズをリスト形式で取得できるのですが、PDF によっては以下のような理由からエラーを吐くことがあるようです。
変数の型の問題
MediaBox
の戻り値は文字列型です。足したり引いたりの計算をするには数値型に変換してやる必要があります。
データ構造の問題
公式 によると、PDF は階層構造を持っていて、特に MediaBox
や Rotate
は上位構造の値を引き継いでいることが多いそうです(一番外側の要素についてサイズを指定し、その中の要素はすべて外周のサイズに準拠する場合など)。
そうした場合に、値が直接設定されていない要素から依存先の要素にアクセスするために inheritable
というプロパティが用意されているとのこと。
解決策
def get_mediabox(page):
fs = []
mbox = page.MediaBox or page.inheritable.MediaBox
for m in mbox:
fs.append(float(m))
return fs
PdfReader(file_path).pages
で取得したページ情報のリストの各要素に対して、下記のように呼び出してやれば OK です。
import pdfrw
file_path = r"C:\Users\hogehoge.pdf"
pages = PdfReader(file_path).pages
for page in pages:
print(get_mediabox(page))
Discussion