コンテンツにスキップ

電子書籍学習ワークフロー 実装計画

📁 docs/ebook-learning/plan/implementation-plan.md

関連Issue: KZ55230/MyLab#292


概要

DLsite等の電子書籍(PDF/画像ZIP)をOCR処理し、Claude APIで要約・分析してObsidianにナレッジとして蓄積するパイプラインを構築する。

⚠️ スコープ外: DRM付きKindleのDRM解除は実装しない。入力はDRMフリーのPDF/ZIPのみとする。


ワークフロー全体像

入力ファイル(PDF or 画像ZIP)
① pdf_processor.py  ── PDF/ZIPを画像リストに正規化
② ocr_processor.py  ── macOS Vision Framework で日本語OCR
③ ai_analyzer.py    ── Claude API で要約・キーコンセプト抽出
④ obsidian_exporter.py ── Markdown化してvaultに保存

フェーズ構成

Phase 1: PDF/ZIP → 画像変換(pdf_processor.py)

目的: 様々な入力形式を画像のリストに統一する

入力形式 処理
テキスト埋め込みPDF pdfplumber でテキスト直接抽出 → OCR不要
スキャンPDF PyMuPDF(fitz) でページごとに画像化
画像ZIP(DLsite等) ZIPを展開して画像ファイルリストを取得

依存ライブラリ: - PyMuPDF (fitz): PDFページ → 画像 - pdfplumber: テキスト埋め込みPDF のテキスト抽出 - Pillow: 画像前処理


Phase 2: OCR処理(ocr_processor.py)

目的: 画像から日本語テキストを高精度に抽出する

  • macOS Vision Framework を使用(monthly-expense-trackerの実績あり)
  • 縦書き・横書き両対応
  • ページ単位でテキストを返す

注意点: - テキスト埋め込みPDFはOCR不要(Phase 1 でスキップ判定) - 画像解像度が低い場合はアップスケール処理を挟む


Phase 3: AI分析(ai_analyzer.py)

目的: 抽出テキストからナレッジを生成する

Claude API(claude-sonnet-4-6)に以下を依頼:

出力 内容
概要要約 本全体の200字程度の要約
章ごとの要点 各章の重要ポイント箇条書き
キーコンセプト 覚えるべき用語・概念一覧
学習メモ 実践・応用できるポイント
関連タグ Obsidian タグ候補

トークン節約戦略: - 全ページを一度に送らず、章単位で分割処理 - テキストが長い場合はページ要約 → 全体要約の2段階


Phase 4: Obsidian出力(obsidian_exporter.py)

目的: 分析結果を構造化Markdownとしてvaultに保存する

出力先: ~/repos/MyLab/vault/読書ノート/

Markdownテンプレート:

---
title: {{タイトル}}
source: {{DLsite/PDF/etc}}
date: {{処理日}}
tags: [読書, {{AIが提案したタグ}}]
---

## 概要
{{要約}}

## 章ごとの要点
{{章別ポイント}}

## キーコンセプト
{{用語・概念}}

## 学習メモ
{{実践ポイント}}


技術スタック

役割 ライブラリ
PDF処理 PyMuPDF, pdfplumber
OCR macOS Vision Framework (pyobjc)
AI分析 anthropic (Claude API)
設定管理 PyYAML
画像処理 Pillow

タスクリスト

  • Phase 1: pdf_processor.py 実装
  • Phase 2: ocr_processor.py 実装(monthly-expense-trackerのVisionコードを流用)
  • Phase 3: ai_analyzer.py 実装
  • Phase 4: obsidian_exporter.py 実装
  • main.py でパイプライン結合
  • DLsiteのZIP形式で動作確認
  • スキャンPDFで動作確認

未決事項

  • Kindleについて: DRMフリー版の購入方法をドキュメント化するか検討
  • LiquidTextとの連携: エクスポートしたノートの取り込み手順をドキュメント化するか検討
  • チャンク分割戦略: 長い本をどう分割してAPIに渡すか(トークン制限対策)