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サイズの幅の半分から始まり、全幅までの範囲です。
ここまでのコードをまとめると、コード全体は以下のようになります。
ここから先は
¥ 120
この記事が気に入ったらチップで応援してみませんか?