PDF Pythonツール tkinter ドラッグアンドドロップ(複数ファイル) 画像(JPG,PNG,TIFFなど)

Pythonで画像とPDFを自動回転・PDF化!ドラッグアンドドロップで効率化!

概要

このブログ記事では、Pythonといくつかのライブラリを使用して、ファイルを簡単にドラッグ&ドロップするだけで画像やPDFを自動回転させ、必要に応じてPDF化する方法を解説します。この便利なツールは、文書管理やアーカイブ作成の効率を大幅に向上させることができます。

使用例

  • オフィスでスキャンした文書や画像が間違った向きで保存されている場合の迅速な修正。
  • プレゼンテーション資料や電子書籍のページを適切な向きに整えたいとき。
  • デジタルアーカイブを作成する際に、一貫したファイル形式と向きを保ちたい場合。

必要なPythonライブラリとインストール方法

このツールを使用するには、以下のPythonライブラリが必要です:

  • PyPDF2 : PDFの操作を容易にします。
  • Pillow : 画像ファイルの読み込みと変換を行います。
  • tkinterdnd2 : GUIにドラッグアンドドロップ機能を追加します。

これらのライブラリは以下のコマンドで簡単にインストールできます:

pip install pypdf2 pillow tkinterdnd2

使用手順

  1. 必要なライブラリをインストールします。
  2. 提供されたスクリプトをPythonファイルとして保存します(例:file_rotator.py)。
  3. スクリプトを実行すると、GUIが開始されます。ドラッグ&ドロップでファイルをGUIに移動します。
  4. プルダウンメニューから回転角度を選択し、操作を完了させます。

注意点

  • 開いているファイルは処理できないため、操作前にすべてのファイルが閉じていることを確認してください。
  • 変換されたファイルは元のファイルと同じディレクトリに保存されますが、元のファイルは上書きされません。

プログラム

下記のコードをメモ帳などに丸々コピーしてpythonファイル(file_rotator.py)にしてください。

import os
import tkinter as tk
from tkinterdnd2 import DND_FILES, TkinterDnD
from tkinter import ttk
from PyPDF2 import PdfWriter
from PIL import Image

def convert_image_to_pdf(image_path, output_path, angle):
    img = Image.open(image_path)
    if angle != 'none':
        img = img.rotate(-int(angle.split('°')[0]), expand=True)
    img.save(output_path, "PDF", resolution=100.0)

def rotate_pdf(file_path, angle, output_path):
    from PyPDF2 import PdfReader
    reader = PdfReader(file_path)
    writer = PdfWriter()

    for page in reader.pages:
        page.rotate(int(angle.split('°')[0]))
        writer.add_page(page)

    with open(output_path, 'wb') as f:
        writer.write(f)

def generate_output_filename(folder_path, original_filename, is_pdf=True):
    base, ext = os.path.splitext(original_filename)
    ext = '.pdf' if is_pdf else ext
    counter = 1
    new_filename = f"{base}_{str(counter).zfill(3)}{ext}"
    while os.path.exists(os.path.join(folder_path, new_filename)):
        counter += 1
        new_filename = f"{base}_{str(counter).zfill(3)}{ext}"
    return new_filename

def on_drop(event):
    file_paths = root.tk.splitlist(event.data)
    for file_path in file_paths:
        output_filename = generate_output_filename(os.path.dirname(file_path), os.path.basename(file_path))
        output_path = os.path.join(os.path.dirname(file_path), output_filename)
        if file_path.lower().endswith('.pdf'):
            if rotation_angle.get() != 'none':
                rotate_pdf(file_path, rotation_angle.get(), output_path)
        elif any(file_path.lower().endswith(ext) for ext in ['.jpg', '.tiff', '.png', '.bmp', '.webp', '.gif']):
            convert_image_to_pdf(file_path, output_path, rotation_angle.get())

def setup_gui():
    global rotation_angle
    rotation_angle = tk.StringVar(value='none')

    root.drop_target_register(DND_FILES)
    root.dnd_bind('<<Drop>>', on_drop)

    label = tk.Label(root, text="Drag and drop PDF or image files here:")
    label.pack(pady=10)

    ttk.Label(root, text="Select Output Rotation Angle:").pack()
    options = {'none': 'none', '90° right': '90', '90° left': '-90', '180°': '180'}
    dropdown = ttk.Combobox(root, textvariable=rotation_angle, values=list(options.keys()), state="readonly")
    dropdown.pack(pady=10)

    supported_formats_label = ttk.Label(root, text="Supported image formats: JPG, TIFF, PNG, BMP, WEBP, GIF")
    supported_formats_label.pack(pady=10)

if __name__ == "__main__":
    root = TkinterDnD.Tk()
    root.geometry("400x250")  # Adjusted GUI size
    setup_gui()
    root.mainloop()

ダウンロード

あるいは、下記をダウンロードし、「.txt」を「.py」に変えることでそのまま使えます。

まとめ

この記事で紹介したPythonスクリプトを利用すれば、誰でも簡単に画像やPDFファイルを自動で回転させ、PDFに変換することができます。このツールは、日々の文書処理を効率化し、作業時間を削減するのに役立ちます。プログラミングによる問題解決の可能性をぜひ体験してみてください。

-PDF, Pythonツール, tkinter, ドラッグアンドドロップ(複数ファイル), 画像(JPG,PNG,TIFFなど)