9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

異なるサイズ(A4・A3)と角度を持ったPDFをA3サイズのPDFに2アップしよう

Last updated at Posted at 2023-03-12

やりたいこと

2つの異なるページサイズ(A3とA4)を持ち、ページの向きも縦横混在するPDFを処理して、A4用紙が2アップされたA3用紙を作成します。

処理対象であるPDFの各ページのサイズと向きによって、処理を変えます。
処理は以下の通りです。

  • A4タテの場合:A4サイズで貼り付ける。
  • A4ヨコの場合:反時計回りに90度回転し、A4サイズで貼り付ける。
  • A3タテの場合:反時計回りに90度回転し、追加する。
  • A3ヨコの場合:無処理で追加する。

作成していた基本A4サイズの資料をA3サイズにとりまとめる必要があったので、下記コードを作成しました。

苦労した点

A4用紙を回転させつつ、A3用紙に貼り付ける方法が難しかったです。

.rotateCounterClockwise(90) で回転させたA4用紙を、そのまま.mergeTranslatedPage()でA3用紙に貼り付けられたら簡単だったのですが、回転が反映されませんでした。

最終的には.mergeRotatedTranslatedPage()の引数に回転角度と位置を指定することで上手くいきました。

プログラム

qiita.python
import PyPDF2
from PyPDF2 import PdfFileReader, PdfFileWriter
from pathlib import Path

input_file = "input.pdf"
ouput_file = input_file.replace(".pdf", "_2up.pdf")

# 入力PDFファイルを開く
reader = PdfFileReader(input_file)
# 出力PDFファイルを開く
output_pdf = PdfFileWriter()

# ページサイズを取得し、ページの向きを把握する(A3用紙なら回転させる)。
def organaize_page_rotate(page):
    page_width, page_height = page.mediaBox.getWidth(), page.mediaBox.getHeight()
    rotated_angle = 0
    # A3用紙の場合
    if (page_width > 1000) or  (page_height > 1000):
        page_size = "A3"
        if page_width < page_height:
            page = page.rotateCounterClockwise(90)
            rotated_angle = 90
    # A4用紙の場合
    else:
        page_size = "A4"
        if page_width > page_height:
            rotated_angle = 90
    return page, page_size, rotated_angle

# A3用紙にA4用紙を貼り付ける。左右の位置と、回転の有無で処理を変える。
def rotated_and_add_page(a3_page, page, tx, rotated_angle):
    # 回転が必要ない場合
    if rotated_angle == 0:
        a3_page.mergeTranslatedPage(page, tx=tx, ty=0)
    # 左側で回転が必要な場合
    elif tx == 0:
        a3_page.mergeRotatedTranslatedPage(page, tx=595.32/2, ty=595.32/2, rotation=rotated_angle)
    # 右側で回転が必要な場合
    else:
        a3_page.mergeRotatedTranslatedPage(page, tx=tx, ty=595.32, rotation=rotated_angle)

# 各ページを処理する
old_right_page_num = -1
for page_num in range(reader.getNumPages()):
    # A3用紙の右側へ既に追加していればスキップする
    if page_num == old_right_page_num:
        continue
    page = reader.getPage(page_num)
    page, page_size, rotated_angle = organaize_page_rotate(page)  

    # A3用紙の場合
    if page_size == "A3":
        output_pdf.addPage(page)

    # A4用紙の場合
    else:
        # A3用紙に2アップでページを貼り付ける
        a3_page = PyPDF2.pdf.PageObject.createBlankPage(None, 1190.52, 841.92)
        rotated_and_add_page(a3_page, page, tx=0, rotated_angle=rotated_angle)

        right_page_num = page_num + 1
        if right_page_num < reader.getNumPages():
            print(right_page_num)
            right_page = reader.getPage(right_page_num)
            right_page, page_size, rotated_angle = organaize_page_rotate(right_page)

            # 右側に貼り付けたい次のページがA3用紙の場合は処理をスキップする
            if page_size == "A3":
                pass
            # 右側に貼り付けたい次のページがA4用紙ならそのまま張り付ける
            else:
                rotated_and_add_page(a3_page, right_page, tx=595.32, rotated_angle=rotated_angle)
                old_right_page_num = right_page_num

        output_pdf.addPage(a3_page)

# 出力PDFファイルに保存する
with open(ouput_file, 'wb') as f:
    output_pdf.write(f)

print("Completed")
9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?