今回の自作ツールは、「PDF分割ツール」です。PyPDF2というライブラリを使うと、PDFが簡単に分割できます。PythonでPDFファイルをページ単位で分割したい方は、是非本記事を参考にトライしてみてください。
画面作成は「【CustomTkinter】テキスト記述でGUIを簡単作成するライブラリを紹介!」の記事で紹介した create_ui.py を使っていますので、こちらも併せてご確認ください。
自作ツールを作るためのポイントと今後公開予定の自作ツール一覧を「【実践】Pythonで事務処理向け自作ツールを作ろう!」で紹介していますので、併せてご覧ください。
PDF分割ツールの紹介
今回紹介するPDF分割ツールは、指定したフォルダに置かれているPDFファイルをまとめて分割し、出力フォルダに書き出してくれます。
- 指定したフォルダに置かれたPDFファイル(*.pdf)全てに対して、連番付きファイル名で分割します。
- 分割時にページを回転(90度、180度、270度)させて出力することが可能です。
- 入力フォルダ、出力ファルダに入力した内容は保持され、次回起動時に復元されます。
画面レイアウトと使い方
以下の4ステップでPDFファイルを分割することができます。
- 入力フォルダ選択欄に、分割対象のPDFが保存されているフォルダを指定する
- 出力フォルダ選択欄に、分割後のファイルを保存したいフォルダを指定する
- PDFを回転させたい場合、その角度を90度/180度/270度の中から選択する
- PDF分割ボタンをクリックする
実行結果
入力フォルダに保存されているPDFファイル(拡張子 .pdf)のみが分割され、出力フォルダに保存されます。その際、ファイル名末尾に001~の連番が付与されます。
入力フォルダに存在するファイル一覧
es.txt
test.txt
スパースモデリングの基礎・実践.pdf
生産データ.csv
出力フォルダに保存された分割ファイル一覧
スパースモデリングの基礎・実践_001.pdf
スパースモデリングの基礎・実践_002.pdf
スパースモデリングの基礎・実践_003.pdf
スパースモデリングの基礎・実践_004.pdf
スパースモデリングの基礎・実践_005.pdf
スパースモデリングの基礎・実践_006.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の分割を行っても良かったのですが、再利用性を考慮してsplit_pdf.py で処理するようにしました。
モジュール名 | 役割 |
---|---|
main.py | 画面の表示とボタンクリックのイベント処理 |
split_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 split_pdf as sp
# ボタンが押された時の処理
def func(param):
dir = param["input_folder"]
# ディレクトリ内のすべてのPDFファイルを取得
pdfs = [os.path.join(dir, file) for file in os.listdir(dir) if file.endswith(".pdf")]
rotate = 0 if param["rotate_combo"] == "" else int(param["rotate_combo"])
for pdf in pdfs:
sp.split_pdf(pdf,param["output_folder"],rotate)
# インスタンス生成
ui = CreateUI(func)
# 画面の表示
ui.show()
split_pdf.py
import os
from PyPDF2 import PdfReader, PdfWriter
def split_pdf(pdf_path, output_dir, rotation_angle=0):
"""
PDFをページごとに分割し、指定されたディレクトリに保存します。
ページを回転させることもできます。
:param pdf_path: 元のPDFファイルのパス
:param output_dir: 分割後のPDFを保存するディレクトリ
:param rotation_angle: ページを回転させる角度(度数法)。時計回りに回転します。
"""
# 出力ディレクトリが存在しない場合は作成
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 入力ファイル名から拡張子を取り除く
name = os.path.splitext(os.path.basename(pdf_path))[0]
# ループでPDFを1ファイルづつ分割する
input_pdf = PdfReader(open(pdf_path, "rb"))
for page_num in range(len(input_pdf.pages)):
output_pdf = PdfWriter()
page = input_pdf.pages[page_num]
# ページを回転させる
if rotation_angle != 0:
page.rotate(rotation_angle)
output_pdf.add_page(page)
with open(f"{output_dir}/{name}_{page_num + 1:03d}.pdf", "wb") as output:
output_pdf.write(output)
design.txt
title:PDF分割ツール
mode:light
max:1024,250
size:600,250
min:600,250
input_folder:入力フォルダ選択,フォルダ選択
output_folder:出力フォルダ選択,フォルダ選択
{
label:PDFの回転角度
rotate_combo:0,90,180,270
}
exec_button:PDF分割,myfunc,func
design.txt の記述方法については、下記の記事で詳しく解説しています。
まとめ
今回は、「PDF分割ツール」について、使い方から環境構築に至るまでの手順と、仕様や設計などの内部情報について紹介しました。
今回は非常にシンプルな画面だったので、ノンコーディングでUI画面が簡単に作成できるCureateUIクラスを使っています。
PDF分割ツールで使っている PyPDF2 は、PDFの分割や結合、回転、テキストや画像の抽出、透かしや注釈の追加など、多くの機能を持つフリーのライブラリです。
本記事で紹介するソースコードを少し修正すれば、もっと多くのことができますので、必要に応じて修正のうえ、ご利用いただければ幸いです。
コメント