DIY Kobo 注释备份

Lobsters Hottest 工具

摘要

一份指南,介绍如何使用结合了 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 语…

X AI KOLs Timeline

Abogen 是一个开源工具,可将 ePub、PDF 等文档一键转为高质量音频,并自动生成同步字幕,支持语音混合器和多种部署方式。