如何快速无损修复推送失败的 EPUB 格式电子书文件
前不久,亚马逊 Kindle 个人文档服务已原生支持推送 EPUB 格式,但是很多小伙伴在尝试推送后反馈,有个别的 EPUB 格式电子书文件无法成功推送,会收到如下所示的系统退信。
尊敬的客户:
2022年5月3日13:14 发送的以下文档无法发送到您指定的 Kindle:
* XXXXXX.epub
Kindle 个人文档服务可以转换并发送以下类型的文档:
Microsoft Word(.doc、.docx)
富文本格式 (.rtf)
HTML(.htm、.html)
文本 (.txt) 文档
存档的文档(zip、x-zip)和压缩的存档文档
Mobi 图书
类型为 JPEG (.jpg)、GIF (.gif)、位图 (.bmp) 和 PNG 图像 (.png) 的图像。
可以实验性地将 Adobe PDF (.pdf) 转换为 Kindle 格式并发送。
如果失败的文档属于上述某个文档类型,请确保该文档未受密码保护或加密。
对于个人文档附件的有用提示:
附加的每个个人文档的文件大小应小于 50MB(在压缩成 ZIP 文件之前)
提交的电子邮件中包含的个人文档附件不应超过 25 个
您可以在我们的帮助页面上详细了解如何将个人文档传输到 Kindle:
http://www.amazon.cn/Kindledocuments/
如果您需要立即的协助,请拨打 4008170100(国内客户) 或 +86-22-59677408(国际客户),与客户支持部门联络。
此致,
Amazon Kindle 支持
书伴从几位小伙伴那里收集到一些推送失败的 EPUB 文件,并做了一些测试以找出这些“问题文件”的共通之处,发现这些问题可以通过较为便捷的方式解决,现将解决方法分享如下。
一、问题分析
亚马逊的个人文档服务对推送的 EPUB 文件有较强的容错机制,即便有些内容不符合 EPUB 规范,一般情况下也能被正常处理,但是唯独对 EPUB 2.0 的导航控制文件 toc.ncx[1] 及 EPUB 3.0 的导航文档 nav.xhtml[2] 比较敏感,如果这两个文件存在“错误”,就会大概率导致推送失败。
对于 EPUB 2.0 的 toc.ncx 文件,常见的错误是由于 EPUB 电子书制作不规范,导致出现了重复的 playOrder 的值,当你用 EPUBCheck[3] 验证这样的电子书时,会看到如下所示的错误提示:
Error while parsing file: identical playOrder values for navPoint/navTarget/pageTarget that do not refer to same target
对于 EPUB 3.0 的 nav.xhtml 文件,即便是符合 EPUB 规范,Kindle 个人文档服务也无法正确处理,而违反规范删掉所有导航列表后反倒可以正确处理。这可能是因为 Kindle 个人文档服务负责格式转换的程序未能很好的支持 EPUB 3.0 导致的,今后是否会有所改进有待观察。
尽管可以使用 EPUB 验证工具 EPUBCheck 找出 EPUB 文件所有不符合规范的地方,但是为了提高效率,不建议这样做,毕竟最终目的是让 EPUB 文件能被 Kindle 个人文档服务正常处理。
二、解决方法
解决此问题常见的一个方法是先用 Calibre 将 EPUB 格式转成其它格式再转回 EPUB 格式,但是这可能会对内容或排版产生一定的影响,且在某些情况下不一定有效,如果电子书比较大,转换的过程也较为耗费时间。由于问题的症结只存在于特定文件,也没必要对整本电子书进行转换。
因此,这里推荐使用 EPUB 编辑器 Sigil,通过其提供的一些便捷功能快速修复“问题文件”。
通过下面的链接下载并安装 Sigil 软件(注意选择适用于你所用操作系统的版本):
- 下载 Sigil:官方发布页面
安装完成后,用 Sigil 打开推送失败的 EPUB 文件。这时可能会出现如下所示对话框:
提示信息的大意是:此 EPUB 中的 HTML 文件格式欠佳,或缺失了 DOCTYPE、html、head、body 元素。Sigl 会自动修复这些文件,尽管在极端情况下,这可能会导致轻微的数据丢失。
除非有特殊需要,建议点击【Yes】按钮让 Sigil 自动修复 EPUB 文件中有问题的 HTML 代码。
接下来修复 EPUB 2.0 的 toc.ncx 文件或 EPUB 3.0 的 nav.xhtml 文件。
用 Sigil 打开 EPUB 文件,依次点击菜单【工具(Tools) → 目录(Table Of Contents) → 生成目录…(Generate Table Of Contents…)】(或使用快捷键【Command + T】。
最后点击左上角的软盘图标按钮(或按快捷键【Command + S】)保存修改后的文件。
至此,如果你的 EPUB 文件符合上面的问题描述,修复后的 EPUB 文件就能正常推送了。
* 注意:Kindle 仅支持两级目录,如果 EPUB 文件有三级目录,Kindle 个人文档服务在转换时会将其忽略,从而造成 Kindle 的【前往】功能无法正确导航。要解决此问题,请使用 Sigil 的目录编辑功能【Tools(工具) → Table Of Contents(目录) → Edit Table Of Contents…(编辑目录…)】,在保持两级目录的基础上自行调整。
更多解决方法可参考《推送 EPUB 格式电子书到 Kindle 的常见问题解决方法》这篇文章。
三、自行修复
由于受限于 EPUB 文件样本数量,以上解决方法可能无法覆盖所有情况,如果你使用此方法修复 EPUB 文件后仍然推送失败,可以尝试自己修复有问题的 EPUB 文件,以下是两种可行的方法。
1、检测 EPUB 是否有违规范
尝试自行修复 EPUB 文件时,你可能需要知道 EPUB 文件都存在哪些问题,书伴推荐 Sigil + EpubCheck 插件这对软件组合,检查存在于 EPUB 文件中违反规范的地方并加以修复。
具体如何使用 Sigil 和 EpubCheck 插件这两个软件组合检查和修复 EPUB 文件,书伴在《如何利用 Sigil 和 EpubCheck 插件检查和修复 EPUB 文件》这篇文章中做了详细介绍,敬请参考。
2、KindleGen 测试格式转换
你也可以尝试用 KindleGen 转换推送失败的 EPUB 文件,目的是模拟亚马逊服务器的格式转换过程,如果在转换的过程中出现带有 Error 错误提示信息(带 Warning 的没关系),就找到了问题所在,按照提示信息用 Sigil 修复相应的地方,一般情况下都可以成功推送。
- [1] 参见 EPUB 2.0.1 规范中关于“声明式全局导航”的定义“2.4.1: Declarative Global Navigation — the NCX” via
- [2] 参见 EPUB 3.3 规范中关于“导航文档”的定义“7. EPUB navigation document” via
- [3] EPUBCheck 是一款用于验证 EPUB 出版物是否符合 EPUB 规范的工具 via
© 「书伴」原创文章,转载请注明出处及原文链接:https://bookfere.com/post/973.html
Dear Customer,
A document, sent at 03:25 AM on Thu, Oct 17, 2024 GMT, could not be delivered.
To learn more, please visit our help page. By downloading or using Send to Kindle, you agree to the terms here.
Regards,
Amazon Kindle Support
This e-mail was sent from a notification-only address that cannot accept incoming e-mail. Please do not reply to this e-mail.
这种错误是啥?今天突然遇到传书不成功,通过亚马逊网页传书邮箱收到的邮件。
There was a problem with the document(s) you sent to Kindle
The following document, sent by you at 2022年11月18日17:39, could not be delivered to the address you specified due to a service failure
请问这个提示是什么原因?可以修复吗?
看起来是服亚马逊的服务器问题,可能是临时性故障,现在应该没问题了吧。
为什么我的书有二级目录,点自动生成目录,变成了只有一级目录了
如果 Sigil 的生成目录功能破坏了目录层级,你可以用 Sigil 的目录编辑功能【Tools(工具) → Table Of Contents(目录) → Edit Table Of Contents…(编辑目录…)】调整一下。
请问下怎么编辑目录呀?进去那个页面后怎么自行调整不会emmm
如果是想要调整目录的层级,下面是常用的操作:
编辑完成后点击【OK】 按钮保存即可。
感谢作者,太有用了!
请问EpubCheck检查错误提示为:”Col: 65: ERROR(RSC-005): Error while parsing file: value of attribute “”id”” is invalid; must be an XML name without colons”应该如何处理,文档是用kindlegen生成的
看起来是某些 HTML 元素的 id 属性值不符合 EPUB 规范,解决方法就是错误提示中的“must be an XML name without colons”,一般情况下改成非数字开头的字母数字下划线就可以了。