「さはら3」です。
AI副業でどこまでいけるのか?をテーマに頑張っていきたいと思います。
頭の体操
- 1か所だけ異なる漢字が入っています。(解答は一番最後に掲載)
本編
作成のきっかけ
仕事でPDFファイルを良く扱うのですが、A4縦の用紙を
A4横でスキャンしてしまったり等が多々ありました。
そこで、スキャンし直すのもめんどくさいので、Pythonで実装できないかと思い
ChatGPTさんに丸投げして出来上がりました。
事前準部
- サンプルで、3ページのPDFファイルを用意しておきます。
実行画面
PDFファイル選択
- 「ファイルを選択」ボタンを押すと、ファイル選択画面が表示されます。
選択ファイル
- 選択したファイル名が、下部に表示されます。
回転
90度、180度、270度の回転を行え、即時保存されます。(強制上書きになりますので、ご注意ください。)
保存したファイル名が、ポップアップで表示されます。
選択したファイルのあるフォルダーに「元のファイル名」+「_rotated_90」が付与されて保存されます。(元のファイルは編集しません。)
ページ分割
- 「ページ分割」ボタンを押すと、1ページ単位で保存されます。(「元のファイル名」+「_page_1~3」)
結合
- 「ファイルを選択」ボタンを押し、結合したい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着物美女
良かったらInstagramのフォローをお願いします。
https://www.instagram.com/ai_kimono_bijo/
非アダルトで運営しておりますので、職場でも安心して堪能いただけます。