c#无法原生解析mobi/azw格式,因amazon未公开azw3/azw4规范且mobi含私有扩展;推荐调用calibre的ebook-convert命令行工具进行格式转换,或通过p/invoke调用libmobi解析无drm的mobi v4。

MOBI/AZW 格式在 C# 中没有官方支持
微软 .NET 基础类库(BCL)和 System.IO.Packaging 都不识别 .mobi 或 .azw。这不是“没文档”,而是格式本身未被标准化公开——Amazon 从未发布 AZW3/AZW4 的完整规范,MOBI 虽有部分公开结构(如 PalmDB 头、EXTH/HTMLZ 区块),但实际 Kindle 文件普遍混用私有压缩、加密、字体嵌入等扩展,直接手撕二进制极易出错。
实操建议:
- 别尝试用
BinaryReader+ 官方 MOBI 白皮书硬解——EXTH块偏移可能错位,HTMLZ解压后还有非标准转义 - 避开所有声称“纯 C# 实现 MOBI 解析”的小众 NuGet 包,多数只处理最简 MOBI v4,对 Kindle 生成的
mobipocket(含 KF8、hybrid)完全失效 - 真实项目中,优先考虑调用成熟命令行工具,C# 只做进程封装和结果解析
用 Calibre 的 ebook-convert 做格式中转最稳
Calibre 是目前唯一能稳定处理 MOBI/AZW/KFX 的开源工具链,其 ebook-convert 支持输入 .mobi、.azw、.azw3,输出 .epub、.htmlz、.txt 等可读格式。C# 只需启动进程、传参、读取 stdout/stderr 即可。
常见错误现象:ebook-convert input.azw3 output.html --no-default-epub-cover 执行失败,报错 Failed to import plugin: amazon
使用场景:批量提取电子书元数据(作者、标题、ISBN)、导出纯文本做 NLP、生成缩略图封面
实操建议:
- 安装 Calibre 后,确认
ebook-convert在 PATH 中;若未加入,用绝对路径调用,例如:"C:\Program Files\Calibre2\ebook-convert.exe" - 必须加
--debug-pipeline debug/参数临时输出中间 HTML 文件,验证是否成功解包——很多 AZW3 实际是 DRM 加密的,此时会静默失败 - 避免用
--output-profile kindle等输出参数干扰解析流程;只需基础转换:ebook-convert book.mobi book.html --no-images --no-default-epub-cover - 注意编码:输出 HTML 默认为 UTF-8,但某些老 MOBI 的 metadata 是 Latin-1,需捕获
stderr中的警告提示
libmobi C 绑定可用,但仅限无 DRM 的 MOBI v4
libmobi 是少数专注 MOBI 解析的 C 库(GitHub: koreader/libmobi),提供 C API,可通过 P/Invoke 在 C# 中调用。它能读取 EXTH 元数据、提取 HTMLZ 内容、解析 PalmDB 结构,但对 AZW、KF8、KFX 完全不支持。
性能影响:内存占用低(
容易踩的坑:
- Windows 下需手动编译
libmobi.dll(依赖zlib),x64/x86 必须与 C# 进程匹配,否则DllNotFoundException -
mobi_init()返回NULL不代表文件损坏,可能是检测到 KF8 header(BOOKMOBI后紧跟KF8),此时应直接放弃 - 元数据字段如
author可能为空,要检查mobi->exth.exth_records数组长度再遍历,不能假设固定顺序 - 提取正文时,
mobi_get_htmlz_content()返回的是 zlib 压缩后的 HTMLZ 数据,需额外调用zlib解压,不是直接字符串
创建 MOBI/AZW 文件基本不可行
没有合法、稳定、无需 Amazon 签名的途径从 C# 生成可被 Kindle 正常识别的 .azw3。Amazon 已弃用 MOBI 封装工具(kindlegen 自 2020 年停更),且新格式强制要求 KF8 结构 + 特定 DRM 签名(即使无内容加密,也需 mobigen 私钥签名)。
实操底线:
- 不要尝试用
System.IO.Packaging.ZipPackage手动打包 HTML + OPF + NCX —— Kindle 设备会拒绝加载,报错Document is corrupted - 若必须生成,唯一可行路径是调用已废弃但仍能运行的
kindlegen(仅支持 Windows/macOS,不支持 ARM64),输入 EPUB 或 HTML,输出 MOBI:kindlegen input.epub -c2 -o output.mobi -
-c2参数必须加,否则生成的 MOBI 缺少必要索引区块,新版 Kindle 固件直接跳过该文件 - 注意:
kindlegen对 Unicode 路径支持极差,所有输入路径必须是 ASCII 字符,否则静默失败
真正难的不是读,是写;不是语法,是签名。只要不碰 AZW 生成,前面三条路足够应付 95% 的解析需求。











