原文:https://www.zybuluo.com/mdjsjdq/note/222895

Kindle 支持的格式

Kindle Format 8 (AZW3),Kindle (AZW),TXT,PDF,MOBI,PRC原格式,HTML,DOC,DOCX,JPEG,GIF,PNG,BMP转换格式。

自制 Kindle 电子书的小伙伴们,还在用 Word、Page、inDesign 导出制作电子书?那就太 OUT 了,用这类软件生成的页面源代码较为冗余杂乱,影响电子书的质量,也不符合亚马逊指定的规范标准,这对于追求完美的小伙伴来说是不能忍受的。

本文是翻译自国外网友的一片文章,结合亚马逊的 Amazon Kindle Publishing Guidelines 介绍了一下 Kindle 电子书(KF8格式)的制作流程,比较适用于有 HTML 和 CSS 基础的小伙伴。没有基础的小伙伴也可以通过修改文中提供的模板轻松自制电子书。

本文由 @Kindle 伴侣翻译,转载请注明出处。文末附原文链接,如发现翻译谬误请不吝指正

制作 Kindle 电子书的方法有很多,相比于去依赖插件,用 KindleGen 把自己编写的源文件转换成 Kindle Format 8(KF8)格式,能够让你更精确的控制最终生成的结果。

如果你和我一样是名 Web 设计师,已经掌握了 HTML、XML 以及 CSS,这些从零开始徒手制作 Kindle 电子书所必备的技术。那你所需要了解的就是如何将它们综合起来运用,这样就可以完成电子书制作啦。

一、需要准备的工具

  1. Text editor:很多文本编辑器能够胜任此工作,但是当我编辑特别长的内容(上千页)时,经常遇到编辑器崩溃的情况。我通常更喜欢使用 BBEdit 编辑电子书,但 TextWrangler 应该也能满足你的需求。

  2. 摘自 Kindle Publishing Program page 

    • Amazon Kindle Publishing Guidelines:此 PDF 文档是亚马逊制定的制作电子书标准大纲
    • KindleGen:一个命令行工具,能把源文件转换成 Kindle Format 8 格式的电子书。
    • Kindle Previewer:模拟预览工具,可以用它来测试你制作的电子书。
    • Sample Books:强烈建议看看这些包含如何添加图片、文本、媒体文件等实例的样书

本教程将包含一本简单电子书制作所需要的基础知识(其实也只是针对亚马逊 publishing guidelines 的学习而已),还有一些样例供参考制作更多复杂的电子式。

二、需要准备的文件

制作一本 Kindle 电子书,你需要先准备以下文件:

  • HTML 格式的电子书源文件(可以是一个文件,也可以是分开的多个文件,比如每章节一个文件)
  • 一个包含电子书详细信息的 OPF 文档(Open Packaging Format
  • 一个电子书目录文档 NCX(Navigation Center eXtended)
  • JPEG 或 TIFF 格式的封面图像。
  • 电子书可能需要的其他一些文件(如 CSS 文件、图片文件、字体文件等)

如果你下载了sample books,就能看到它们的这些文件是如何组织起来的。

三、格式化电子书内容:HTML

这一步很耗时,但是所有你需要做的就是把这些内容制作成网页。你可以使用 XHTML 或者 HTML,但必须加以小心的是,设置编码时要使用“Latin-1”(ISO-8859-1)(译者注:中文建议使用 UTF-8 编码)。这里有个模板,可以用来参照你生成的 HTML 文件:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8"><script type="text/javascript">window.BWEUM||(BWEUM={});BWEUM.info={ 					  "beacon":"bi-collector.oneapm.com/beacon/rum/php",					  "errorBeacon":"bi-collector.oneapm.com/beacon/error/php",					  "licenseKey":"Bmb~yqQ6MmYniMbz",					  "applicationID":"7829",					  "transactionName":"FSM7EDAzWyknUhJZWyxpDSwrPF4KDmFJeFsvI3YQLSJcOWlCA15Q",					  "queueTime":"0",					  "applicationTime":"10",					  "ttGuid":"6D161072232D44AE",					  "agentToken":"",					  "agent":"//bi-collector.oneapm.com/static/js/bw-send-411.4.5.js"					  }</script><script type="text/javascript" src="//bi-collector.oneapm.com/static/js/bw-loader-411.4.5.js"></script>
    <title>Your Book Title</title>
    <link rel="stylesheet" href="style.css"  type="text/css" />
</head>
<body>
<!-- Your book goes here -->
</body>
</html>

你可以从 inDesign(或者 Word,呵呵……)导出 HTML 文档。如果你像我一样,那么,你会被那些转换来看起来乱七八糟的代码吓哭,你会想去清理它们。我强烈建议你去熟悉下 Grep (译者注:缩写来自Globally search a Regular Expression and Print,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来)来完成这项工作。

当用 HTML 组织电子书内容时,要保持代码的简洁和结构化。使用 HTML 设置标题、段落、引用、列表、加粗或者斜体等。具体你可以参考 publishing guidelines中第 71 页中全部可用的标签列表 。

为电子书章节部分所编写的 HTML 代码,看起来应该像下面的这个简略版本一样(注意章节标题的 ID 以及结尾名为“pagebreak”的 Class 选择器,下面我会解释那是做什么用的):

<h2 id="ch2">Chapter Two</h2>

<div class="center"><br><img src="images/ornament.png" width="75" alt="----------"></div>

<h3>Subtitle</h3>

<blockquote>
    <p>Some quote</p>
</blockquote>

<p>Lorem ipsum dolor sit amet, consectetur ... </p>
<p>Lorem ipsum dolor sit amet, consectetur ... </p>
<p>Lorem ipsum dolor sit amet, consectetur ... </p>
<p>Lorem ipsum dolor sit amet, consectetur ... </p>
<div class="center">* * *</div>
<p>Lorem ipsum dolor sit amet, consectetur ... </p>
<p>Lorem ipsum dolor sit amet, consectetur ... </p>
<p>Lorem ipsum dolor sit amet, consectetur ... </p>

<div class="pagebreak"></div>

正如你所看到的,你可以给 Div 标签添加 Class 选择器,甚至图片(详情查阅 publishing guidelines 的相关介绍)。只要记住你没法控制读者使用的阅读设备尺寸,以及基础字体。想象你自己是读者!

四、格式化电子书内容:CSS

除非你要制作一个纯图片的电子书、儿童读物或者漫画书,否则你的 CSS 代码将会非常简单。记住 Kindle 用户能够设置他们想要的字体和字体大小,所以你不能对此有太多的干预。

p { margin-top: 1em; text-indent: 0em; }

h1 {margin-top: 1em}
h2 {margin: 2em 0 1em; text-align: center; font-size: 2.5em;}
h3 {margin: 0 0 2em; font-weight: normal; text-align:center; font-size: 1.5em; font-style: italic;}

.center { text-align: center; }
.pagebreak { page-break-before: always; }

注意怎样用 em 单位设置 margin、padding 以及 font-size。这样,间距将会根据读者所选择的字体大小进行相应的调整。

如果想要设置分页符,你可以使用 CSS 属性:page-break-before 或 page-break-after。或者,你也可以使用 Kindle 的私有标签:。我通常在每一个章节的结尾处放置一个。

请查阅 publishing guidelines 第 75 页中的 CSS 支持列表。

五、电子书目录页:HTML

在电子书的开头,需要有一个目录(TOC)。这是一个简单的链接列表,用来跳转到书中的不同章节。这就是为什么你需要为每个章节标题设置 ID 的原因。

我个人喜欢把 HTML 格式的 TOC 文档制成下面这样的列表形式:

<div id="toc">
    <h2>
        Table of Contents <br />
        <img src="images/ornament.png" width="75" alt="----------" />
    </h2>
    <ul>
        <li><a href="#over">Overture</a></li>
        <li><a href="#pro">Prologue</a></li>
        <li><a href="#ch1">Chapter 1</a></li>
        <li><a href="#ch2">Chapter 2</a></li>
        <li><a href="#ch3">Chapter 3</a></li>
        <li><a href="#ch4">Chapter 4</a></li>
        <li><a href="#ch5">Chapter 5</a></li>
        <li><a href="#ch6">Chapter 6</a></li>
        <li><a href="#ch7">Chapter 7</a></li>
        <li><a href="#ch8">Chapter 8</a></li>
        <li><a href="#epi">Epilogue</a></li>
    </ul>
</div>
<div class="pagebreak"></div>

如果你把 HTML 文档分成多个文件,确保链接准确地指向相应的文件和 ID。比如:

<a href="chapter2.html#ch2">Chapter 2</a>

六、电子书目录导航:NCX

除了在 HTML 文件里包含目录列表外,你还需要制作一个和目录有着相同信息的 XML 文件,这个 XML 文件能够带来更好的阅读体验,因为它能引导读者更好地浏览这本书。(译者注:TOC 是能在电子书里看到的目录页,NCX 是指点击“前往”显示的那个目录导航)

如果你下载了 sample books,你能看到每本书都包含一个这样的文件。但这里摘选的 NCX 目录内容来自我们上面介绍的 HTML TOC 示例:

<?xml version="1.0"?>
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" 
 "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
 <head>
 </head>
        <docTitle>
               <text>Book title</text>
        </docTitle>
    <navMap>
        <navPoint id="toc" playOrder="1">
            <navLabel>
                <text>
                    Table of Contents
                </text>
            </navLabel>
            <content src="index.html#toc" />
        </navPoint>
        <navPoint id="over" playOrder="2">
            <navLabel>
                <text>
                    Overture
                </text>
            </navLabel>
            <content src="index.html#over" />
        </navPoint>
        <navPoint id="pro" playOrder="3">
            <navLabel>
                <text>
                    Prologue 
                </text>
            </navLabel>
            <content src="index.html#pro" />
        </navPoint>
        <navPoint id="ch1" playOrder="4">
            <navLabel>
                <text>
                    Chapter 1
                </text>
            </navLabel>
            <content src="index.html#ch1" />
        </navPoint>
        <navPoint id="ch2" playOrder="5">
            <navLabel>
                <text>
                    Chapter 2
                </text>
            </navLabel>
            <content src="index.html#ch2" />
        </navPoint>
               ...
    </navMap>
</ncx>

七、电子书详情: OPF

OPF是一个包含所有和电子书信息相关的 XML 文件,如 ISBN、标题、作者、封面,以及内含的文件列表。

和 NCX 文件一样,我建议使用 sample book 中的一个 OPF 文件作为模板:

<?xml version="1.0" encoding="iso-8859-1"?>
<package unique-identifier="uid" xmlns:opf="http://www.idpf.org/2007/opf" xmlns:asd="http://www.idpf.org/asdfaf">
    <metadata>
        <dc-metadata  xmlns:dc="http://purl.org/metadata/dublin_core" xmlns:oebpackage="http://openebook.org/namespaces/oeb-package/1.0/">
            <dc:Title>Book title</dc:Title>
            <dc:Language>en</dc:Language>
            <dc:Creator>Author name</dc:Creator>
            <dc:Copyrights>Copyright owner</dc:Copyrights>
            <dc:Publisher>Publisher</dc:Publisher>
            <x-metadata>
                <EmbeddedCover>images/cover.jpg</EmbeddedCover>
            </x-metadata>
        </dc-metadata>
    </metadata>
    <manifest>
        <item id="content" media-type="text/x-oeb1-document" href="index.html#toc"></item>
        <item id="ncx" media-type="application/x-dtbncx+xml" href="toc.ncx"/>
        <item id="text" media-type="text/x-oeb1-document" href="index.html#over"></item>
        <item id="Images" media-type="text/x-oeb1-document" href="Images.html"></item>
        <item id="background" media-type="text/x-oeb1-document" href="background.html"></item>
    </manifest>
    <spine toc="ncx">
        <itemref idref="content"/>
        <itemref idref="text"/>
        <itemref idref="Images"/>
        <itemref idref="background"/>
    </spine>
    <guide>
        <reference type="toc" title="Table of Contents" href="toc.html"/>
        <reference type="text" title="Book" href="index.html"/>
    </guide>
</package>

有一些 book samples 的 OPF 文件含有详细的注释,但是上面这个 OPF 示例应该能让你对其所包含的信息有一个大概了解:

  • Metadata:一些如书名、作者、出版社和装帧之类的信息。在 OPF 网站上有一个很全的 Metadata 列表供你引用。
  • Manifest:包含所有文件的列表(如 HTML 和 NCX 文件)。我建议最好也列出所有的 CSS 和 图片文件,这样生成 Kindle 电子书时,任何不存在的文件(或拼写错误的文件)都会出现警告提示。
  • Spine:HTML 文件列表,按照它们被阅读的先后顺序排列。
  • Guide:这个元素指向你书中的关键项,比如 TOC(目录),以及在有致辞的情况下,正文的开始位置,等等。

八、封面图片

就像你在 OPF 文件里能够看到的,你需要包含封面图片的相关信息。图片规格如下:

  • JPEG 或 TIFF 格式
  • 优先使用 1.6:1 的长宽比
  • 最小尺寸:宽 625 像素,长 1000 像素
  • 最佳尺寸:宽 1563 像素,长 2500 像素

九、生成 Kindle 电子书

现在你准备好了所有用来创建 mobi 格式电子书的必要文件。这时就轮到 KindleGen 上场了。

在下载完适用于你系统的 downloand KindleGen 后,你需要用命令行运行它。下载到的 KindleGen 包含使用说明,不过命令看起来像下面这样:

/Applications/kindlegen /Users/me/Documents/Book/book.opf 

如果你用的是 Mac 系统,最简单的方法是打开 Terminal(终端),把 KindleGen 拖放到终端窗口上,再把 OPF 文件拖放到终端窗口上,然后按一下键盘上的 Enter(回车)。KindleGen 就会开始运行了,不出意外的话,在 OPF 所在目录下就会生成一个 mobi 文件。(译者注:其实 Windows 系统中的命令提示符也可以这样干)

你可能会遇到一些不可预知的错误,这可能和 TOC 文件中的错误链接(通常是 ID 或链接的拼写错误)以及缺失的文件(可能是名称的拼写错误)有关。

十、首战告捷!

一旦你有了 mobi 格式的电子书,就可以用 Kindle Preview,任何电子书阅读器,甚至真正的 Kindle 设备直接打开它。

如果你对制作结果很满意,可以把它上传到 Kindle Store!(译者注:这里是指美国亚马逊。)


译者注:经过测试,用本文方法制作的电子书,通过邮件附件的方式推送到亚马逊云端,会出现不显示封面的问题。查找了很多资料,也没有找到解决方法,猜测原因可能是 KindleGen 的一个 Bug 引起的。因为通过 mobi 拆分工具拆分后,发现会生成 mobi7 和 mobi8 两个文件夹,在 mobi7 文件夹内能找到封面图片,但是 mobi8 文件夹内却无法找到,可能就是这个原因引起的,但目前还没找到确切的原因。如果你有解决方法请一定留言告知,谢谢!


翻译水平有限,如有错误请及时指正,谢谢。

原文:www.aliciaramirez.com

翻译:Sherry, Runbing