DIY Kobo 注释备份
摘要
一份指南,介绍如何使用结合了 sqlite 和 ImageMagick 的脚本备份 Kobo 电子书阅读器中借阅图书的注释。
<p><a href="https://lobste.rs/s/e0vpej/diy_kobo_annotation_backup">评论</a></p>
查看缓存全文
缓存时间: 2026/06/08 03:19
# DIY Kobo 注释备份 来源:https://kghose.github.io/2026/06/06/kobo-annotations.html 2026年6月6日 **问题**:Kobo 对拥有的(DRM 或非 DRM)电子书提供“导出注释”功能,但借阅的电子书没有。我在所有书籍上都做了注释,并且喜欢之后查阅它们。
**解决方案**:可以利用 Kobo 上的数据,使用以下脚本创建一个 PDF 文档,包含你在一本图书馆书籍中所做的所有注释(需要安装 sqlite 和 ImageMagic):
````
#!/bin/sh
set -x
if [[ $# -lt 2 ]]; then
echo "Usage: $0 <bookname> <output.pdf>"
exit 1
fi
BOOKNAME=$1
OUTFILE=$2
KOBODIR="${HOME}/Documents/Kobo-backup/.kobo"
# 创建一个临时目录并保存其名称到变量。
TEMPD=$(mktemp -d)
# 如果临时目录创建失败则退出。
if [ ! -e "$TEMPD" ]; then
>&2 echo "Failed to create temp directory"
exit 1
fi
# 确保脚本退出时删除临时目录。
trap "exit 1" HUP INT PIPE QUIT TERM
trap 'rm -rf "$TEMPD"' EXIT
echo "Created temp dir."
PARAM=".param set :bookname %${BOOKNAME}%"
QUERY="SELECT \
Bookmark.BookmarkID \
FROM Bookmark,content \
WHERE \
content.ContentID = Bookmark.ContentID \
AND content.BookTitle LIKE :bookname \
ORDER BY Bookmark.ChapterProgress"
BOOKMARK_IDS=$(sqlite3 --readonly -batch -noheader "${KOBODIR}/KoboReader.sqlite" "${PARAM}" "${QUERY};")
count=0
for id in ${BOOKMARK_IDS}
do
idx=$(printf "%04d" $count)
echo "Processing page ${idx} of annotations."
magick composite -compose multiply "${KOBODIR}/markups/${id}.svg" "${KOBODIR}/markups/${id}.jpg" $TEMPD/annotation-${idx}.jpg
count=$((count+1))
done
magick "$TEMPD/annotation*.jpg" ${OUTFILE}
````
脚本中如果 `BOOKNAME` 包含 `'` 存在引号问题,我懒得解决了。
## 细节
### 原始文件
`/.kobo/markups` 目录包含成对的文件,看起来像:
````
.jpg
.svg
````
这些是页面截图和你的注释(.svg 格式)。可以使用 ImageMagick 合并:
````
magick composite -compose multiply "${KOBODIR}/markups/${id}.svg" "${KOBODIR}/markups/${id}.jpg" annotation-${idx}.jpg
````
其中 idx 是我们设置的计数器,用于获得连续的图片,然后可以拼接为:
````
magick annotation*.jpg notes.pdf
````
如何获得正确的 id?
### 数据库
你的阅读器中有一个 [sqlite](https://sqlite.org) 数据库 `/.kobo/Koboreader.sqlite`,包含两个相关表:`content` 和 `Bookmark`。
`content` 表中的相关列:
- `ContentID` – 用于连接 content 表
- `BookTitle` – 书名
`Bookmark` 表中的相关列:
- `ContentID` – 用于连接 content 表
- `BookmarkID` – 这是文件名使用的哈希/ID
- `ChapterProgress` – 0 到 1 之间的小数,允许我们对注释进行排序
以下查询将获取某本书的所有注释的 BookmarkID:
````
SELECT Bookmark.BookmarkID
FROM Bookmark, content
WHERE content.ContentID = Bookmark.ContentID
AND content.BookTitle LIKE '%<书名>%'
ORDER BY Bookmark.ChapterProgress
````
## 探索 sqlite 数据库的说明
你可以使用 `sqlite3 --readonly Koboreader.sqlite` 探索数据库。对于这样的宽表(很多列),我喜欢使用 `.mode line` 以便每行显示一列及其值。
## 关于 Kobo 的说明
整个数据库探索起来很有趣。总的来说,我是 Kobo 的忠实粉丝,因为可以在其内部探索甚至破解它。Kobo 发布了大量 [开源代码](https://github.com/kobolabs),人们也在操作系统之上开发了层级(例如 [NickelMenu](https://pgaskin.net/NickelMenu/)),包括自定义阅读器应用([koreader](https://koreader.rocks/))。
相似文章
@wsl8297: 想把电子书或文档做成有声书?很多工具不是声音太“机器人”,就是不支持字幕同步,折腾一圈还是不满意。 我后来发现了开源项目 Abogen:支持 ePub、PDF、纯文本等,一键转高质量音频,还能自动生成同步字幕。 它底层用 Kokoro 语…
Abogen 是一个开源工具,可将 ePub、PDF 等文档一键转为高质量音频,并自动生成同步字幕,支持语音混合器和多种部署方式。
@ziwenxu_: https://x.com/ziwenxu_/status/2053241837453029439
文章详细介绍了一个使用 Obsidian 构建自动化“Codex 知识库”的工作流,其中 AI 智能体自动导入并整理每日书签至结构化的知识库中,以降低上下文负债。
Boox的新款电子阅读器可能取代你的Kindle、Kobo和数字记事本
Boox发布了Go 6(第二代),这是其最小电子阅读器的升级版,增加了通过手写笔进行的笔记支持、更大的RAM以及搭载Google Play商店的Android 11系统,用户可以在一个设备上阅读Kindle、Kobo和其他应用的内容。
@Honcia13: 电子书秒变有声书的开源神器来了——Audiblez! 把 EPUB 直接扔进去, 几分钟就吐出高质量 M4B 有声书! 用的 Kokoro 语音模型,仅82M参数,但听感自然到离谱。 亮点: T4 GPU跑《动物庄园》只要5分钟 支持中英…
Audiblez 是一个开源工具,能将 EPUB 电子书快速转换为高质量的 M4B 有声书,使用 Kokoro-82M 语音模型,支持多种语言和图形界面,通过 pip 一键安装。
开源、沙盒化的Obsidian Agent CLI,用于音频转录、思维导图和深度研究
一个开源的Obsidian命令行工具,提供沙盒化的AI代理,用于音频转录、深度研究和思维导图,旨在加速笔记记录,同时不修改用户的知识库。