推送 EPUB 文件到 Kindle 的常见失败原因及解决方法
书伴之前发布了一篇文章《如何快速无损修复推送失败的 EPUB 格式电子书文件》,文中提供的修复方法可解决大部分推送 EPUB 文件后收到亚马逊系统退信的问题。但是此方法并不能覆盖所有问题,随着小伙伴不断向书伴提供样本文件,更多推送 EPUB 文件相关的问题得以显现。
本文根据小伙伴们提供的样本文件汇总了一些具有代表性的问题,并为每个问题提供了相应的解决方法。这些问题被分成了两大类,分别是“导致推送失败的问题”和“导致内容有误的问题”。前者主要解决推送不可达的问题,后者主要解决虽推送成功内容却存在可读性问题的问题。
本文会用到 Sigil 这款软件,如果其它软件(如 Calibre)有同等功能也可以作为替代。
一、导致推送失败的问题
推送失败是指无法将 EPUB 文件成功推送到 Kindle,通常你会收到亚马逊的一封题为“您发送到 Kindle 的文档有问题”的退信,内容除了一个格式支持列表,未提供对解决问题有价值的信息。
一个 EPUB 文件可能同时存在下面这些问题,你可以在推送失败使逐一排查和修复。
1、EPUB 中的某些文件不符合规范
亚马逊的个人文档服务对推送的 EPUB 文件有较强的容错机制,即便有些内容不符合 EPUB 规范,一般情况下也能被正常处理,但是唯独对 EPUB 2.0 的导航控制文件 toc.ncx 及 EPUB 3.0 的导航文档 nav.xhtml 比较敏感,如果这两个文件存在“错误”,就会大概率导致推送失败。
这是导致 EPUB 推送失败最常见的问题,也是首先要尝试解决的问题。具体解决方法如下:
用 Sigil 打开 EPUB 文件,依次点击菜单【工具(Tools) → 目录(Table Of Contents) → 生成目录…(Generate Table Of Contents…)】(或按快捷键,Windows 是【Ctrl + T】,macOS 是【Command + T】。不过需要注意,这种方式可能会破坏目录层级。
最后点击左上角的软盘图标按钮(或按快捷键,Windows 是【Ctrl + S】,macOS 是【Command + S】)保存修改后的文件。
关于此问题的详细解释可参考《如何快速无损修复推送失败的 EPUB 格式电子书文件》一文。
2、XHTML 文件名含空格和中文字符
如果 EPUB 文件被插入了广告页面,且文件名带有空格和中文字符,也会导致推送失败。解决方法是,用 Sigil 打开 EPUB 文件,直接将带空格和中文字符的 XHTML 页面删掉再保存即可。
3、OPF 文件中的 language 元素有误
用 Sigil 打开 EPUB 文件,检查其 OPF 文件(通常文件名为 content.opf)元数据中的 <language>
元素,如果该元素缺失,或者其内容部分未指定语言代码,或指定了错误的语言代码(如下所示)都会导致推送失败。
<dc:language>und</dc:language>
解决方法为用 Sigil 编辑 OPF 文件,如果发现缺失 <language>
元素,则在 <metadata>
元素中添加如下所示的代码,注意语言代码以实际为准。如果 <language>
元素中的语言代码有误,则改成有效的语言代码,如中文的 zh
,英文的 en
,更多请参考 ISO 639-1 语言代码列表。
<dc:language>zh</dc:language>
你也可以通过 Sigil 的菜单添加或修改语言元素。首先点击【工具(Tools)→ 元数据编辑器…(Metadata Editor…)】调出元数据编辑界面。如果缺失 <language>
元素,可点击【添加元数据(Add Metadata)】按钮,选择“语言(Language)”,点击【OK】按钮后再选择“中文 – 中国(Chinese – China)”,点击两次【OK】按钮完成添加。注意不要重复添加。
如果 <language>
元素中的语言代码有误,双击“语言(Language)”的“值(Value)”相应的字段,选择“中文 – 中国(Chinese – China)”,点击【OK】按钮完成修改。
最后点击左上角的软盘图标按钮(或按快捷键,Windows 是【Ctrl + S】,macOS 是【Command + S】)保存修改后的文件。
当然,除了是用 Sigil 外,你也可使用 Calibre 的电子书元数据功能实现同样的目的。
4、OPF 文件中出现重复的 item 元素
如果 OPF 文件中的 <item>
元素重复也会导致推送失败,将那些元素去重就可以成功推送了。Sigil 貌似没有工具可以检测这个问题,你可以尝试用 KindleGen 转换有问题的 EPUB 文件,如果有 item 元素出现重复,软件会提示你具体是哪一个重复了,提示信息如下所示:
Error(xmlmake):E27012: Item or process id already used: 180630.jpg
5、在 CSS 中隐藏的字符数超过了限制
Kindle 电子书对 CSS 声明 display:none;
的使用有限制,隐藏内容区块中的字符不能超过 10000 个,否则会导致推送失败。因此,建议删除 CSS 文件中所有 display:none;
声明。
6、XHTML 中的元素含有不兼容属性
检查 XHTML 中是否有元素像下面那样使用了属性 data-amznremoved
,如果有的话需要将其移除,否则会导致推送失败。这可能是 Send to Kindle 服务无法正确处理此属性导致的。
<span class="jpchar" data-amznremoved="mobi7">A Sample</span>
7、XHTML 文件中的 body 标签含 ID
在 EPUB 文件的 toc.ncx 文件中,有些 <content>
元素的 src
属性值所指向的 XHTML 文件路径含有 URL 片段,即类似路径 text/part0000.html#test_1 中的 #test_1,如果其对应的 id
属性在 <body>
元素上,可能会导致推送失败。解决方法是,将 <body>
元素上对应的 id
值移至其子元素上,或直接删除路径中片段部分(即 #
和其后的字符)。
最后点击左上角的软盘图标按钮(或按快捷键,Windows 是【Ctrl + S】,macOS 是【Command + S】)保存修改后的文件。
8、NCX 文件中包含的导航目录条目过多
如果要推送的电子书导航目录超过 1321 条,大概率也会推送失败。由于是亚马逊服务器方面的限制,目前没有太完美的解决方案。变通的解决方案有两种:一种是编辑 EPUB 文件中的 NCX 文件,删减 <navPoint>
元素的数量,这种方法的缺点是会影响 Kindle 目录导航功能;另一种是将 EPUB 文件化整为零,将电子书分割成多份,这种方法的缺点是会多出很多工作量。
二、导致内容出错的问题
有时 EPUB 文件即便是推送成功,其内容也存在可读性问题,如乱码、目录层级有误等。
1、电子书内容出现乱码
推送的电子书出现乱码的一般表现为,中文电子书全部乱码,英文电子书部分标点符号乱码。一般情况下,这是由于 EPUB 文件中的 XHTML 文件没有指定 UTF8 编码导致的。
解决方法为:下载并安装 EPUB 编辑器 Sigil,然后用 Sigil 打开 EPUB 文件,依次点击菜单【工具(Tools)→ HTML 重新格式化(Reformat HTML)→ 改进所有 HTML 文件(Mend All HTML Files)】,让 Sigil 自动修补所有 HTML 文件,最后保存再推送就可以了。
2、电子书目录层级有误
如果电子书的目录层级与你的预期不相符,你可以用 Sigil 的目录编辑功能【Tools(工具) → 目录(Table Of Contents)→ 编辑目录…(Edit Table Of Contents…)】调整一下。
- 通过键盘上的上下方向键(或通过鼠标点击)可选中标题;
- 按住 Ctrl 键加上下方向键调整标题的顺序(也可以点击界面右侧的上下方向按钮);
- 左右方向键调整标题的缩进(也可以点击界面右侧的左右方向按钮);
- 编辑完成后点击【OK】 按钮保存即可。
最后点击左上角的软盘图标按钮(或按快捷键,Windows 是【Ctrl + S】,macOS 是【Command + S】)保存修改后的文件。
3、电子书导航目录缺失
如果推送 EPUB 电子书到 Kindle 后,无法通过 Kindle 的“前往”功能进行目录导航,有可能是因为 EPUB 的导航文件(文件名一般是 toc.ncx)中的 URI 带有片段(如下所示)导致的。
text/part0001.html#UGI0-1af7590487e04e47b91ab6bb431b89f3
虽然 EPUB 规范上这样做是没错的,但是估计是亚马逊服务器的怪癖,在转换格式时丢失了导航目录。解决方法有两种,一种是删除 URI 中的片段,另一种是重新生成目录。具体方法如下:
删除 URI 片段的具体方为,用 Sigil 打开 EPUB 文件,双击打开左侧栏中的文件 toc.ncx,然后在“查找”输入框中输入正则表达式 #[^"]*
,“替换”输入框留空,“模式”下拉菜单选择“正则表达式”,最后点击“替换”输入框后的第二个按钮全部替换并保存即可。
另一种用 Sigil 的目录生成工具重新生成一遍目录,具体方法为,依次点击菜单【工具 → 目录 → 生成目录】并保存即可。注意,这种方式在某些情况下可能会改变目录层级。
由于受限于 EPUB 文件样本数量,以上这些问题无法覆盖所有情况,如果你在使用以上方法修复 EPUB 文件后仍然推送失败,可以尝试使用 Sigil + EpubCheck 插件检测并修复 content.opf 和 toc.ncx 这两个文件存在的所有问题,一般均可成功推送。
也可以尝试使用 Calibre 格式转换功能,现将 EPUB 格式转换成 AZW3,然后再转换成 EPUB 格式,有时也能解决推送失败的问题。
另外,如果你推送的电子书是 EPUB 3.0,即文件中不包含 .ncx 文件,可能也会出现导航目录缺失的问题,这可能是因为亚马逊服务器不支持这种目录导航格式。解决方法是先用 Calibre 等软件将电子书文件转换成 EPUB 2.0,然后按照上面的方法确保目录无误。
4、电子书字体显示异常
如果推送到 Kindle 的电子书显示的字体不一致,比如黑体宋体掺杂在一起,有可能是电子书的实际语言与原数据中的语言不一致导致的,比如某本书的文本实际上是中文,但是原数据中的语言却是英文。你可以使用 Sigil 或 Calibre 的原数据编辑功能修改原数据中的语言,使其与实际语言保持一致,具体方法请参考“3、OPF 文件中的 language 元素有误”。
如果你有更好的解决方案或小技巧,也欢迎在本文下方留言分享。
© 「书伴」原创文章,转载请注明出处及原文链接:https://bookfere.com/post/992.html
你好,我的kindle oasis 转到美亚账号后,用send to kindle推送网页文章,字体显示异常(各种字体混杂)。看文章里有提到,但我作为一个文科生,完全看不懂上面的操作,怎么办?多谢
所有 epub 全部都秒退回,上周都不是这样,最近就联系 kindle 客服关了广告,可能就是这个原因。
书伴你好,我最近在推送一本epub的书,但前前后后使用了各种方法都不能成功,使用epubcheck检查没有问题,使用kindlegen 测试也能正常生成mobi文件,可否提供帮助?感激不尽!
问题主要是“NCX 文件中包含的导航目录条目过多”,具体可参考文中说明。
感谢书伴帮助!我把目录层级减少后,原来NCX文件中的导航条目也大幅减少,终于上传成功了!
E20004: Spine 中的 ID 与 manifest 中的任何项均不匹配:xcolor
试着用Kindle Previewer打开了一下是这个情况,这种有办法处理吗
用 Sigil 打开电子书中的 .opf 文件,在 `` 元素中删除带属性值 xcolor 的 itemref 元素并保存,应该就能解决了。
书伴:你好
有个问题请教你,我的设备是paperwhite 11代,固件版本5.16.5,原先设备中有电脑导入的epub格式的书籍,放在document文件里,也就是在document文件里做了个epub文件夹,里面有epub格式的书籍,当然在document还有其他格式的书籍,今天为了整理一下,重置了设备,然后再导入epub格式的书籍到document,但是打开设备后,就无法显示有epub的书籍了,请问这个该如何处理?谢谢,
Kindle 一直都没有原生支持过 EPUB 格式电子书,所以按说不应该会显示 EPUB 格式电子书。以前可以通过越狱安装 KPVBooklet 让 Kindle 显示 EPUB 电子书,现在这个方法貌似不适用新版本固件了。另外还可以用 KOReader 浏览 EPUB 电子书。
我有一本书测试了一万次,每个方法都试过了,就是没办法用send to kindle发送到云端,求帮助!
我目录、编码、页面大小啥的都试过了,互相转化也试过了
https://f.ws59.cn/f/d0mslov6rmg 复制链接到浏览器打开
请问转为美区之后用usb传进设备的epub文件不显示是什么原因呢?用邮箱传和send to kindle也是fail
我的转为美区后,USB传书正常
谢谢回复,我后来重新装了越狱插件才可以显示,不过文件超过3M的基本上打开就会卡死,放弃kindle看epub了。。
我基本上正常,就是目前碰到有一本书,不管epub还是PDF都是send to失败。不知道是否书的字数过多,分成两部分epub就没问题
你好,我的一些epub 2文件在普通阅读软件中能正常显示目录,但是传入Kindle后无目录。用Sigil打开后点击Generate Table of Contents是空白的,但是Edit Table of Contents中有显示目录,请问有办法把后者的目录转移到前者中吗?
今天遇到一个罕见的问题:有一本电子书不明原因拒收,用sigil检查后没有任何格式问题,改成docx格式后可以正常发送。最后发现是元数据中语言选成了一个很少见的语言,改成正确的中文之后就发送成功了。
您好,请问kindle越狱后还可以推送epub版本吗?我的epub文件一直推送失败,谢谢您的回复。
可以,越狱不影响 Kindle 的原生功能,包括推送 EPUB 文件。推送失败可能是其它原因,你可以尝试本文提供的方法排查问题,或者用 Calibre 重新转换一下 EPUB 格式,看看能不能解决。
有人推荐了一个calibre插件用来调整英文电子书符号乱码问题。
https://blog.the-ebook-reader.com/2022/05/06/how-to-fix-formatting-issues-on-epubs-sent-to-kindles/
最近我在使用美亚邮箱推送的时候,在calibre中将epub转换成epub(为了调整行间距)后,推送文件后经常出现丢失目录的情况(原文件目录正常的),不知道大家有没有遇到相同的问题,如何解决呢?
目录的层级超过两层了吗?
目录没有超过两层 用下载的mobi文件转换成epub就有目录,很费解。
试了一下 epub 的源文件发送也没有目录,以前在中亚就没有这样的问题,该怎么操作?
我这两天也转到美亚,推送EPUB文件有部分丢失目录,原文件是没问题的。
我找到方法了,把EPUB转成AZW3再转回EPUB,推送目录正常。
现在利用calibre推书的时候书名老是默认变成拼音字母,还会收到亚马逊发来的推送mobi文件政策将有变化的提醒,以前都没试过的,不知道如何解决?
亚马逊好像会把文件名作为书名,calibre的推送的时候文件名就就拼音,把文件从calibre库中拿出来,改为中文文件名,然后手动邮件附件推送,就能变成中文了
嗯,都有这个问题,邮箱点完发送,秒收到退信通知
请问下,确认epub没问题,但是发到美亚后显示被退回,是什么问题,之前都没问题,现在就是显示,未知的原因,对方拒绝接收您的邮件
抱歉,您的信件被退回
尊敬的用户 xxx:
您发送到 xxx4@kindle.com 的邮件被系统退回,以下是退信相关信息:
未知的原因,对方拒绝接收您的邮件
建议解决方案:建议您稍后修改主题或内容重新发信尝试,或与对方邮件服务提供商的服务支持团队联系,反馈该问题。
所有电子书推送时都有这个问题吗?
嗯,都有这个问题,邮箱点完发送,秒收到退信通知