cable729/inkterop
GitHub: cable729/inkterop
一款跨手写笔记应用的通用格式转换器,能够将 reMarkable、GoodNotes、Notability 等多种专有格式中的原始笔触数据提取并转换为可编辑的目标格式。
Stars: 2 | Forks: 0
# 互操作性
[](https://github.com/cable729/inkterop/actions/workflows/ci.yml)
[](https://cable729.github.io/inkterop/)
[](LICENSE)
**文档:[cable729.github.io/inkterop](https://cable729.github.io/inkterop/)**
手写笔记格式之间的通用转换器 —— 适用于电子墨水屏设备、笔记应用和显示格式 —— 此外还包含它最初衍生于此的 reMarkable → PDF 镜像工具。
在此项目之前,不存在任何跨应用的手写转换器:每个应用都使用自己(通常未公开文档)的格式,而“互操作”仅仅意味着导出为扁平的 PDF。inkterop 将原生 ink —— 即实际的笔触,包括在源文件有存储情况下的逐点宽度/压力/倾斜度 —— 读取为一个已公开文档的中间表示([docs/ir.md](docs/ir.md)) 并将其重新写入输出。
```
cd core
uv run inkterop convert notes.goodnotes notes.xopp # GoodNotes -> Xournal++, editable ink
uv run inkterop convert "My Notebook" out.pdf # reMarkable library doc -> PDF
uv run inkterop convert notes.sba raw.json --fidelity raw # raw per-point pen data
uv run inkterop inspect mystery.note # what's inside?
```
## 格式支持
| 格式 | 读取 | 写入 | 备注 |
|---|---|---|---|
| reMarkable v6 (`.rm`, Paper Pro) | ✓ | — (M2) | 参考实现;输出对比官方导出的验证准确率约为 2% |
| GoodNotes 6 (`.goodnotes`) | ink+color | — | 在此项目中完成逆向工程 — [docs/formats/goodnotes.md](docs/formats/goodnotes.md) |
| Notability modern (`.ntb`) | ✓ | — | FlatBuffers 格式在此项目中完成逆向工程 |
| Notability legacy (`.note`) | ✓ | — | 2018 zip 格式,经核实仍可用 |
| Saber (`.sba`/`.sbn2`) | ✓ | — | 开源 BSON 格式;保留了原始压力数据 |
| Supernote (`.note`) | raster | — | 通过 supernotelib 实现;vector ink 是开放的逆向工程目标 |
| Xournal++ (`.xopp`) | ✓ | **✓** | 经过应用打开验证 (Xournal++ 1.3.5) |
| Nebo/MyScript (`.nebo`) | container | — | BINK ink codec 正在进行逆向工程 |
| InkML (W3C) | ✓ | ✓ | 原始保真度互换(压力/倾斜通道) |
| SVG | — | ✓ | 填充轮廓的可变宽度,混合模式 |
| PDF | — | ✓ | 经验证渲染器的精准移植 |
| IR-JSON (`.json`) | ✓ | ✓ | 完整的 IR,无损 |
每次转换包含三种保真模式:`exact`(源应用的外观)、`native`(目标应用在语义上的重新排版)和 `raw`(逐点的笔触动态)。请参阅 [docs/ir.md](docs/ir.md)。
## 仓库布局
- **`core/`** — `inkterop`,Python 引擎(uv 项目):包含 IR、格式读取器/写入器、PDF/SVG 渲染器、`convert`/`inspect` CLI,以及最初的镜像 pipeline —— 读取 reMarkable 桌面应用的本地库缓存,并通过 launchd daemon 将高保真的 PDF 渲染到 iCloud Drive 中。
- **`tools/re/`** — 逆向工程工具包(protobuf wire walker、Apple-framed-LZ4 解码器、容器清单),用于格式解析工作。
- **`macos/`** —(计划中)用于监督引擎的 SwiftUI 菜单栏外壳。
- **`device-mods/`** — 针对 Paper Pro 的 XOvi/qmd 工具包:固定横向页面尺寸,并带有脚本化安装和不影响保修的回滚机制。
- **`docs/`** — IR 规范、带有 `[verified]/[inferred]/[unknown]` 置信度标记的各格式逆向工程文档、逆向工程方法论、语料库协议、写入安全策略和路线图。
## 为什么开发此项目
reMarkable 自身的 PDF 导出在渲染画笔时与设备上的显示效果不同,横向页面会在垂直方向变长,导致导出文件的页面尺寸随机,而且每个笔记应用都将其 ink 锁定在各自的格式中。然而,桌面应用会保留本地缓存并生成原生格式的导出 —— 本项目的所有功能都建立在读取这些内容(只读,零云存储风险)、通过经验解析它们,并与每个应用自身的渲染效果进行对比验证的基础之上。
## 设置
Python 3.12+ 和 [uv](https://docs.astral.sh/uv/)。
```
cd core
uv run pytest -q # 80 tests; no device needed
uv run inkterop --help
```
## 从这里开始
- [docs/HANDOFF.md](docs/HANDOFF.md) — 当前状态、正在进行的工作、如何跟进每个线索
- [docs/ROADMAP.md](docs/ROADMAP.md) — 阶段、状态、已知缺失功能
- [docs/ir.md](docs/ir.md) — 中间表示 + 新读取器检查清单
- [docs/reverse-engineering.md](docs/reverse-engineering.md) — 方法论、样本伦理、GPL 边界策略
- [docs/research.md](docs/research.md) — 生态系统调查
- [CLAUDE.md](CLAUDE.md) — Agent 快速入门:命令、注意事项、外部状态
## 许可证
代码:MIT。文档:CC BY 4.0。自动生成的测试夹具:CC0。
`device-mods/vendor/` 为内置的 GPL-3.0 代码(详见 [NOTICE](NOTICE))。
格式事实的归功于各格式文档中记录的先前工作。
标签:手写笔记, 数据互操作性, 文件解析, 格式转换, 电子墨水屏, 逆向工具