📖

ずっと欲しかったPDFリーダーを個人開発している話

に公開
1

はじめに

こんにちは、@togatogaです。検索とRustが好きなソフトウェアエンジニアです。

私は技術書を読むのが好きです。近年はAIやLLMのサービスの発展により和訳や解説を手軽に得られるようになったこともありPDF形式で技術書を購入することが増えました。しかし、既存のPDFリーダーには私が欲しい機能が不足しており、読書体験があまり良くありませんでした。

私がPDFリーダーに求めている要件は以下の通りです。

  1. 前のページの図表や文章を見つつ、今のページを読みたい(特に数ページ前の内容を参照したい場合)
    • 巻末の答えや解説を見ながら問題を読みたい
    • 下手に移動すると今読んでいるページを見失う
  2. 英語の文章の翻訳・解説を「文章全体の翻訳・解説」「この文章内での単語の翻訳・解説」「文章自体の解説」など柔軟に行いたい
    • 毎回、GeminiやChatGPTのWebUIにコピペするのは面倒
  3. LinuxとmacOSで動作する
  4. Googleドライブと連携したい

様々なPDFリーダーを試しましたが、これらの要望を満たすものは見つかりませんでした。
2025年にAI Agent(Claude Code)が大きく進化して個人開発のハードルが大きく下がったので、自分が欲しかった機能を詰め込んだPDFリーダーを開発することにしました。

PDFリーダー「Pedaru」について

PDFなのでPから始まる名前にしたいなと思い、「pedal」にしようと考えていましたがすでに同名のリポジトリがあったので、「pedaru(ペダル)」にしました。


Pedaruのメイン画面

https://github.com/togatoga/pedaru

インストール方法

直接ソースコードをクローンしてビルドしてください。LinuxとmacOSでは動作確認しています。Windowsでも動くはずですが動作検証はしていません。要望があればApp Storeでの配布も検討します。

Prerequisites

  • Node.js >= 18.17.0
  • Rust >= 1.85
  • Tauri
git clone https://github.com/togatoga/pedaru
cd pedaru
npm install
npm run tauri build

## macOSの場合
src-tauri/target/release/bundle/macos/Pedaru.app
src-tauri/target/release/bundle/dmg/Pedaru_0.1.0_aarch64.dmg


Applicationsにコピー(Pedaru_0.1.0_aarch64.dmgを開く)

技術スタック

Pedaruは以下の技術を組み合わせて開発しています。

カテゴリ 技術
フロントエンド React, Next.js, TypeScript, Tailwind CSS
デスクトップフレームワーク Tauri 2.x(Rust)
PDFレンダリング PDF.js
データベース SQLite

私がRustが好きなのでTauriを選択しました。細かい技術選定はClaude Codeに任せつつ、必要に応じて自分で調査・実装を行いました。

最初はreact-pdfでPDFレンダリングを行っていましたが、PDF上で表示されている文字と選択可能な文字が大幅にずれる問題があり、最終的にはPDF.jsを直接組み込む形に落ち着きました。

Pedaruの主要機能

主要な機能を紹介します。macOSのCmdはWindows/LinuxではCtrlに読み替えてください。

基本的なPDF閲覧機能

PDFリーダーとしての基本的な機能を備えています。特徴的なのはウェブブラウザのタブやウィンドウのように複数のページを同時に開ける点です。


タブとウィンドウの例

タブ機能

複数のPDFをタブで開いて切り替えたり、同じPDFの異なるページをタブで比較したりできます。Cmd+Tで新しいタブを開き、Cmd+[/Cmd+]でタブ間を移動できます。

ウィンドウ

特定のタブをドラッグ&ドロップまたはCmd+Nで新しい独立したウィンドウとして開くことができます。図表などを参照しながら読み進めるのに便利です。

ナビゲーション機能

目次(Table of Contents)

PDFに含まれる目次情報をサイドバーに表示し、クリックすることで該当ページにジャンプできます。

全文検索

Cmd+FでPDF全体を対象にした全文検索ができます。検索結果は/キーでプレビューしながら移動でき、Enterで確定します。

履歴機能とブックマーク

閲覧履歴をCtrl+,/Ctrl+.で遡ったり進んだりできます。またCmd+Bで重要なページにブックマークを付けて素早くアクセスできます。

セッション永続化

閲覧状態はすべてSQLiteデータベースに自動保存されます。ページ位置、ズーム倍率、ブックマーク、タブ、ウィンドウの状態が保持され、PDFを再度開いたときに前回の続きから読み始められます。

Gemini翻訳機能

AIを活用した翻訳・解説機能を搭載しています。対応しているのはGoogleのGeminiモデルです。
GeminiのAPIキーはユーザー自身で取得して設定する必要があります。Google AI Studioでプロジェクトを作成しAPIキーを取得して保存してください。

Translation設定画面
Translation設定画面

テキスト選択からの即時翻訳

読みたいテキストを選択し、Cmd+Jを押すだけで選択範囲のテキストを即座に翻訳します。テキスト選択後に右クリックメニューからも翻訳を実行できます。翻訳ポップアップはドラッグで好きな位置に移動できます。
翻訳するときのテクニックとして、翻訳する文章の前後を含めてコンテキストとして渡すことで、より自然な翻訳が得られます。プロンプトでは「文章」と「単語」で翻訳の目的を区別しています。

  • 「文章」なら文章全体の翻訳・解説
    文章の翻訳
    文章の翻訳例
  • 「単語」ならその文章内での単語の翻訳・解説・言い換え
    単語の翻訳
    単語の翻訳例

AI解説

Cmd+Eを押すと、文章を要約したり、内容を詳しく解説したりできます。翻訳機能と同様に、右クリックメニューからも実行できます。

AI解説機能
AI解説機能の例

インポート機能

PedaruはローカルファイルとGoogle Driveの両方からPDFをインポート(ローカルにダウンロード)できます。インポートしたPDFは本棚に追加され、いつでもアクセスできます。

本棚

インポートしたPDFファイルを本棚として一覧表示できます。サムネイル表示で視覚的にPDFを探しやすくなっています。

本棚の画面(ブックマークしたPDF一覧)
本棚の画面(ブックマークしたPDF一覧)

ローカルファイルインポート

ローカルに保存されているPDFファイルをPedaruにインポートできます。フォルダまたはファイルを選択することでPDFを本棚に追加することができます。

ローカルファイルインポート
ローカルファイルインポートの画面

Google Drive連携インポート

Googleドライブ上のフォルダやPDFファイルをダウンロードしてPedaruにインポートできます。ダウンロードはバックグラウンドで進行し、進捗が表示されます。

Google Drive連携インポート
Google Drive連携インポートの画面

OAuthのGoogle Client IDとClient Secretはユーザー自身で取得して設定する必要があります。Google Cloud ConsoleでOAuth 2.0クライアントIDを作成し、保存してください。

PedaruのOAuthの設定
PedaruのOAuthの設定画面

まとめ

自作してから一週間ほど使っていますが、非常に快適にPDFを読めています。特にGemini翻訳機能は英語の技術書で威力を発揮しており、読書の効率が大幅に向上しました。タブやウィンドウ機能も、数ページ前の図表を参照しながら読み進めるのに重宝しています。
フロントエンド開発に非常に苦手意識があったのですが、Claude Codeの助けもありなんとか形にすることができました。今後は異なるデバイス間でも読書の進捗が同期できるようにしたり、iOSやAndroid向けにも開発できたらなと考えています。

GitHubで編集を提案

Discussion

studioflugelstudioflugel

技術書の多くはセキュリティで抽出禁止が設定されており、テキスト選択が出来ないことが多いのですがどう対応されているのでしょうか?もしくはセキュリティ対応されていないのでしょうか?