✍️

pdfrw でページのサイズを取得できないときの備忘録

2021/10/01に公開

https://github.com/pmaupin/pdfrw

pdfrw を使うことで Python から PDF を操作するのがとても楽になりました。
とはいえハマりポイントが無いわけでもなかったので個人的な備忘録です。今回はページサイズの取得編。

ページサイズを取得できない問題

pdfrw では MediaBox プロパティを使ってページのサイズをリスト形式で取得できるのですが、PDF によっては以下のような理由からエラーを吐くことがあるようです。

変数の型の問題

MediaBox の戻り値は文字列型です。足したり引いたりの計算をするには数値型に変換してやる必要があります。

データ構造の問題

公式 によると、PDF は階層構造を持っていて、特に MediaBoxRotate は上位構造の値を引き継いでいることが多いそうです(一番外側の要素についてサイズを指定し、その中の要素はすべて外周のサイズに準拠する場合など)。

そうした場合に、値が直接設定されていない要素から依存先の要素にアクセスするために 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