如何快速无损修复推送失败的 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
Sigil的官方下载页面无法打开,挂了梯子后点击显示github.com 未发送任何数据
传epub的话主题要写convert吗
不需要,这个指令是给 PDF 文件用的。
感谢!
运行EPUBCheck时显示
状态: failed
Traceback (most recent call last):
File “E:\Sigil\plugin_launchers\python\launcher.py”, line 136, in launch
self.exitcode = target_script.run(container)
File “C:\Users\miao\AppData\Local\sigil-ebook\sigil\plugins\EpubCheck\plugin.py”, line 250, in run
arch = get_arch(java_path)
File “C:\Users\miao\AppData\Local\sigil-ebook\sigil\plugins\EpubCheck\plugin.py”, line 36, in get_arch
_, stderr = jar_wrapper(*args)
File “C:\Users\miao\AppData\Local\sigil-ebook\sigil\plugins\EpubCheck\plugin.py”, line 56, in jar_wrapper
process = Popen(args, stdout=PIPE, stderr=PIPE, shell=False)
File “subprocess.py”, line 775, in __init__
File “subprocess.py”, line 1178, in _execute_child
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
Error: [WinError 2] 系统找不到指定的文件。
你使用的操作系统安装 JRE 或 JDK 了吗?
第一次直接用epub格式推送,推送成功!不过,有没有办法在Kindle上显示封面呢?
有,转成azw3格式之后数据线导进去
epub 推送到kindle后, 手机 和ipad的kindle软件中,无法选用其它字体,请问,有解决的办法吗? 谢谢~
用sigil打开epub弹窗:OPF文件包含重复的ID: main-css – 加载EPUB时已经指定了一个临时id,请编辑您的OPF文件移除重复的id。
操作两步后还是传送失败。
通过检查你发来的样本文件,发现有两处需要修复的错误。
一个 toc.ncx 文件中 playOrder 有重复 ID,按照文中提供的方法修复即可。
还有一个是 content.opf 文件中有重复 ID,就是下面这两行代码中的
id
的值:可以按照提示将其中一个改成其它 ID 即可,这里将第一
main-css
改成了font-css
:修改完成后保存文件再推送就没问题了。
按照修改说明,成功推送,感谢
Sigil下载安装后是中文版的,请用中文菜单的教程,谢谢分享!
谢谢提醒,已补上中文菜单。
博主您好:
【安装完成后,用 Sigil 打开推送失败的 EPUB 文件。这时可能会出现如下所示对话框:】
这一步我不小心点击了no,直接进入了软件,这时候如何点击自动修复?谢谢。
依次点击菜单【Tools → Reformat HTML → Mend All HTML Files】,让 Sigil 自动修补所有 HTML 文件即可。
感谢博主,成功解决了问题,推送成功。
前几天试了下推送epub。打开看排版完全乱了。段前原本空两格的直接变成没有空格。说明epub推送格式会变。推送mobi至少原有格式不会变。
使用Sigil生成的目录推送到亚马逊文档服务,用Kindle下载下来,点击“前往”,目录都没有了。
这应该是目录层次导致的,Kindle 只支持两级目录,而这本电子书的目录是三级,因为第二级目录只有一项,第三级的目录又都被忽略了,所以看起来像是没有目录。
要解决这个问题,可以使用 Sigil 的目录编辑功能【Tools → Table Of Contents → Edit Table Of Contents…】,在保持两级的前提下,按照自己的喜好调整一下目录。
确实是这样,不能生成目录就可以了,还是要看一下,只支持两层目录。直接生成的目录有些层级是无用的。
谢谢反馈,已将此情况作为提示添加到文中。
感谢
Sigil我用FlightCrew插件检查格式,还不用装什么JRE
FlightCrew 这款插件已经不再更新了。简单试用了一下,发现检查不出 toc.ncx 存在的问题。EpubCheck 插件是最新版 EPUBCheck 程序(由 W3C 提供,当前最新版为 4.2.6)的简单包装器,需要安装 JRE 是因为这款程序需要 Java 环境。
kindle perviewer 能打开的就没问题,打不开的用calibre转mobi再转回来就能打开了
有些很老的epub,插入图片链接引用不规范,自动修复会直接把图片都删掉的
我遇到的问题是,一本书在电脑上能打开,也能推送到Kindle,但打开只有乱码,估计是编码的问题,我也没纠结,另找了个地方下载了一个新的版本。
一般情况下这是由于 HTML 文件没有指定 UTF8 编码导致的。解决方法也很简单,用 Sigil 打开 EPUB 文件,依次点击菜单【Tools → Reformat HTML → Mend All HTML Files】,让 Sigil 自动修补所有 HTML 文件,保存,再推送就可以了。