アクティブ読書用のScrapboxプロジェクトをPDFから作る
アクティブ読書とは?
>本をブラウザで読めるようにして編集しながら読むと読書体験が格段に向上する。
本をブラウザ(=Scrapbox)で読むことにより良いことがありそう
本をScrapboxで読むとは?
ざっくりとしたイメージ
mmdsequenceDiagram
autonumber
actor ユーザー
ユーザー ->> Gyazo: 本をupload
Gyazo -->> ユーザー: PermalinkとOCR結果を取得
ユーザー ->> Scrapbox: Gyazoから取得した②の結果をimport
Scrapbox -->> ユーザー: import成功
ユーザー ->> Scrapbox: リンクを張れる、キーワード検索ができる
作ったプロジェクト
プロジェクトのイメージ
プロジェクトのトップ
検索画面
ページの遷移
作り方
前提条件
※ おひとりさま用で楽しむものとして作る前提
Gyazo側
API経由でuploadするため
GyazoのOCR機能を利用するため
Scrapbox側
1. 第三者が閲覧できないprivateなもの
2. メンバーは自分ひとりで誰も招待しない
目次
3. jsonの集約(おまけ)
4. import
5. 完成
6. 気づき
7. 未解決問題
最終的にほしいもの
PDF
からこんなファイルがほしい、そのために…
GyazoのPermalinkリスト.txthttps://gyazo.com/PDFの1ページ目の画像URL
https://gyazo.com/PDFの2ページ目の画像URL
https://gyazo.com/PDFの3ページ目の画像URL
https://gyazo.com/PDFの4ページ目の画像URL
https://gyazo.com/PDFの5ページ目の画像URL
https://gyazo.com/PDFの6ページ目の画像URL
https://gyazo.com/PDFの7ページ目の画像URL
https://gyazo.com/PDFの8ページ目の画像URL
...
https://gyazo.com/PDFの最終ページの画像URL
こんな仕組みがほしい
1. PDF
を1ページずつばらしてGyazoにupload ①②
mmdsequenceDiagram
autonumber
box PC
participant Browser
participant PDF to Scrapbox
end
Browser ->> PDF to Scrapbox: PDFをupload
loop 1ページずつ
PDF to Scrapbox ->> Gyazo: API経由でupload
Gyazo ->> PDF to Scrapbox: Gyazo Permalink
end
PDF to Scrapbox ->> Browser: ページ数に応じたGyazo Permalinkのリスト
note right of Browser: GyazoのPermalinkリスト
par 裏で
Gyazo ->> Gyazo: OCR
end
実現方法
>
実際に動かした様子
フローのイメージ
mmdsequenceDiagram
autonumber
participant PC
note right of PC: GyazoのPermalinkリスト
par 裏で
Gyazo ->> Gyazo: OCR
end
loop OCRが終わったと思ったらscriptで実行
PC ->> Gyazo: API経由でPermalinkのOCR結果を要求
Gyazo ->> PC: OCR結果を取得
PC ->> PC: Scrapbox import用jsonに整形
end
note right of PC: Scrapbox import用json
PC ->> Scrapbox: jsonをimport
Scrapbox ->> Scrapbox: import処理
Scrapbox ->> PC: import成功
解説
response.json{ "image_id": "27a454jn3ij...", (略)
"permalink_url": "http://gyazo.com/27a454jn3ij...", (略)
"ocr": { (略), "description": "OCR結果です\n" } }
2. Responseの以下の情報を取得
permalink_url
(画像を使うため)
ocr.descripttion
(OCR結果を使うため)
これを…
解説
Scrapbox import用にこんな感じに整形したい
Scrapbox import用のjsonのフォーマット.json{ "pages": [ {
{
"title":"0001: サンプル4コマ",
"lines":[
{"text":"0001: サンプル4コマ"},
{"text":""},
{"text":"[http://gyazo.com/27a454jn3ij...]"}, // permalink_url
{"text":"OCR結果です"}, // ocr.descripttion
{"text":""}
]
},
...(略)
}]}
解説
mmdsequenceDiagram
autonumber
loop OCRが終わったと思ったらscriptで実行
PC ->> Gyazo: API経由でPermalinkのOCR結果を要求
Gyazo ->> PC: OCR結果を取得
PC ->> PC: Scrapbox import用jsonに整形
end
解説
先述のスクリプトにより2種類のjsonを生成している
1. indexページ
1P, 2P, 3P...とページ順にリンクが並んでいる
2. 画像ページ
画像とOCR結果が埋め込まれている
1. indexページ_1
ページのリンクを順番に記載したページのjson
index.json{ "pages": [
{
"title": "サンプル4コマ.pdf_index",
"lines": [
{ "text": "" },
{ "text": "サンプル4コマ.pdf_index" },
{ "text": "[0001: サンプル4コマ.pdf]" }, // ここからページ順
{ "text": "[0002: サンプル4コマ.pdf]" },
{ "text": "[0003: サンプル4コマ.pdf]" },
{ "text": "[0004: サンプル4コマ.pdf]" }
]
}
]}
1. indexページ_2
2. 画像ページ_1
画像とOCR結果を表示するページのjson(抜粋)
pages.json{ "pages": [
(略)
{
"title":"0002: サンプル4コマ.pdf",
"lines":[
{"text":"0002: サンプル4コマ.pdf"},
{"text":"[0001: サンプル4コマ.pdf] | [0003: サンプル4コマ.pdf]"},
{"text":"[[http://gyazo.com/93845jt5349...]]"},
{"text":"code:93845jt5349..."},
{"text":" OCR結果です"},
{"text":" "},
]
},
(略)
]}
2. 画像ページ_2
切れてるが、↑この辺にOCR結果が各々のページに埋め込まれている
2. 画像ページ_3
(このページいらないかも)
この作り方だと1 PDF
= 2json(index.json, 画像ページ.json)になる
前のページ、次のページなどのリンクを付けておく
このあたりはどういう情報を持たせるとよいのかまだわかっていない
ページ名のルールさえ決まっていれば、UserScriptで移動させてもいいと思う
3. jsonの集約(おまけ)
作ったjsonがたくさんあるとimportするのが手間…
おまけなので、以下な人はスキップしてもOK
「1回やるだけなので手動でやるぜ」
「importする処理は自前で整備してあるぜ」
4. import
jsonをProject settings > Page Dataからimport
>
もし、ページをぐちゃぐちゃにしてもjsonさえあれば何度でも復元できる
5. 完成
プロジェクトトップ
PDF
の1ページ = Scrapboxの1ページ + index
indexページ
PDF
へのリンクがページ順に並んでいる
検索結果
OCR結果をくっつけているので検索できる
あとは好きにリンクを貼ったり言及したりすればよい
デモ
ページ間はUserScriptで←→遷移できるようにした
タイトルの連番を加算/減算するだけ
6.気づき
6.1. 気づき
著者・翻訳者の繋がり
例: 「情報セキュリティの敗北史」の小林啓倫氏って前もどこかで見たような…「テトリスエフェクト」の翻訳もやっていたのか!
6.2. 気づき
同時読みがしやすい
例: 「Unix哲学」ってよく聞くから調べてみよう…多くの本で言及されてる!ページまでわかる!
6.3. 気づき
同時読みがしやすい
例: 「WEB+DB PRESSのメール系の特集ってどのくらいあったかな…?」
7. 未解決問題
PDFリーダーなどと比べるととんでもなく遅い
絶対に通信が入るのでmsecも積もれば結構な遅さ
1ページ1ページじっくり読むタイプの本なら気にならないかな?
本同士が繋がるのが楽しいので今のところ1つのプロジェクトに集めている
本(ページ)の削除・リネーム
1つずつ手を入れるしかない
これを OCR
で引っ掛けたい