今回は、Kindle for PC(Windows版)から、各ページをキャプチャし、自動でPDF化するためのツール「Kindle Auto Capturer」の開発プロセスとその技術的急所を公開します。
1. 仕様・要件定義:目指したのは「ゼロ・コンフィグ」
既存のキャプチャツールに対する最大の不満は、「人間が介在するプロセスの多さ」でした。これを解消するため、以下の3つの要件をコアに据えました。
要件リスト
- ポータブル性の確保: ユーザーのOS環境(Pythonの有無やバージョン)に依存せず、実行ファイルを叩くだけで動く「ゼロ・インストール」構成。
- コンテキスト自動認識: ウィンドウの特定、本のタイトル取得、ページめくり方向の判定をすべてプログラム側で完結させる。
- 動的な境界検出: 本の背景色(白・黒・セピア)や、ページごとの余白変化に左右されない、ピクセルレベルの自動キャプチャ。
2. 技術選定の理由:構成モジュールと採用の論理的根拠
本ツールは、ユーザーの環境を汚さない「ポータブル性」と、OSレベルの確実な制御を両立させるため、以下のモジュール群で構成されています。
採用したコアモジュール一覧
- 実行環境: Python 3.11 (Windows embeddable package)
- OS・ウィンドウ制御:
ctypes(標準ライブラリ) - 画像取得・解析:
pyautogui,Pillow(PIL) - ファイル生成:
img2pdf
モジュール選定理由
これらのモジュールを採用した背景には、既存ツールの課題を解決するための明確な意思決定プロセスがあります。
- Python 3.11 (Embeddable) によるゼロ・インストールの実現:
今回の要件達成のためには、Pythonが一番現実的だと思います。
その中でも安定版のバージョンである Python 3.11を採用しました。 ctypesの直接操作によるDPI・ウィンドウ制御の確実性:
ここが本ツールの生命線です。
便利なラッパーライブラリ(pygetwindowなど)は意図的に使用していません。
Windowsのディスプレイ設定(150%拡大など)による座標ズレを防ぐためには、起動直後にSetProcessDpiAwarenessContext(-4)のようにOSに直接宣言する必要があるためです。
また、他アプリの裏に隠れたKindleを強制的に最前面へ引き上げる処理も、Windows APIを直接操作する方が圧倒的に確実です。Pillow(PIL) による高速なピクセル解析:
1ピクセル単位で「黒か白か」を判定する境界検出アルゴリズムを高速に回すため、メモリ上の画像データに直接アクセスできるPillowを採用しました。img2pdfによる無劣化結合:
抽出したPNG画像をPDF化する際、再圧縮(エンコード)を一切行わず、画質の劣化をゼロに抑えるための必須要件として選定しました。
エンジニアではないユーザーにとって、「Pythonをインストールして、PATHを通して、pipでモジュールを入れて…」という作業は非常に高いハードルです。この課題を解決するため、ユーザーがダブルクリックするだけで全てが自動完結する start.bat を開発の起点としました。
それでは、アーキテクチャ解説の第一歩として、この「ゼロ・インストール」を実現するバッチファイルの仕組みと、そこに隠された技術的急所を解説します。
3. ファイル構成:動的生成を前提としたミニマリズム設計

配布時の初期状態では、ユーザーの目に入るコアファイルはわずか3つ(start.bat, fix_pth.py, kindle_auto.py)しかありません。実行に伴い、システムが自動的に必要なフォルダやファイルを生成・破棄する「自己完結型」のライフサイクルを持たせています。
以下が、実行後(稼働中)の全体的なディレクトリ構造です。
Plaintext
Kindle_Auto_Capturer_Dir/
├── start.bat ... (静的) 起動・環境構築のブートストラッパー
├── fix_pth.py ... (静的) Embeddable Pythonのパス修正スクリプト
├── kindle_auto.py ... (静的) キャプチャ・PDF化のメインロジック
├── python_embed/ ... (動的) 初回実行時に自動生成される独立Python環境
├── kindle_capture_temp/ ... (動的) 実行中に自動生成され、終了時に消滅する一時フォルダ
└── [本のタイトル].pdf ... (動的) 最終的な成果物
各ファイルの役割とPM的意図
構成要素それぞれの役割と、なぜそのように配置したのかという論理的根拠をまとめました。
| ファイル / フォルダ名 | 種別 | 役割と設計の意図 |
start.bat | 静的 | ユーザーが唯一ダブルクリックするエントリーポイントです。環境構築からメイン処理の呼び出しまでを全自動で行う「インフラストラクチャー・アズ・コード(IaC)」の役割を担います。 |
fix_pth.py | 静的 | start.bat から裏側で呼び出される黒衣(くろご)的スクリプトです。Embeddable Pythonが外部ライブラリ(site-packages)を認識できるよう、python311._pth ファイルを動的に書き換えます。 |
kindle_auto.py | 静的 | ウィンドウ制御、ピクセル単位の境界検出、画像比較による終了検知(Auto-Stop)、PDF結合など、本ツールの頭脳となるコアロジックがすべて詰まったメインプログラムです。 |
python_embed/ | 動的 | 初回起動時に start.bat が公式サイトからダウンロード・展開する、本ツール専用のPython実行環境です。ユーザーのPCに元々入っているPython環境とは完全に切り離されているため、バージョン競合や環境破壊を起こしません。 |
kindle_capture_temp/ | 動的 | キャプチャループ中、1ページごとのPNG画像(page_0000.png等)を一時的に保存する作業用フォルダです。PDFへの結合が完了した直後に、画像ごとフォルダ自体が自動で完全削除される仕様にしており、PCのストレージを無駄に圧迫しません。 |
[本のタイトル].pdf | 動的 | 最終出力ファイルです。ウィンドウのタイトルバーから自動で書名を抽出し、ファイル名に使用できない記号(`\ / : * ? ” < > |)をアンダースコア(_`)に自動置換して出力されます。 |
4. 実行環境の自動構築:start.bat による「ゼロ・インストール」の実現
本システムは、ユーザーのPC環境を一切汚さない(環境変数などを書き換えない)「ポータブル構成」を採用しています。 これを実現するために、start.bat は単なる起動スクリプトではなく、「実行環境のオンデマンド・ビルダー」として機能します。
処理のフローは以下の4ステップで構成されています。
ステップ1:Embeddable Pythonの動的取得
Windowsに標準搭載されている curl と powershell を利用し、公式の「Python 3.11 Windows embeddable package(軽量版)」をダウンロードして解凍します。 これにより、管理者権限がなくても、スクリプトと同じフォルダ内に独立したPython環境(python_embedフォルダ)が生成されます。
DOS
:: start.bat の抜粋:curlとPowerShellによる展開
curl -sL -o "%PYZIP%" "%PYURL%"
powershell -NoProfile -Command "Expand-Archive -Path '%PYZIP%' -DestinationPath '%PYDIR%' -Force"
ステップ2:パッケージ管理ツール(pip)の導入
Embeddable版のPythonには、初期状態で pip が含まれていません。そのため、公式の get-pip.py を動的にダウンロードし、先ほど展開したローカルの python.exe を使って実行・インストールします。
ステップ3:【技術的急所】python311._pth の書き換え
ここがPMとして最もデバッグに時間を割いたポイントです。
Embeddable版Pythonはセキュリティと独立性の観点から、デフォルトでは自分がインストールした外部ライブラリ(site-packages)を認識しません。
この問題を解決するため、バッチファイルから専用のPythonスクリプト fix_pth.py を呼び出しています。
Python
# fix_pth.py の抜粋:_pthファイルの動的修正
# 埋め込み版の python311._pth を読み込み、以下を追記・修正する
lines.append("Lib\\site-packages\n")
# "# import site" のコメントアウトを解除し "import site\n" に置換
このスクリプトが設定ファイル(_pth)を動的に書き換えることで、初めて pip で入れたモジュールが動作するようになります。ユーザーに手作業でテキストファイルを編集させるようなUXの悪化を、コードの力で防ぎました。
ステップ4:依存モジュールのインストールとメイン処理の実行
環境が整った後、pyautogui や Pillow などの必要なモジュールを一括インストールします。 最後に、文字化けを防ぐための環境変数 PYTHONIOENCODING=utf-8 をセットし、メインロジックである kindle_auto.py に処理をバトンタッチします。
このように、start.bat は単なる起動用ショートカットではなく、「どんなWindows環境でも確実に同じ動作を保証する」ためのインフラストラクチャー・アズ・コード(IaC)的な役割を果たしています。


コメント