今回の自作ツールは、「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ファイルに結合されます。
プログラムのダウンロードと動作環境の設定
Pythonのインストールが必要です。既に構築済みの方は読み飛ばしてください。詳細は下記の個別記事をご覧ください。
自作ツールのためのポータブルPython開発・実行環境を作ろう! | プログラム実行時に必要 |
WinPythonにVSCode Portable版を入れよう! | プログラム修正時に必要 |
Python 環境に下記のライブラリをインストールします。 command.bat を実行後、下記のコマンドを実行します。
pip install PyPDF2
pip install customtkinter
pip install Pillow
pip install tkinterdnd2
実行方法
次の手順で実行してください。
- 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.py | PDFファイルの結合処理 |
create_ui.py | UI定義ファイルを読み込んで画面にウィジェットを表示 |
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 の記述方法については、下記の記事で詳しく解説しています。
まとめ
今回は、「PDF結合ツール」について、使い方から環境構築に至るまでの手順、更にフローや構成図などの設計資料について紹介しました。
PDF分割ツールと同様に非常にシンプルな画面であるため、ノンコーディングでUI画面が簡単に作成できるCureateUIクラスを使いました。
PDF結合ツールで使っている PyPDF2 は、PDFの分割や結合、回転、テキストや画像の抽出、透かしや注釈の追加など、多くの機能を持つフリーのライブラリであり、本ツールを少し改造することで色々な用途に使えます。
本記事が、皆さんのPDF結合ツールのお役に立てれば光栄です。
コメント