PDF Pythonツール イベント 画像(JPG,PNG,TIFFなど)

生成AIで仕事に使えるプログラムをつくろう— セミナーで作成したプログラムを配布 

こんにちは皆さん!
今回は6月22日に開催されたセミナー「生成AIで仕事に使えるプログラムをつくろう」で紹介したプログラムを本ブログ記事で配布いたします。

セミナー概要

タイトル

生成AIで仕事に使えるプログラムをつくろう

日時

6月22日(火) 20:00〜21:00

場所

AI Contents LabのZoom

講師

gakushi(ガクシ)

内容

生成AI(主にClaude)でpdf結合・分割プログラムや画像変換プログラムの作り方を解説

参加費

無料

使用したスライド

今回、claude 3.5 sonnetでスライドを生成してそのまま講義として使用しました。プロンプトは下記のとおりです。

「生成AIを使って仕事ですぐに役に立つプログラムを作ろう」というタイトルで講演を行います。下記内容に即したグラフィカルなスライドを作成してください。
・page1 タイトル 
・page2 chemtoollab.comの紹介 
・page3 仕事で役立つプログラムの例(pdfの編集、画像の変換・リサイズ、メールテンプレ作成) 
・page4 何で作るか? ・生成AI ・Python
・page5 生成AIの種類 ・ChatGPT ・Gemini ・Copilot ・Claude など 
"それぞれの特徴を列記"  
・page6 Pythonとは、Pythonの特徴 "ライブラリの豊富さ"
・page7 Pythonライブラリの紹介 ・tkinter ・pypdf ・pillow ・tkinterdnd2 ・openpyxl
・page8 Pythonのインストール方法 ・公式サイト ・Anaconda など
・page9 おすすめエディター ・Visual Studio Code
・page10 よく使うプロンプト ・tkinterのGUIを使用して ・ドラッグアンドドロップで ・下記エラーを修正してください
・page11 講師:gakushi(ガクシ) ・X(twitter) :https://x.com/gakushiai ・blog:https://chemtoollab.com/ ・スタエフ:https://stand.fm/channels/64e8a7554cfd06ca8b18ceb2

スライドをpdf出力できましたので、公開いたします。

アーカイブ動画

配布プログラム

以下のプログラムは、セミナーで紹介した便利なツールです。PythonやAnacondaをインストールした上でご利用ください。

1. PDF結合プログラム

複数のPDFファイルを一つに結合するためのプログラムです。

まず、下記のライブラリをインストールしてください。

pip install PyPDF2 tkinterdnd2

その後に、下記をメモ帳などにコピペし、〇〇.pyファイルとして作成し、実行してください。

import os
import tkinter as tk
from tkinter import filedialog, messagebox
from PyPDF2 import PdfMerger
from tkinterdnd2 import DND_FILES, TkinterDnD

class PDFMergerApp(TkinterDnD.Tk):
def __init__(self):
super().__init__()
self.title("PDFマージャー")
self.geometry("400x300")

self.files = []

# ドラッグ&ドロップエリア
self.drop_area = tk.Listbox(self, selectmode=tk.EXTENDED)
self.drop_area.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
self.drop_area.drop_target_register(DND_FILES)
self.drop_area.dnd_bind('<<Drop>>', self.drop)

# ボタン
self.merge_button = tk.Button(self, text="PDFを結合", command=self.merge_pdfs)
self.merge_button.pack(pady=10)

def drop(self, event):
files = self.tk.splitlist(event.data)
for file in files:
if file.lower().endswith('.pdf') and file not in self.files:
self.files.append(file)
self.drop_area.insert(tk.END, os.path.basename(file))

def merge_pdfs(self):
if len(self.files) < 2:
messagebox.showwarning("警告", "2つ以上のPDFファイルを選択してください。")
return

output_file = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=[("PDF files", "*.pdf")])
if not output_file:
return

try:
merger = PdfMerger()
for file in self.files:
with open(file, 'rb') as f:
merger.append(f, bookmark=os.path.basename(file))

merger.write(output_file)
merger.close()
messagebox.showinfo("成功", f"{len(self.files)}個のPDFファイルを{output_file}に結合しました。")
except Exception as e:
messagebox.showerror("エラー", f"PDFの結合中にエラーが発生しました: {str(e)}")

if __name__ == "__main__":
app = PDFMergerApp()
app.mainloop()

2. PDF分割プログラム(範囲指定)

指定したページ範囲でPDFを分割するプログラムです。

まず、下記のライブラリをインストールしてください。

pip install PyPDF2 tkinterdnd2

その後に、下記をメモ帳などにコピペし、〇〇.pyファイルとして作成し、実行してください。

import tkinter as tk
from tkinter import filedialog, messagebox
from PyPDF2 import PdfReader, PdfWriter
import os
from tkinterdnd2 import DND_FILES, TkinterDnD

class PDFSplitterGUI:
def __init__(self, master):
self.master = master
self.master.title("PDFスプリッター")
self.master.geometry("400x300")

self.pdf_path = None

self.create_widgets()

def create_widgets(self):
# ドラッグ&ドロップエリア
self.drop_area = tk.Label(self.master, text="ここにPDFファイルをドロップしてください",
bg="lightgrey", height=5)
self.drop_area.pack(fill=tk.X, padx=10, pady=10)
self.drop_area.drop_target_register(DND_FILES)
self.drop_area.dnd_bind('<<Drop>>', self.drop)

# ファイル名表示
self.file_label = tk.Label(self.master, text="選択されたファイル: なし")
self.file_label.pack(pady=5)

# ページ範囲入力
self.range_frame = tk.Frame(self.master)
self.range_frame.pack(pady=5)
tk.Label(self.range_frame, text="ページ範囲:").pack(side=tk.LEFT)
self.start_page = tk.Entry(self.range_frame, width=5)
self.start_page.pack(side=tk.LEFT)
tk.Label(self.range_frame, text="-").pack(side=tk.LEFT)
self.end_page = tk.Entry(self.range_frame, width=5)
self.end_page.pack(side=tk.LEFT)

# 分割ボタン
self.split_button = tk.Button(self.master, text="分割", command=self.split_pdf)
self.split_button.pack(pady=10)

def drop(self, event):
file_path = event.data
if file_path.lower().endswith('.pdf'):
self.pdf_path = file_path
self.file_label.config(text=f"選択されたファイル: {os.path.basename(file_path)}")
else:
messagebox.showerror("エラー", "PDFファイルをドロップしてください。")

def split_pdf(self):
if not self.pdf_path:
messagebox.showerror("エラー", "PDFファイルを選択してください。")
return

try:
start = int(self.start_page.get())
end = int(self.end_page.get())
except ValueError:
messagebox.showerror("エラー", "有効なページ範囲を入力してください。")
return

reader = PdfReader(self.pdf_path)
writer = PdfWriter()

if start < 1 or end > len(reader.pages) or start > end:
messagebox.showerror("エラー", "無効なページ範囲です。")
return

for page in range(start - 1, end):
writer.add_page(reader.pages[page])

save_path = filedialog.asksaveasfilename(defaultextension=".pdf",
filetypes=[("PDF files", "*.pdf")])
if save_path:
with open(save_path, "wb") as output_file:
writer.write(output_file)
messagebox.showinfo("成功", f"PDFが正常に分割されました。\n保存先: {save_path}")

if __name__ == "__main__":
root = TkinterDnD.Tk()
app = PDFSplitterGUI(root)
root.mainloop()

3. PDF分割プログラム(全てのページを分割)

PDFの全てのページを個別のファイルに分割するプログラムです。

まず、下記のライブラリをインストールしてください。

pip install PyPDF2 tkinterdnd2

その後に、下記をメモ帳などにコピペし、〇〇.pyファイルとして作成し、実行してください。

import tkinter as tk
from tkinter import filedialog, messagebox
from PyPDF2 import PdfReader, PdfWriter
import os
from tkinterdnd2 import DND_FILES, TkinterDnD

class PDFSplitterGUI:
def __init__(self, master):
self.master = master
self.master.title("PDFスプリッター(全ページ分割)")
self.master.geometry("400x200")

self.pdf_path = None

self.create_widgets()

def create_widgets(self):
# ドラッグ&ドロップエリア
self.drop_area = tk.Label(self.master, text="ここにPDFファイルをドロップしてください",
bg="lightgrey", height=5)
self.drop_area.pack(fill=tk.X, padx=10, pady=10)
self.drop_area.drop_target_register(DND_FILES)
self.drop_area.dnd_bind('<<Drop>>', self.drop)

# ファイル名表示
self.file_label = tk.Label(self.master, text="選択されたファイル: なし")
self.file_label.pack(pady=5)

# 分割ボタン
self.split_button = tk.Button(self.master, text="全ページを分割", command=self.split_pdf)
self.split_button.pack(pady=10)

def drop(self, event):
file_path = event.data
if file_path.lower().endswith('.pdf'):
self.pdf_path = file_path
self.file_label.config(text=f"選択されたファイル: {os.path.basename(file_path)}")
else:
messagebox.showerror("エラー", "PDFファイルをドロップしてください。")

def split_pdf(self):
if not self.pdf_path:
messagebox.showerror("エラー", "PDFファイルを選択してください。")
return

reader = PdfReader(self.pdf_path)
total_pages = len(reader.pages)

# 保存先ディレクトリを選択
save_dir = filedialog.askdirectory(title="分割したPDFの保存先を選択")
if not save_dir:
return # ユーザーがキャンセルした場合

base_filename = os.path.splitext(os.path.basename(self.pdf_path))[0]

for page_num in range(total_pages):
writer = PdfWriter()
writer.add_page(reader.pages[page_num])

output_filename = f"{base_filename}_page_{page_num + 1}.pdf"
output_path = os.path.join(save_dir, output_filename)

with open(output_path, "wb") as output_file:
writer.write(output_file)

messagebox.showinfo("成功", f"PDFの全{total_pages}ページが正常に分割されました。\n保存先: {save_dir}")

if __name__ == "__main__":
root = TkinterDnD.Tk()
app = PDFSplitterGUI(root)
root.mainloop()

4. 画像変換及び縮小プログラム

画像の形式を変換し、サイズを縮小するプログラムです。

まず、下記のライブラリをインストールしてください。

pip install tkinterdnd2 Pillow

その後に、下記をメモ帳などにコピペし、〇〇.pyファイルとして作成し、実行してください。

import tkinter as tk
from tkinter import filedialog, messagebox
from tkinterdnd2 import DND_FILES, TkinterDnD
from PIL import Image
import os

class ImageConverterGUI:
def __init__(self, master):
self.master = master
master.title("画像変換ツール")
master.geometry("400x300")

# ドラッグ&ドロップエリア
self.drop_area = tk.Label(master, text="ここに画像をドラッグ&ドロップしてください",
bg="lightgray", height=5)
self.drop_area.pack(fill=tk.X, padx=10, pady=10)
self.drop_area.drop_target_register(DND_FILES)
self.drop_area.dnd_bind('<<Drop>>', self.drop)

# 出力フォーマット選択
self.format_var = tk.StringVar(value="png")
formats = ["jpg", "png", "gif", "bmp", "webp", "tiff"]
tk.Label(master, text="出力フォーマット:").pack()
for fmt in formats:
tk.Radiobutton(master, text=fmt, variable=self.format_var, value=fmt).pack(anchor=tk.W)

# サイズ選択
self.size_var = tk.StringVar(value="1280x1280")
tk.Label(master, text="出力サイズ:").pack()
tk.Radiobutton(master, text="1280x1280", variable=self.size_var, value="1280x1280").pack(anchor=tk.W)
tk.Radiobutton(master, text="960x960", variable=self.size_var, value="960x960").pack(anchor=tk.W)

# 変換ボタン
tk.Button(master, text="変換", command=self.convert).pack(pady=10)

self.file_path = None

def drop(self, event):
file_path = event.data
if file_path:
# Windows形式のパスを処理(必要な場合)
file_path = file_path.replace('{', '').replace('}', '')
self.file_path = file_path
self.drop_area.config(text=f"選択された画像: {os.path.basename(self.file_path)}")

def convert(self):
if not self.file_path:
messagebox.showerror("エラー", "画像が選択されていません")
return

try:
# 画像を開く
with Image.open(self.file_path) as img:
# RGBモードに変換
if img.mode != 'RGB':
img = img.convert('RGB')

# サイズ変更
target_size = tuple(map(int, self.size_var.get().split('x')))
img.thumbnail(target_size, Image.Resampling.LANCZOS)

# 保存先を選択
output_format = self.format_var.get().lower()
save_path = filedialog.asksaveasfilename(defaultextension=f".{output_format}",
filetypes=[(f"{output_format.upper()} files", f"*.{output_format}")])
if not save_path:
return

# 画像を保存
if output_format == 'jpg':
img.save(save_path, format='JPEG', quality=95, optimize=True)
else:
img.save(save_path, format=output_format.upper())

messagebox.showinfo("成功", "画像が正常に変換されました")
except Exception as e:
messagebox.showerror("エラー", f"変換中にエラーが発生しました: {str(e)}")
print(f"詳細なエラー情報: {str(e)}") # コンソールに詳細なエラー情報を出力

if __name__ == "__main__":
root = TkinterDnD.Tk()
app = ImageConverterGUI(root)
root.mainloop()

プログラムの使用方法

これらのプログラムを使用するには、Python、あるいはAnacondaのインストールが必要です。以下のリンクからダウンロードしてインストールしてください。


これらのプログラムを活用して、日常業務の効率化に役立ててください。また、今後もAIを活用した便利なツールやセミナーを提供してまいりますので、どうぞお楽しみに!

質問やフィードバックがあれば、コメント欄にてお気軽にお知らせください。

-PDF, Pythonツール, イベント, 画像(JPG,PNG,TIFFなど)