Sahara3のAI副業

AI副業でどこまでいけるのか?

AI副業:PDFの簡単な編集を実施したい。

「さはら3」です。

AI副業でどこまでいけるのか?をテーマに頑張っていきたいと思います。



頭の体操

  • 1か所だけ異なる漢字が入っています。(解答は一番最後に掲載)

問題


本編

作成のきっかけ

仕事でPDFファイルを良く扱うのですが、A4縦の用紙を

A4横でスキャンしてしまったり等が多々ありました。

そこで、スキャンし直すのもめんどくさいので、Pythonで実装できないかと思い

ChatGPTさんに丸投げして出来上がりました。


事前準部

  • サンプルで、3ページのPDFファイルを用意しておきます。

サンプルPDF


実行画面

PDF編集


PDFファイル選択

  • 「ファイルを選択」ボタンを押すと、ファイル選択画面が表示されます。

ファイル選択


選択ファイル

  • 選択したファイル名が、下部に表示されます。

PDF編集


回転

  • 90度、180度、270度の回転を行え、即時保存されます。(強制上書きになりますので、ご注意ください。

  • 保存したファイル名が、ポップアップで表示されます。

  • 選択したファイルのあるフォルダーに「元のファイル名」+「_rotated_90」が付与されて保存されます。(元のファイルは編集しません。)

保存90

保存180

保存270


ページ分割

  • 「ページ分割」ボタンを押すと、1ページ単位で保存されます。(「元のファイル名」+「_page_1~3」)

分割


結合

  • 「ファイルを選択」ボタンを押し、結合したいPdfファイルを複数選択します。

複数ファイル選択

  • 選択したファイル名が、下部に表示されます。

PDF編集

  • 「結合」ボタンを押すと、「一番上のファイル名」+「_merged」で保存されます。

結合


スクリプト

import tkinter as tk
from tkinter import filedialog, messagebox
import os
import PyPDF2

def rotate_pdf(filepath, rotation, output_filepath):
    """指定された角度でPDFを回転させ、新しいファイルとして保存します。"""
    with open(filepath, 'rb') as file:
        reader = PyPDF2.PdfReader(file)
        writer = PyPDF2.PdfWriter()

        for page_num in range(len(reader.pages)):
            page = reader.pages[page_num]
            page.rotate(rotation)
            writer.add_page(page)

        with open(output_filepath, 'wb') as output_file:
            writer.write(output_file)

def split_pdf(input_filepath):
    """PDFを個別のページに分割し、各ページを新しいファイルとして保存します。"""
    output_filepaths = []
    with open(input_filepath, "rb") as file:
        reader = PyPDF2.PdfReader(file)
        total_pages = len(reader.pages)
        
        for i in range(total_pages):
            writer = PyPDF2.PdfWriter()
            writer.add_page(reader.pages[i])
            
            base_name = os.path.basename(input_filepath)
            name_without_extension = os.path.splitext(base_name)[0]
            output_filepath = os.path.join(os.path.dirname(input_filepath), f"{name_without_extension}_page_{i+1}.pdf")
            with open(output_filepath, "wb") as output_file:
                writer.write(output_file)
            
            output_filepaths.append(output_filepath)
    
    return output_filepaths

def merge_pdfs(filepaths, output_filepath):
    """複数のPDFを単一のファイルに結合します。"""
    writer = PyPDF2.PdfWriter()
    for filepath in filepaths:
        with open(filepath, 'rb') as file:
            reader = PyPDF2.PdfReader(file)
            for page_num in range(len(reader.pages)):
                writer.add_page(reader.pages[page_num])
    with open(output_filepath, 'wb') as output_file:
        writer.write(output_file)

def display_message(message):
    """GUI上にメッセージを表示します。"""
    messagebox.showinfo("Info", message)

def onClick(button_type):
    """PDF操作を実行するためのボタンクリックイベントを処理します。"""
    output_filepaths = []
    for filepath in filepaths:
        base_name = os.path.basename(filepath)
        name_without_extension = os.path.splitext(base_name)[0]
        
        # クリックされたボタンに基づいてPDFを回転
        if button_type == "90度回転":
            output_filepath = os.path.join(os.path.dirname(filepath), f"{name_without_extension}_rotated_90.pdf")
            rotate_pdf(filepath, 90, output_filepath)
            output_filepaths.append(output_filepath)
        elif button_type == "180度回転":
            output_filepath = os.path.join(os.path.dirname(filepath), f"{name_without_extension}_rotated_180.pdf")
            rotate_pdf(filepath, 180, output_filepath)
            output_filepaths.append(output_filepath)
        elif button_type == "270度回転":
            output_filepath = os.path.join(os.path.dirname(filepath), f"{name_without_extension}_rotated_270.pdf")
            rotate_pdf(filepath, 270, output_filepath)
            output_filepaths.append(output_filepath)
        elif button_type == "ページ分割":
            output_filepaths.extend(split_pdf(filepath))
        elif button_type == "PDF結合":
            output_filepath = os.path.join(os.path.dirname(filepaths[0]), f"{name_without_extension}_merged.pdf")
            merge_pdfs(filepaths, output_filepath)
            output_filepaths.append(output_filepath)
            break  # すべてのファイルを1つに結合するので、一度だけ実行する

    # Display the output file names
    display_message("\n".join(output_filepaths))


def open_file_dialog():
    """ファイルダイアログを開き、PDFファイルを選択します。"""
    global filepaths
    filepaths = filedialog.askopenfilenames(title="PDFファイルを開く", filetypes=[("PDFファイル", "*.pdf")])
    # 選択したファイル名を表示
    selected_files_label.config(text="\n".join(filepaths))

root = tk.Tk()
root.title("PDFファイルを開く")

open_button = tk.Button(root, text="ファイルを選択", command=open_file_dialog)
open_button.pack(pady=10)

buttons = ["90度回転", "180度回転", "270度回転", "ページ分割", "PDF結合"]
for button_text in buttons:
    button = tk.Button(root, text=button_text, command=lambda bt=button_text: onClick(bt))
    button.pack(pady=10)

# 選択したファイル名を表示するためのラベルを追加
selected_files_label = tk.Label(root, text="", wraplength=500)  # wraplengthはラベルの幅を指定します。
selected_files_label.pack(pady=10)

root.mainloop()


いかがでしたでしょうか?

PDFファイルの簡単な編集であれば事足りるかと思います。

もっと本格的な編集を行いたい場合は、有償版の各種ソフトウェアの導入のご検討をお願いします。


AI関連は日進月歩、日々之精進でございます。

最後まで読んで頂きありがとうございました。

AIさはら


頭の体操:解答

  • わかりましたか?

解答


本日のAI着物美女

AI着物美女

Instagram

良かったらInstagramのフォローをお願いします。

https://www.instagram.com/ai_kimono_bijo/

非アダルトで運営しておりますので、職場でも安心して堪能いただけます。