見出し画像

Pythonで単一ページPDFを、2in1のPDF(2枚/ページ)として出力する方法(GoogleColab)

Pythonで単一ページPDFを、2in1のPDF(2枚/ページ)として出力するコードの実装ステップ

①PyMuPDFのインストールとインポート

!pip install pymupdf:
Google Colabや他のPython環境にPyMuPDFライブラリをインストールします。PyMuPDFはPDFファイルを操作するためのライブラリです。

import fitz:
PyMuPDFライブラリをインポートし、その機能を利用可能にします。PyMuPDFは内部的に fitz という名前を使用しています。

②関数の定義

def create_side_by_side_pdf(input_pdf, output_pdf):
入力PDF (input_pdf) と出力PDF (output_pdf) のファイル名を引数として受け取り、処理を行います。

③サイズの定義

完成サイズを定義します。今回は完成をB4横向きとします。
サイズの幅と高さはポイント単位(1ポイント = 1/72インチ)で定義します。

④入力PDFの読み込み

doc = fitz.open(input_pdf):
入力されたPDFファイルを読み込み、操作できるようにします。

⑤新しいPDFドキュメントの作成

new_doc = fitz.open():
編集するための新しい空のPDFドキュメントを作成します。

⑥ページ処理のループ

for page_num in range(0, len(doc), 2):
元のPDFの各ページを2ページずつ処理するためのループを開始します。

⑦新しいB4ページの作成

new_page = new_doc.new_page(width=width_pt, height=height_pt):
B4サイズの新しいページを作成します。

⑧ページの配置とサイズ調整

左側のページの配置
元のPDFの現在のページを取得し、新しいB4ページの左半分に配置します。必要に応じてページのサイズを調整します。

右側のページの配置
もし次のページが存在すれば、それを新しいB4ページの右半分に配置します。こちらもサイズの調整を行います。

⑨新しいPDFファイルの保存とクローズ

new_doc.save(output_pdf):
編集した内容を含む新しいPDFファイルを保存します。
new_doc.close()doc.close():
新しいドキュメントと元のドキュメントを閉じます。

⑩関数の実行

create_side_by_side_pdf('input.pdf', 'output.pdf'):
この関数を呼び出して、指定された入力PDFから新しいPDFを作成します。


コード各部の解説

ループ処理 - 各ページの処理

for page_num in range(0, len(doc), 2):
    # B4サイズの新しいページを作成
    new_page = new_doc.new_page(width=width_pt, height=height_pt)

このブロックでは、元のPDF文書の各ページに対してループを行っています。ループは2ページごとに進むため、page_numは0から始まり、文書の長さ(len(doc))まで2ページ毎に増加させます。各ループで、新しいB4サイズのページ(new_page)を作成します。

左側のページの配置

# 元のページのサイズを取得
original_rect = doc[page_num].rect
# 左半分のサイズを計算(B4の幅の半分、高さはそのまま)
left_rect = fitz.Rect(0, 0, width_pt / 2, height_pt)
# 左半分の領域に現在のページを縮小して配置
new_page.show_pdf_page(left_rect, doc, page_num, clip=original_rect)

この部分では、元のPDFの現在のページのサイズ(original_rect)を取得し、新しいB4サイズのページの左半分に配置します。
左半分の領域(left_rect)は、B4サイズの幅の半分で、高さはそのままです。
show_pdf_pageメソッドを使って、この領域に現在のページを縮小して配置します。

右側のページの配置(存在する場合)

# 右側のページ(もしあれば)を処理
if page_num + 1 < len(doc):
    # 右半分のサイズを計算
    right_rect = fitz.Rect(width_pt / 2, 0, width_pt, height_pt)
    # 右半分の領域に次のページを縮小して配置
    new_page.show_pdf_page(right_rect, doc, page_num + 1, clip=original_rect)

このブロックでは、次のページ(page_num + 1)が文書に存在するかどうかを確認します。奇数ページの場合に最後の処理で右ページは存在しないことになります。
存在する場合(=奇数ページで最後の処理以外)、右半分の領域(right_rect)を計算し、この領域に次のページを縮小して配置します。右半分の領域は、B4サイズの幅の半分から始まり、全幅までの範囲です。


ここまでのコードをまとめると、コード全体は以下のようになります。

ここから先は

1,275字

¥ 120

この記事が気に入ったらサポートをしてみませんか?