【初心者歓迎】PDF分割ツールを作ろう

今回の自作ツールは、「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

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

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の分割を行っても良かったのですが、再利用性を考慮してsplit_pdf.py で処理するようにしました。

モジュール名役割
main.py画面の表示とボタンクリックのイベント処理
split_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 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 の記述方法については、下記の記事で詳しく解説しています。

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

まとめ

今回は、「PDF分割ツール」について、使い方から環境構築に至るまでの手順と、仕様や設計などの内部情報について紹介しました。

今回は非常にシンプルな画面だったので、ノンコーディングでUI画面が簡単に作成できるCureateUIクラスを使っています。

PDF分割ツールで使っている PyPDF2 は、PDFの分割や結合、回転、テキストや画像の抽出、透かしや注釈の追加など、多くの機能を持つフリーのライブラリです。

本記事で紹介するソースコードを少し修正すれば、もっと多くのことができますので、必要に応じて修正のうえ、ご利用いただければ幸いです。

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

この記事を書いた人

コメント

コメントする

目次