cable729/inkterop

GitHub: cable729/inkterop

一款跨手写笔记应用的通用格式转换器,能够将 reMarkable、GoodNotes、Notability 等多种专有格式中的原始笔触数据提取并转换为可编辑的目标格式。

Stars: 2 | Forks: 0

# 互操作性 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg)](https://github.com/cable729/inkterop/actions/workflows/ci.yml) [![文档](https://static.pigsec.cn/wp-content/uploads/repos/cas/7e/7eae97fd2ac8af944908e28d39a282e8dd49ff1f79d3c624d79fb9191f4f3bae.svg)](https://cable729.github.io/inkterop/) [![许可证:MIT](https://img.shields.io/badge/license-MIT-blue.svg)](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))。 格式事实的归功于各格式文档中记录的先前工作。
标签:手写笔记, 数据互操作性, 文件解析, 格式转换, 电子墨水屏, 逆向工具