A 'notes file' based book reading notes solution - 一种以笔记文件为中心的读书笔记方案
Pre
读书做笔记,通常有以下办法
- 直接在支持标注的pdf文件里插入标注,这种标注会跟嵌入在pdf文件内,用任何pdf阅读软件打开都能看到。
- 另外新建一个文件记录笔记。
- 使用一些读书笔记软件。
经典的有类似文献管理软件Zotero,较新的有像Obsidian这样的专注笔记的软件等。他们也都可以安装插件,实现各种联动和笔记的管理:像是平台间同步,生成跳转到pdf文件笔记处的url链接等。
古早使用Zotero来做笔记的困惑和思索 Zotero Using: Annotation organization think
zotero自带的add notes from annotation可以实现导出笔记功能,除了page外甚至还会带上annotaion的具体位置。
另外最近摸索了下pdf中annotaion管理的问题:
- 如果在zotero里标注,标注只能在zotero里查看,是没有写入到pdf文件里的,而是储存在zotero自己的数据库里;
- 如果是系统的预览app或一些其他pdf阅读器标注是会写入到pdf文件里的,任何阅读器都能查看到;
- 将标注嵌在pdf文档中的缺点是其文件大小肉眼可见地变大了,一两个标注就能增加上100kb+,但其实有效信息也就几十个字而已。
- 利用zotero来写标注是实现了pdf文件和标注分离,但是信息又嵌在了zotero中,你需要维护zotero的整个数据库保证标注安全
- 如果要将标注剥离出来成为单独的文件那么就可以用生成md/txt文件的方法,
- 剥离md文件是很好的方案,但是也带来了一些问题:md文件中的标注可以通过点击里面的链接来跳转到zotero,但是反过来很难实现在zotero里阅读的同时让md也实时地滚动到对应处的笔记
在说我的痛点之前,先总结一下:
- 首先将标注直接写在pdf文件中似乎是个不错的选择,兼容性好,对于各种支持pdf标准标注的软件来说都可以看到。但是pdf二进制文件的性质使得其不方便进行变更的同步,一处改动则需要同步更新这个文件才行。我需要一种可以解耦笔记与原pdf文件本身的方案
- 另外新建一个笔记的方法则进行了彻底地pdf文件与笔记的解耦,读书笔记与pdf本身没有直接的联系,我只需要管理笔记文件本身的更新。这是正确的方向。但是解耦的代价是笔记本身失去了与pdf本身的关联,笔记的内容与pdf文件本身的关联全靠文字提示与大脑记忆。于是诞生了需要在笔记中插入pdf内容标记索引的需求,形式一般是一定格式的文字,例如第几行第几页;也可以是一个url。目的是可以快速跳转到对应的pdf位置,帮助回忆。可以说这种思路没有问题。
- 事实上,三方软件及其插件基本上都是第二点末尾提到的思路。比如Zotero将标注的数据存在了自己的数据库里,可以在自己软件内进行平台间的同步,但是这时的笔记还只是标注,与pdf密不可分,距离笔记的形态还是有距离,所以一般还是会通过导出笔记到专门的笔记软件如Obsidian中进行管理。Obsidian内也可以通过插件将pdf读书集成到应用中,实现一边读书一边做笔记并生成笔记链接url。
下面说说我的痛点:
总体上我准备采用第三种方案,在单独的文件中做笔记,并通过软件将pdf标注生成url方便索引。
- 但是看了下现有的一些方案,基本上这种生成的索引都是单向的,即可以从url跳转到pdf文件处,但是无法在pdf读到那个地方时候跳到笔记文件对应处。
- 如果在pdf文件中同步直接标注,则可以直接在阅读pdf文件时候同步看到当前对应的高亮和标注。但是这又引入我上面说到的pdf直接标注的缺点了,你需要同时管理其中的pdf二进制文件,工作量又增加了。
- 也有些Obsidian三方可能会采取这样一种策略,将高亮标注信息保存在插件内部数据库:当你在通过这个插件阅读pdf时,标注一条数据会在生成的url索引中,插入‘插件内部数据库关于这条高亮的信息’,这样就既不用维护pdf文件,又能在pdf中显示高亮数据了。(Zotero进行标注时采用的就是这种方法,将数据全部存于Zotero本地的数据库内。)但是要注意,不用维护pdf文件是好处,带来的问题是你相当于需要维护这个插件的数据库,数据库丢失了或者数据出问题了,标注信息也就丢失了。当然维护数据自然是记笔记需要付出的代价,但是相比与一个human-unreadable数据库,我更愿意维护一个human-readable单个笔记文件。可读是很重要的,即使在最恶劣的情况下,系统坏掉,但是由于肉眼可读,只要可以打开这个笔记文本文件本身,那你的数据就可以恢复。当然对于大型系统来说数据库系统无疑是高效于文件系统的,只是在我的笔记系统里,这是是不适合的而已。
Solution:
那么首先归纳我的需求
- 以
笔记文件为中心,笔记存于pdf文件之外,一切标注数据存于单个文本笔记文件中; - 在阅读的时候可以自动同步展示
笔记文件中对应笔记。当然在笔记文件中也可以同步展示pdf中对应的引用处。 - (附加)从
笔记文件中获取数据,并在在pdf中展示高亮。
解决方案
几经查找发现了一个比较合适的方案。EMacs下的pdf-tools + org-noter, 满足了需求1和2中annotation剥离和同步阅读的问题。
所有我需要的信息保存在一个单独的org文件中,阅读PDF时,笔记文件中的标注会自动同步滚动到对应处。
缺点 Cons:
- 是标注不能在pdf文件中高亮显示。
- Emacs是桌面全平台,但是没有iOS端
缺点改进:
缺点1的问题是可以解决的,为之增加了根据笔记文件中的高亮信息一键在pdf中嵌入高亮和标注的功能。org-noter-embed-all-org-note-to-pdf
这个方法可以将一个没有任何标注的pdf,嵌入笔记文件中的高亮。当然你无需维护这个pdf,因为所有信息都在笔记文件中,你随时可以生成标注。我一般做法是阅读时生成标注信息,而不把标注真正的保存进pdf中。缺点2的问题目前只能workaround
虽然不能完全解决,但是因为在移动平台上使用得不多,可以在桌面端将标注嵌入pdf文件,因为pdf文件的标注的兼容性,在iOS上自然是可以查看的。不过,想要进行标注的修改更新的话还是要到笔记文件中更新。
其实想要实现更新在pdf文件中更新来同步更新标注,可以像缺点1那样,修改org-noter从pdf导出标注的方法,将其导出数据格式适配为包含高亮region数据的格式。这样更新了pdf数据后,将其导出到笔记文件,实现同步。这样就实现双向无缝同步了。
但是习惯上因为很少在移动端阅读,所以这个需求不是很迫切,适配工作会延后。
Demo

demo content:
- sync pdf display to current heading note
- sync pdf display and notes between heading notes
- sync notes display to current pdf view page automatically
- embed notes from notes file to pdf file (personal impelmentation)
graph TD;
A(pdf) --- O
B(pdf) --- O
C(pdf) --- O
subgraph E[org-noter in Emacs]
O(org-file)
end
O --- |sync| G[(Git repository)]
Oa --- |sync| G[(Git repository)]
subgraph Ea[org-noter in Emacs]
Oa(org-file)
end
Oa --- H(pdf)
Oa --- I(pdf)
Oa --- J(pdf)
(Optional) 从pdf导出标注
org-noter也支持从pdf中导出其中outline/链接/标注信息到笔记文件的功能。
不过导出的高亮标注的文本格式我还没有与我新添加的org-noter-embed-all-org-note-to-pdf功能做适配器,导出的文本不能使用我添加的embed功能。
其实以现在既然以笔记文件为中心,所有信息都应该是在笔记中的,从pdf中导出标注的功能可以说一般是不需要的,只有两种场景会用到:
- 从旧pdf进行迁移,导入数据
- 从pdf中导出outline
- 在移动平台上直接对pdf进行了更新,于是从pdf中导出数据到
笔记文件,进行数据更新。
鉴于目前这方面需求不是很迫切,适配工作会延后。
(Optional) org-pdftools
这是另一个用于补充功能的Package,可以生成一个url来进行跳转。可能大家更为熟悉这种方式,不过对我来说比较鸡肋,org-noter本身已具有同步显示功能
关于pdf-tools + org-noter 的具体使用,可以看另一篇
Using-pdf-tools-org-noter-in-Emacs



