【Python】PDF全ページのサイズ統一&向きを揃えるコード【ChatGPT】

本ブログはアフィリエイト広告を利用しています

WEB / アプリ
WEB / アプリ
この記事は約8分で読めます。

とっちゃん@nyanco! です。

今回はWindows10で動作する「PDFファイルをA4サイズ縦に統一し、横長のページを左回転させるpythonコード」をChatGPTに書いてもらったよというお話です。

肉玉にゃんこ

ドラッグ&ドロップ対応で便利ですにゃ~
揃えるサイズはカスタム可能ですにゃ~

スポンサーリンク

ChatGPTにコードを書いてもらった感想

まずはじめに、本記事で紹介するpythonコードはChatGPTに書いてもらったものを自分で少しカスタマイズしたものとなります。

肉玉にゃんこ

ChatGPTとかなりの回数やり取りしましたにゃ~
生身の人間相手なら「いい加減にしろ」と確実にブチ切れられるほどですにゃ~

→参考記事:【OpenAI】チャット型高性能AI「ChatGPT」を調べて登録してみたよ

やり取りの回数が多いのは筆者のpythonレベルが低いのが大きな要因で間違いないのですが、書き出されたものをそのまま試すと結構エラーが出まくるんですよね。。

ChatGPTの今後の進化でエラーは減ってくると思いますが、実際に動くコードを書いてもらうにはまだまだトライ&エラーができるスキルが必須かなといった感じです。

特に今回のコードでは、「A4」サイズに書き出して欲しいのになぜかやたら小さいサイズ(74.1*104.8mm)になってしまい、何度かやり取りするもそこは解決できず、無理矢理A4サイズの数値に合わせたという若干スマートでない形となってます。

肉玉にゃんこ

「よくわからんが、まぁ動いているからヨシ!」精神ですにゃ~

なので使用に当たってはくれぐれも自己責任かつ書き出された内容の確認も忘れずにお願いいたします。

【追記】
サイズ指示は「mm」ではなく「ポイント」で処理されることが分かりました!
・A4 210mm ✕ 297mm → 595pt ✕ 842pt
・A3 297mm ✕ 420mm → 842pt ✕ 1190pt
※小数点以下は四捨五入
【便利サイト】ミリメートルからポイントへの変換

動作環境

  • OS:Windows10
  • Pythonバージョン:Python 3.11.2(64 bit)
  • 必要ライブラリ:PyPDF2

「Python」の導入については下記記事をどうぞ!

動作内容

インプットしたPDFファイルに対して下記処理をします。

  • PDFに含まれる全ページのサイズ(寸法)をA4縦(横210mm×縦297mm)に揃える
  • 横長のページが含まれる場合は左回転させる
肉玉にゃんこ

サイズや回転方向や角度は数値で設定できるので簡単にカスタマイズできますにゃ〜

PDFをA4縦に変換し横長ページを左回転させるコード

【オススメ】ドラッグ&ドロップ対応バージョン

.pyファイルにPDFをドラッグ&ドロップするだけで上記処理をして、ファイル名の末尾に「_A4」を付加した別ファイルを書き出すコードです。

import sys
import os
import PyPDF2

# A4サイズ 210*297 をポイントに変換(小数点はエラーになるので四捨五入)
a4_width_mm = 595
a4_height_mm = 842

# ドロップされたPDFファイルを処理する関数
def process_pdf_file(input_file):
    # 変換後のPDFファイル名
    output_file = os.path.splitext(input_file)[0] + '_A4.pdf'

    # PDFファイルを読み込む
    with open(input_file, 'rb') as f:
        pdf_reader = PyPDF2.PdfFileReader(f)
        pdf_writer = PyPDF2.PdfFileWriter()
        # 全ページを処理する
        for i in range(pdf_reader.getNumPages()):
            page = pdf_reader.getPage(i)
            # 1ページ目のサイズを取得
            width = page.mediaBox.getWidth()
            height = page.mediaBox.getHeight()
            # 横長のページを左回転させる
            if width > height:
                page.rotateCounterClockwise(90)
                width, height = height, width
            # A4サイズに変換するためのスケールを計算
            scale = min(float(a4_width_mm / width), float(a4_height_mm / height))
            # ページをA4サイズに変換
            page.scaleBy(scale)
            # 変換したページを新しいPDFファイルに追加
            pdf_writer.addPage(page)
        # 新しいPDFファイルを保存
        with open(output_file, 'wb') as f:
            pdf_writer.write(f)

    print(f'{input_file} を変換して {output_file} を作成しました。')

# ドロップされたPDFファイルを処理する
if len(sys.argv) > 1:
    for input_file in sys.argv[1:]:
        if os.path.isfile(input_file) and os.path.splitext(input_file)[1].lower() == '.pdf':
            process_pdf_file(input_file)
        else:
            print(f'{input_file} はPDFファイルではありません。')
else:
    print('PDFファイルをドラッグ&ドロップしてください。')

補足

5〜8行目で変換サイズの縦横の寸法を定義しています。

冒頭でも述べたように、なぜか本来のA4サイズである縦297・横210mmだとやたら小さいサイズになってしまうので、そこから無理くりA4サイズになるように計算しているのが現状です。

また、27行目の「page.rotateCounterClockwise(90)」で左回転を設定しているので、右回転にしたい場合は(90)を(-90)に変更したらOKです。

同ディレクトリ内の任意のPDFに対して処理バージョン

.pyファイルと同じフォルダにある「input.pdf」というファイル名に対して処理をし、同じフォルダに「output.pdf」に書き出すコードです。

import PyPDF2

# 変換前のPDFファイル名
input_file = 'input.pdf'
# 変換後のPDFファイル名
output_file = 'output.pdf'

# A4サイズ 210*297 をポイントに変換(小数点はエラーになるので四捨五入)
a4_width_mm = 595
a4_height_mm = 842

# PDFファイルを読み込む
with open(input_file, 'rb') as f:
    pdf_reader = PyPDF2.PdfFileReader(f)
    pdf_writer = PyPDF2.PdfFileWriter()
    # 全ページを処理する
    for i in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(i)
        # 1ページ目のサイズを取得
        width = page.mediaBox.getWidth()
        height = page.mediaBox.getHeight()
        # 横長のページを左回転させる
        if width > height:
            page.rotateCounterClockwise(90)
            width, height = height, width
        # A4サイズに変換するためのスケールを計算
        scale = min(float(a4_width_mm / width), float(a4_height_mm / height))
        # ページをA4サイズに変換
        page.scaleBy(scale)
        # 変換したページを新しいPDFファイルに追加
        pdf_writer.addPage(page)
    # 新しいPDFファイルを保存
    with open(output_file, 'wb') as f:
        pdf_writer.write(f)

補足

3〜6行目で変換前後のPDFファイル名を定義しています。ファイル名の前にファイルパスを記述すると場所も指定できます。

肉玉にゃんこ

相対パスでも絶対パスでもOKですにゃ〜

寸法と回転に関しては前項と同様にカスタマイズできます。

おわりに

ChatGPTが書いてくれるコードは完璧でこそないものの、スクリプト初心者でも実際に使えるコードを短時間で作成できたのは紛れもなくChatGPTのおかげです。

肉玉にゃんこ

今まで一人では無理だと諦めていた多くのことが、ChatGPTをうまく使えば限界突破できそう気がしますにゃ〜

本記事がどなたかの参考になれば幸いです。

今回は以上となります。
最後まで読んでいただきましてありがとうございました!
それではまた〜✧٩(ˊωˋ*)و✧

コメント

  1. こうき より:

    PythonでPDFを編集したくて検索していたらこちらのサイトにたどり着きました
    これ単位がミリではなくてポイントですね。