A 'notes file' based book reading notes solution - 一种以笔记文件为中心的读书笔记方案

Pre

读书做笔记,通常有以下办法
  1. 直接在支持标注的pdf文件里插入标注,这种标注会跟嵌入在pdf文件内,用任何pdf阅读软件打开都能看到。
  2. 另外新建一个文件记录笔记。
  3. 使用一些读书笔记软件。

    经典的有类似文献管理软件Zotero,较新的有像Obsidian这样的专注笔记的软件等。他们也都可以安装插件,实现各种联动和笔记的管理:像是平台间同步,生成跳转到pdf文件笔记处的url链接等。

古早使用Zotero来做笔记的困惑和思索 Zotero Using: Annotation organization think

zotero自带的add notes from annotation可以实现导出笔记功能,除了page外甚至还会带上annotaion的具体位置。
另外最近摸索了下pdf中annotaion管理的问题:

  1. 如果在zotero里标注,标注只能在zotero里查看,是没有写入到pdf文件里的,而是储存在zotero自己的数据库里;
  2. 如果是系统的预览app或一些其他pdf阅读器标注是会写入到pdf文件里的,任何阅读器都能查看到;
  3. 将标注嵌在pdf文档中的缺点是其文件大小肉眼可见地变大了,一两个标注就能增加上100kb+,但其实有效信息也就几十个字而已。
  4. 利用zotero来写标注是实现了pdf文件和标注分离,但是信息又嵌在了zotero中,你需要维护zotero的整个数据库保证标注安全
  5. 如果要将标注剥离出来成为单独的文件那么就可以用生成md/txt文件的方法,
  6. 剥离md文件是很好的方案,但是也带来了一些问题:md文件中的标注可以通过点击里面的链接来跳转到zotero,但是反过来很难实现在zotero里阅读的同时让md也实时地滚动到对应处的笔记
在说我的痛点之前,先总结一下:
  1. 首先将标注直接写在pdf文件中似乎是个不错的选择,兼容性好,对于各种支持pdf标准标注的软件来说都可以看到。但是pdf二进制文件的性质使得其不方便进行变更的同步,一处改动则需要同步更新这个文件才行。我需要一种可以解耦笔记与原pdf文件本身的方案
  2. 另外新建一个笔记的方法则进行了彻底地pdf文件与笔记的解耦,读书笔记与pdf本身没有直接的联系,我只需要管理笔记文件本身的更新。这是正确的方向。但是解耦的代价是笔记本身失去了与pdf本身的关联,笔记的内容与pdf文件本身的关联全靠文字提示与大脑记忆。于是诞生了需要在笔记中插入pdf内容标记索引的需求,形式一般是一定格式的文字,例如第几行第几页;也可以是一个url。目的是可以快速跳转到对应的pdf位置,帮助回忆。可以说这种思路没有问题。
  3. 事实上,三方软件及其插件基本上都是第二点末尾提到的思路。比如Zotero将标注的数据存在了自己的数据库里,可以在自己软件内进行平台间的同步,但是这时的笔记还只是标注,与pdf密不可分,距离笔记的形态还是有距离,所以一般还是会通过导出笔记到专门的笔记软件如Obsidian中进行管理。Obsidian内也可以通过插件将pdf读书集成到应用中,实现一边读书一边做笔记并生成笔记链接url。
下面说说我的痛点:

总体上我准备采用第三种方案,在单独的文件中做笔记,并通过软件将pdf标注生成url方便索引。

  1. 但是看了下现有的一些方案,基本上这种生成的索引都是单向的,即可以从url跳转到pdf文件处,但是无法在pdf读到那个地方时候跳到笔记文件对应处。
  2. 如果在pdf文件中同步直接标注,则可以直接在阅读pdf文件时候同步看到当前对应的高亮和标注。但是这又引入我上面说到的pdf直接标注的缺点了,你需要同时管理其中的pdf二进制文件,工作量又增加了。
  3. 也有些Obsidian三方可能会采取这样一种策略,将高亮标注信息保存在插件内部数据库:当你在通过这个插件阅读pdf时,标注一条数据会在生成的url索引中,插入‘插件内部数据库关于这条高亮的信息’,这样就既不用维护pdf文件,又能在pdf中显示高亮数据了。(Zotero进行标注时采用的就是这种方法,将数据全部存于Zotero本地的数据库内。)但是要注意,不用维护pdf文件是好处,带来的问题是你相当于需要维护这个插件的数据库,数据库丢失了或者数据出问题了,标注信息也就丢失了。当然维护数据自然是记笔记需要付出的代价,但是相比与一个human-unreadable数据库,我更愿意维护一个human-readable单个笔记文件。可读是很重要的,即使在最恶劣的情况下,系统坏掉,但是由于肉眼可读,只要可以打开这个笔记文本文件本身,那你的数据就可以恢复。当然对于大型系统来说数据库系统无疑是高效于文件系统的,只是在我的笔记系统里,这是是不适合的而已。

Solution:

那么首先归纳我的需求
  1. 笔记文件为中心,笔记存于pdf文件之外,一切标注数据存于单个文本笔记文件中;
  2. 在阅读的时候可以自动同步展示笔记文件中对应笔记。当然在笔记文件中也可以同步展示pdf中对应的引用处。
  3. (附加)从笔记文件中获取数据,并在在pdf中展示高亮。
解决方案

几经查找发现了一个比较合适的方案。
EMacs下的pdf-tools + org-noter, 满足了需求12中annotation剥离和同步阅读的问题。
所有我需要的信息保存在一个单独的org文件中,阅读PDF时,笔记文件中的标注会自动同步滚动到对应处。

缺点 Cons:
  1. 是标注不能在pdf文件中高亮显示。
  2. Emacs是桌面全平台,但是没有iOS端
缺点改进:
  1. 缺点1的问题是可以解决的,为之增加了根据笔记文件中的高亮信息一键在pdf中嵌入高亮和标注的功能。
    org-noter-embed-all-org-note-to-pdf
    这个方法可以将一个没有任何标注的pdf,嵌入笔记文件中的高亮。当然你无需维护这个pdf,因为所有信息都在笔记文件中,你随时可以生成标注。我一般做法是阅读时生成标注信息,而不把标注真正的保存进pdf中。
  2. 缺点2的问题目前只能workaround
    虽然不能完全解决,但是因为在移动平台上使用得不多,可以在桌面端将标注嵌入pdf文件,因为pdf文件的标注的兼容性,在iOS上自然是可以查看的。不过,想要进行标注的修改更新的话还是要到笔记文件中更新。
    其实想要实现更新在pdf文件中更新来同步更新标注,可以像缺点1那样,修改org-noter从pdf导出标注的方法,将其导出数据格式适配为包含高亮region数据的格式。这样更新了pdf数据后,将其导出到笔记文件,实现同步。这样就实现双向无缝同步了。
    但是习惯上因为很少在移动端阅读,所以这个需求不是很迫切,适配工作会延后。

Demo

org-noter_demo
demo content:

  1. sync pdf display to current heading note
  2. sync pdf display and notes between heading notes
  3. sync notes display to current pdf view page automatically
  4. 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中导出标注的功能可以说一般是不需要的,只有两种场景会用到:

  1. 从旧pdf进行迁移,导入数据
  2. 从pdf中导出outline
  3. 在移动平台上直接对pdf进行了更新,于是从pdf中导出数据到笔记文件,进行数据更新。
    鉴于目前这方面需求不是很迫切,适配工作会延后。
(Optional) org-pdftools

这是另一个用于补充功能的Package,可以生成一个url来进行跳转。可能大家更为熟悉这种方式,不过对我来说比较鸡肋,org-noter本身已具有同步显示功能

关于pdf-tools + org-noter 的具体使用,可以看另一篇
Using-pdf-tools-org-noter-in-Emacs