【初心者歓迎】PDF結合ツールを作ろう

今回の自作ツールは、「PDF結合ツール」です。PyPDF2というライブラリを使うことで、PDFを簡単に結合できます。「【初心者歓迎】PDF分割ツールを作ろう」ではPDFをページ単位で分割しましたが、本記事のツールを使うことで再び1つのPDFに結合することができます。

もちろん、複数ページを持った異なるPDFを1つに結合することも可能です。

画面作成は「【CustomTkinter】テキスト記述でGUIを簡単作成するライブラリを紹介!」の記事で紹介した create_ui.py を使っており、PDF分割ツールとほとんど同じレイアウトになっています。

自作ツールを作るためのポイントと今後公開予定の自作ツール一覧を「【実践】Pythonで事務処理向け自作ツールを作ろう!」で紹介していますので、併せてご覧ください。

目次

PDF結合ツールの紹介

回紹介するPDF結合ツールは、指定したフォルダに置かれているPDFファイルをまとめて結合し、指定した出力ファイル名で書き出してくれます。

  • 指定したフォルダに置かれたPDFファイル(*.pdf)全てを1つのPDFファイルに結合します。
  • 結合時にページを回転(90度、180度、270度)させることが可能です。
  • 入力フォルダ、出力ファイル名に入力した内容は保持され、次回起動時に復元されます。

画面レイアウトと使い方

以下の4ステップでPDFファイルを結合することができます。

  • 入力フォルダ選択欄に、結合したいPDFファイルが保存されているフォルダを指定する
  • 出力フォルダ選択欄に、結合後のPDFファイルを保存したいフォルダを指定する
  • PDFを回転させたい場合、その角度を90度/180度/270度の中から選択する
  • PDF結合ボタンをクリックする

入力フォルダ選択欄に保存されているPDFファイルは、ファイル名で昇順にソートされてから結合されます。
任意の順番で並べ替えたい場合は、ファイル名に順番を指定する数値を付与してください。

実行結果

入力フォルダに保存されているPDFファイル(拡張子 .pdf)のみが結合れ、出力ファイルに保存されます。その際、ファイル名末尾に001~の連番が付与されます。

入力フォルダに保存されているPDFファイル一覧

res.txt
test.txt
スパースモデリングの基礎・実践_001.pdf
スパースモデリングの基礎・実践_002.pdf
スパースモデリングの基礎・実践_003.pdf
スパースモデリングの基礎・実践_004.pdf
スパースモデリングの基礎・実践_005.pdf
スパースモデリングの基礎・実践_006.pdf
生産データ.csv

結合されたPDFファイル

スパースモデリングの基礎・実践.pdf

※ファイル名を昇順ソートした順番で1つのPDFファイルに結合されます。

プログラムのダウンロードと動作環境の設定

STEP
Pythonのインストール

Pythonのインストールが必要です。既に構築済みの方は読み飛ばしてください。詳細は下記の個別記事をご覧ください。

自作ツールのためのポータブルPython開発・実行環境を作ろう!プログラム実行時に必要
WinPythonにVSCode Portable版を入れよう!プログラム修正時に必要
STEP
ライブラリのインストール

Python 環境に下記のライブラリをインストールします。 command.bat を実行後、下記のコマンドを実行します。

pip install PyPDF2
pip install customtkinter
pip install Pillow
pip install tkinterdnd2

STEP
ソースコードのダウンロードと展開

PDF結合ツールと共通パッケージの2つをダウンロードし、2つが同一階層のフォルダになるように解凍します。

実行方法

次の手順で実行してください。

  • WinPython のインストールフォルダ内にある command.bat を実行
  • ダウンロードしたプログラムファイルをコピーした場所にカレントディレクトリを移動
  • Python main.py を実行

Python main.py

しばらくすると下記の画面が表示されます。初回起動時は入力フォルダ選択欄、出力フォルダ選択欄、回転角度欄が空白で表示されますが、今回入力した値は次回起動時に画面に復元されます。

PDFファイルの結合中はコンソール画面に何も表示されませんので、結合が完了したかは出力フォルダを直接確認してください。

PDF結合ツールの設計

以下は、プログラム作成にあたっての検討事項です。PDFの切り抜きが目的の場合は、以下の内容は無視してください。

仕様

画面項目説明
入力フォルダ名結合したいPDFファイルが置かれたフォルダを指定。
拡張子 .PDFのファイルだけが結合される。
フォルダをドラッグ&ドロップで指定することも可能
出力ファイル名結合結果の出力ファイル名を指定。
回転角度PDFファイルを結合する際に回転させる角度を 90度/180度/270度から指定
PDF結合ボタンPDFの結合を実行

実現方法

  • 画面はCustomTkinter と CreateUI を使用
  • PDF結合は PyPDF2ライブラリを使用(詳細は PyPDF2公式ページ を参照)

プログラムの構成

main.py の中で画面の表示とPDF結合ボタンのイベント処理を記述しています。イベント処理の中で直接PDFの結合を行っても良かったのですが、処理を独立させた方が再利用性が高まるため、join_pdf.py で処理するようにしました。

モジュール名役割
main.py画面の表示とボタンクリックのイベント処理
join_pdf.pyPDFファイルの結合処理
create_ui.pyUI定義ファイルを読み込んで画面にウィジェットを表示
customtkinterファイル選択やフォルダ選択、ドラッグ&ドロップを実現するための補助
appconfig.py画面に入力された値をJson形式のファイルに保存/読込する

処理手順の簡易フロー

ソースコード

main.py

import os
import sys
sys.path.append(os.path.join(os.path. dirname(__file__), '../libs'))
from create_ui import CreateUI
import join_pdf as jp 

# ボタンが押された時の処理
def func(param):
    dir = param["input_folder"]
    # ディレクトリ内のすべてのPDFファイルを取得
    pdfs = [os.path.join(dir, file) for file in os.listdir(dir) if file.endswith(".pdf")]
    pdfs_sorted = sorted(pdfs)
    rotate = 0 if param["rotate_combo"] == "" else int(param["rotate_combo"]) 

    jp.join_pdf(pdfs_sorted,param["output_save"],rotate)


# インスタンス生成
ui = CreateUI(func)

# 画面の表示
ui.show()

join_pdf.py

import os
from PyPDF2 import PdfReader, PdfWriter

def join_pdf(pdf_paths, output_path, rotation_angle=0):
    """
    複数のPDFファイルを結合し、指定された角度でページを回転させて保存します。

    :param pdf_paths: 結合するPDFファイルのパスのリスト
    :param output_path: 結合後のPDFを保存するパス
    :param rotation_angle: ページを回転させる角度(度数法)。時計回りに回転します。
    """
    pdf_writer = PdfWriter()
    for path in pdf_paths:
        pdf_reader = PdfReader(open(path, "rb"))
        for page_num in range(len(pdf_reader.pages)):
            page = pdf_reader.pages[page_num]
            
            # ページを回転させる
            if rotation_angle != 0:
                page.rotate(rotation_angle)
                
            pdf_writer.add_page(page)
    
    with open(output_path, "wb") as output:
        pdf_writer.write(output)     

design.txt

title:PDF結合ツール
mode:light
max:1024,250
size:600,250
min:600,250
input_folder:入力フォルダ名,フォルダ選択
output_save:出力ファイル名,フォルダ選択
{
	label:PDFの回転角度 
	rotate_combo:0,90,180,270
}
exec_button:PDF結合,myfunc,func

design.txt の記述方法については、下記の記事で詳しく解説しています。

あわせて読みたい
【CustomTkinter】テキスト記述でGUIを簡単作成するライブラリを紹介! 本ブログで紹介しているツールも含め、自作ツールはちょっとした作業を自動化することが目的なので、簡易的な画面で事足りることが大半です。 とはいうものの、CustomTk...

まとめ

今回は、「PDF結合ツール」について、使い方から環境構築に至るまでの手順、更にフローや構成図などの設計資料について紹介しました。

PDF分割ツールと同様に非常にシンプルな画面であるため、ノンコーディングでUI画面が簡単に作成できるCureateUIクラスを使いました。

PDF結合ツールで使っている PyPDF2 は、PDFの分割や結合、回転、テキストや画像の抽出、透かしや注釈の追加など、多くの機能を持つフリーのライブラリであり、本ツールを少し改造することで色々な用途に使えます。

本記事が、皆さんのPDF結合ツールのお役に立てれば光栄です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次