PythonベースのGUIアプリケーションとして、日常的なPDF操作を一つのツールで完結できる統合PDF編集ツールを開発する。
項目
技術
言語
Python 3.10+
GUIフレームワーク
PySide6 (Qt6)
PDF操作
PyMuPDF (fitz), reportlab
PDFプレビュー
PyMuPDF によるレンダリング
画像処理
Pillow
パッケージング
PyInstaller (exe化対応)
機能
詳細
PDF結合
複数PDFファイルを1つに結合する
ドラッグ&ドロップ並び替え
結合時のページ順序をGUI上で変更可能
PDF分割
1つのPDFを指定ページ範囲で分割する
ページ抽出
指定ページのみを抽出して新規PDFとして保存
ページ削除
指定ページを削除して保存
機能
詳細
ページプレビュー
PDFの各ページをサムネイル/フルサイズでプレビュー表示
ズームイン/ズームアウト
拡大・縮小表示
ページナビゲーション
ページ番号指定、前後ページ移動、スクロール表示
サムネイル一覧
左サイドバーにサムネイル一覧を表示
見開き表示
1ページ表示 / 見開き表示の切り替え
機能
詳細
手書き署名
マウス/ペンタブで手書き署名を描画
画像署名
署名画像(PNG/JPG)をインポートして貼付
署名配置
ドラッグ&ドロップで任意の位置に配置
サイズ調整
署名のサイズを自由に変更可能
署名テンプレート保存
よく使う署名をテンプレートとして保存・再利用
機能
詳細
定型スタンプ
「承認済」「却下」「社外秘」「DRAFT」「CONFIDENTIAL」等のプリセット
日付スタンプ
現在日付を含むスタンプを自動生成
カスタムスタンプ
テキスト・色・フォントサイズを指定してスタンプ作成
画像スタンプ
任意の画像をスタンプとして使用
スタンプ配置
ドラッグ&ドロップで任意の位置に配置、回転・サイズ変更可能
透過度調整
スタンプの透過度を調整可能
機能
詳細
テキスト注釈
任意の位置にテキストコメントを追加
ハイライト
テキスト範囲をハイライト表示(色選択可能)
下線・取り消し線
テキストに下線・取り消し線を追加
矩形・円・矢印描画
図形の描画ツール
フリーハンド描画
ペンツールによる自由描画
機能
詳細
ページ回転
90°/180°/270° 回転
ページ並び替え
ドラッグ&ドロップでページ順序を変更
空白ページ挿入
指定位置に空白ページを挿入
ページサイズ変更
A4/A3/Letter等へのリサイズ
トリミング
ページの余白をトリミング
機能
詳細
テキスト追加
任意の位置にテキストを追加(フォント・サイズ・色指定可)
画像挿入
PNG/JPG/BMP画像をページ内に挿入
透かし(ウォーターマーク)
テキストまたは画像の透かしを全ページに一括適用
機能
詳細
パスワード設定
PDFにパスワード保護を設定
パスワード解除
パスワード付きPDFを開いて編集可能にする
権限設定
印刷・コピー・編集の権限を個別に制御
機能
詳細
PDF → 画像
各ページをPNG/JPEG画像として書き出し
ページ指定画像エクスポート
ユーザーが指定したページのみをJPEG/PNG形式で書き出し(詳細は 3.9.1 参照)
画像 → PDF
複数画像を1つのPDFにまとめる
PDFテキスト抽出
PDF内のテキストをコピー/テキストファイルとして出力
3.9.1 ページ指定 JPEG/PNG エクスポート機能(詳細仕様)
読み込んだPDFから、ユーザーが指定したページをJPEG/PNG形式の画像ファイルとして書き出す機能。
項目
内容
対象PDF
現在開いているPDFドキュメント
ページ指定方法
以下のいずれかを選択可能
- 単一ページ
例: 3
- 複数ページ(カンマ区切り)
例: 1,3,5
- ページ範囲(ハイフン)
例: 2-7
- 上記の組み合わせ
例: 1,3-5,8
- 全ページ
チェックボックスで一括指定
- 現在表示中のページ
ボタンで現在ページを自動入力
項目
内容
出力フォーマット
JPEG / PNG (ラジオボタンで選択)
解像度(DPI)
72 / 150 / 300 / 600 から選択(デフォルト: 150 DPI)
カラーモード
RGB / グレースケール(デフォルト: RGB)
JPEG品質
1〜100 のスライダー(JPEG選択時のみ有効、デフォルト: 90)
PNG透過背景
有効/無効(PNG選択時のみ有効、デフォルト: 無効)
出力先フォルダ
フォルダ選択ダイアログで指定
ファイル名規則
{元ファイル名}_page_{ページ番号:03d}.{ext} (例: report_page_001.png)
ファイル名カスタマイズ
プレフィックス・連番桁数をユーザーが変更可能
上書き確認
既存ファイルがある場合は確認ダイアログを表示
メニュー: ファイル → エクスポート → 画像として書き出し...
ツールバー: 画像エクスポートアイコンを追加
専用ダイアログ「画像エクスポート」を表示
ページ指定入力欄(プレースホルダーに例を表示)
形式選択(JPEG / PNG)
DPI選択
カラーモード選択
品質/透過オプション(形式に応じて活性/非活性切替)
出力先フォルダ選択
ファイル名プレフィックス入力
プレビュー: 出力ファイル名のサンプル表示
進捗バー(複数ページ書き出し時)
エクスポート / キャンセル ボタン
ユーザーがメニュー/ツールバーからエクスポートダイアログを開く
ページ指定文字列をパース・バリデーション(不正な範囲・存在しないページはエラー表示)
出力設定を確認
各ページを PyMuPDF でレンダリング(指定DPI)
Pillow経由で指定形式・品質で保存
進捗をプログレスバーに反映
完了後、出力フォルダを開くかどうかを確認するダイアログ表示
ケース
動作
PDF未読み込み
メニュー項目を非活性化
不正なページ指定
エラーメッセージを表示し続行を中断
範囲外ページ
エラーメッセージで該当ページ番号を提示
出力先書き込み不可
エラーダイアログ表示
処理中断
キャンセルボタンで途中停止可能、生成済みファイルは保持
src/core/converter.py: 画像エクスポートのコアロジック(export_pages_as_images() を追加)
src/ui/export_dialog.py: エクスポートダイアログUI(新規作成)
src/utils/page_range_parser.py: ページ範囲文字列パーサー(新規作成)
機能
詳細
ファイルドラッグ&ドロップ
ウィンドウへのファイルD&Dで読み込み
最近使ったファイル
直近で開いたファイル履歴を表示
元に戻す/やり直し
Undo / Redo 対応
バッチ処理
複数ファイルへの一括操作(結合・透かし・変換等)
ダークモード
ライト/ダークテーマ切り替え
多言語対応
日本語/英語 UI切り替え
┌─────────────────────────────────────────────────────┐
│ メニューバー(ファイル / 編集 / 表示 / ツール) │
├─────────────────────────────────────────────────────┤
│ ツールバー(よく使う操作のアイコンボタン) │
├────────┬────────────────────────────┬───────────────┤
│ │ │ │
│ サム │ │ プロパティ │
│ ネイル │ メインプレビュー領域 │ パネル │
│ パネル │ │ (注釈/署名 │
│ │ │ 等の設定) │
│ │ │ │
├────────┴────────────────────────────┴───────────────┤
│ ステータスバー(ページ数 / ズーム率 / ファイル情報) │
└─────────────────────────────────────────────────────┘
項目
要件
対応OS
Windows 10/11
パフォーマンス
100ページ程度のPDFをストレスなく操作可能
ファイルサイズ
50MB以下のPDFを安定的に処理
exe化
PyInstallerで単体実行ファイルとして配布可能
設定保存
ユーザー設定・テンプレートをローカルに保存
フェーズ
内容
目安
Phase 1
GUI基盤 + PDFプレビュー + ファイル読み込み/保存
基盤構築
Phase 2
PDF結合・分割・ページ編集
コア機能
Phase 3
署名・スタンプ・注釈機能
編集機能
Phase 4
セキュリティ・変換・テキスト/画像操作
拡張機能
Phase 5
バッチ処理・多言語・ダークモード・exe化
仕上げ
python_pdfeditor/
├── main.py # エントリーポイント
├── requirements.txt # 依存パッケージ
├── request.md # 本要件定義書
├── README.md
├── src/
│ ├── __init__.py
│ ├── app.py # アプリケーション本体
│ ├── ui/ # UI関連モジュール
│ │ ├── main_window.py
│ │ ├── preview_widget.py
│ │ ├── thumbnail_panel.py
│ │ ├── property_panel.py
│ │ └── toolbar.py
│ ├── core/ # PDF操作コアロジック
│ │ ├── pdf_manager.py
│ │ ├── merger.py
│ │ ├── splitter.py
│ │ ├── annotator.py
│ │ ├── stamp.py
│ │ ├── signature.py
│ │ ├── security.py
│ │ └── converter.py
│ ├── models/ # データモデル
│ │ ├── document.py
│ │ └── annotation.py
│ ├── utils/ # ユーティリティ
│ │ ├── config.py
│ │ └── file_helper.py
│ └── resources/ # リソース(アイコン、テンプレート等)
│ ├── icons/
│ ├── stamps/
│ └── i18n/
└── tests/ # テスト
└── ...