C# 操作MOBI/AZW电子书 C#如何解析或创建Kindle电子书文件

7次阅读

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

C# 操作MOBI/AZW电子书 C#如何解析或创建Kindle电子书文件

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 FilesCalibre2ebook-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% 的解析需求。

text=ZqhQzanResources