見出し画像

PDFファイルの余白を削除、トリミングする

画像ファイルをPDFファイルに変換したら余白が発生してしまいます。
そのような場合に余白を取り除くためのpythonスクリプトを作成しました。
また、python環境がない場合でも使えるようにexeファイルでも公開します

処理の流れ
・PDFを用意する
・スクリプトにPDFを読み込ませて余白をカット
・余白をカットしたPDFを名前を付けて保存する

・コードに必要なパッケージ

pip install tkinterdnd2 pdfrw

・pythonコード

import os
import configparser
from tkinter import Tk, Label, filedialog, Spinbox, Frame, Button
from tkinterdnd2 import TkinterDnD, DND_FILES
from pdfrw import PdfReader, PdfWriter, PageMerge

# INIファイルのパスを設定
SETTINGS_FILE = "settings.ini"

def load_settings():
    config = configparser.ConfigParser()
    if os.path.exists(SETTINGS_FILE):
        config.read(SETTINGS_FILE)
        width = config.getint('Settings', 'width', fallback=1000)
        height = config.getint('Settings', 'height', fallback=1000)
    else:
        # INIファイルが存在しない場合、デフォルト値を設定
        width = 1000
        height = 1000
        # デフォルト値をINIファイルに保存
        save_settings(width, height)
    return {"width": width, "height": height}

def save_settings(width, height):
    config = configparser.ConfigParser()
    config['Settings'] = {'width': width, 'height': height}
    with open(SETTINGS_FILE, 'w') as configfile:
        config.write(configfile)

def trim_pdf(input_pdf_path, output_pdf_path, trim_rect):
    reader = PdfReader(input_pdf_path)
    writer = PdfWriter()

    for page in reader.pages:
        page_width = float(page.MediaBox[2])
        page_height = float(page.MediaBox[3])
        lower_left_x = (page_width - trim_rect[0]) / 2  # width
        lower_left_y = (page_height - trim_rect[1]) / 2  # height
        upper_right_x = lower_left_x + trim_rect[0]
        upper_right_y = lower_left_y + trim_rect[1]

        page.MediaBox = [lower_left_x, lower_left_y, upper_right_x, upper_right_y]
        writer.addpage(page)

    writer.write(output_pdf_path)

def on_drop(event):
    input_pdf_path = event.data.strip("{}")  # 括弧を取り除く
    input_pdf_path = input_pdf_path.replace("\\", "/")  # Windowsのパス区切りを修正
    if os.path.isfile(input_pdf_path) and input_pdf_path.lower().endswith('.pdf'):
        output_pdf_path = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=[("PDF files", "*.pdf")])
        if output_pdf_path:
            width = int(spin_width.get())
            height = int(spin_height.get())
            trim_rect = (width, height)  # トリミングする矩形領域 (width, height)
            trim_pdf(input_pdf_path, output_pdf_path, trim_rect)
            label.config(text="トリミングが完了しました!")
        else:
            label.config(text="出力ファイルのパスが指定されていません。")
    else:
        label.config(text="有効なPDFファイルをドロップしてください。")

def save_current_settings():
    width = int(spin_width.get())
    height = int(spin_height.get())
    save_settings(width, height)
    label.config(text="設定が保存されました!")

# Tkinterの設定
root = TkinterDnD.Tk()
root.title("PDFトリミングツール")
root.geometry("400x350")

label = Label(root, text="ここにPDFファイルをドラッグ&ドロップしてください。")
label.pack(pady=20)

frame = Frame(root)
frame.pack(pady=10)

label_width = Label(frame, text="Width:")
label_width.grid(row=0, column=0)
spin_width = Spinbox(frame, from_=0, to=1000)
spin_width.grid(row=0, column=1)

label_height = Label(frame, text="Height:")
label_height.grid(row=1, column=0)
spin_height = Spinbox(frame, from_=0, to=1000)
spin_height.grid(row=1, column=1)

# 設定値の読み込み
settings = load_settings()
spin_width.delete(0, "end")
spin_width.insert(0, settings["width"])
spin_height.delete(0, "end")
spin_height.insert(0, settings["height"])

# 保存ボタンの追加
save_button = Button(root, text="設定を保存", command=save_current_settings)
save_button.pack(pady=10)

# ドロップイベントのバインド
root.drop_target_register(DND_FILES)
root.dnd_bind('<<Drop>>', on_drop)

root.mainloop()

・使い方
PDF_Trimerを起動する
縦、横のカットする値を入力
PDFファイルを読み込ませて任意のフォルダに保存する

・setting.iniファイルについて

PDF_Trimerを起動するとsetting.iniが生成されるますが、設定を保存ボタンを押すとこのファイルにweidth,heightの大きさの設定が保存されて起動時にも引き継がれます

ダウンロードはEdgeブラウザで

有料部分のexeファイルのダウンロードはGoogle Chromeだとダウンロードがセキュリティ機能でブロックされてしまうのでEdgeブラウザからダウンロード願います。
PDF_Trimmer.zipをダウンロード後に解凍してお使いください
解凍したPDF_Trimmer.exeを起動すると下記の画面が表示される場合があるので

その場合は詳細情報をクリック→実行ボタンを押してアプリケーションを起動してください

免責事項

本ソフトウェアによって予期せぬ動作をすることは通常はありませんが、
利用者は本ソフトウェアによって発生する可能性のあるすべてのリスクを承認し、そのリスクを自己の責任で負うものとします。当方は、本ソフトウェアの使用により生じた直接的または間接的な損害、逸失利益、データの損失、その他のいかなる損害についても責任を負いません。

ここから先は

0字 / 1ファイル

¥ 300

この記事が気に入ったらサポートをしてみませんか?