PDFファイルのページサイズを調べる/横長のページを左右に分割し、それぞれ別のPDFに保存(python)

■PDFファイルのページサイズを調べる(python)

#get-pdf-page-sizes.py
import fitz  # PyMuPDFをインポート

def get_pdf_page_sizes(pdf_path):
    doc = fitz.open(pdf_path)  # PDFを開く
    for page_number, page in enumerate(doc, start=1):
        rect = page.rect  # ページの矩形サイズ
        print(f"ページ {page_number}: 幅={rect.width} ポイント, 高さ={rect.height} ポイント")

# 使用例
get_pdf_page_sizes("sample.pdf")

>python pdf_page_sizes.py
ページ 1: 幅=842.0 ポイント, 高さ=595.0 ポイント

842/72*2.54 = 29.7cm
595/72*2.54 = 21.1cm

・Adobe Acrobat /メニュー/文書のプロパティ/ページサイズ
からも知ることができる。297×210mm

・A4サイズの場合:
幅 ≈ 595.276 ポイント(約 8.27インチ)
高さ ≈ 841.890 ポイント(約 11.69インチ)

■以下のコードは、横長のページを左右に分割し、それぞれ別のPDFに保存します。

#split-pdf-vertically.py
import fitz  # PyMuPDFをインポート

def split_pdf_vertically(input_pdf, output_pdf_left, output_pdf_right):
    # 元のPDFを開く
    doc = fitz.open(input_pdf)
    # 左右分割用の新しいPDFを作成
    left_pages = fitz.open()
    right_pages = fitz.open()

    for page in doc:
        rect = page.rect  # ページ全体のサイズ
        width = rect.width  # 幅
        height = rect.height  # 高さ

        # 左半分の矩形領域
        left_rect = fitz.Rect(rect.x0, rect.y0, rect.x0 + width / 2, rect.y1)
        # 右半分の矩形領域
        right_rect = fitz.Rect(rect.x0 + width / 2, rect.y0, rect.x1, rect.y1)

        # 左半分を新しいページに追加
        left_page = left_pages.new_page(width=left_rect.width, height=left_rect.height)
        left_page.show_pdf_page(
            fitz.Rect(0, 0, left_rect.width, left_rect.height),
            doc,
            page.number - 1,
            clip=left_rect
        )

        # 右半分を新しいページに追加
        right_page = right_pages.new_page(width=right_rect.width, height=right_rect.height)
        right_page.show_pdf_page(
            fitz.Rect(0, 0, right_rect.width, right_rect.height),
            doc,
            page.number - 1,
            clip=right_rect
        )

    # 分割したPDFを保存
    left_pages.save(output_pdf_left)
    right_pages.save(output_pdf_right)

    print(f"分割完了!\n左半分PDF: {output_pdf_left}\n右半分PDF: {output_pdf_right}")

# 使用例
split_pdf_vertically("sample.pdf", "left_half.pdf", "right_half.pdf")

■ポイント
1 ページの矩形領域に基づいた分割:
幅が842ポイント、ページ全体を左右2分割(421ポイントずつ)しています。
左半分: fitz.Rect(0, 0, 421, 595)
右半分: fitz.Rect(421, 0, 842, 595)

2 正しい領域の切り取り:
clipパラメータを使用し、ページから指定した領域だけをクロップします。

3 実行後の期待結果
left_half.pdf: 元PDFの左半分(0~421ポイント)。
right_half.pdf: 元PDFの右半分(421~842ポイント)。

■横長のpdfファイルを分割することでA4用紙に印刷できました。