KindleGenを使ってKindle本を作る

Amazon Kindle パブリッシング・ガイドラインのバージョン2018.2に基づいてまとめてみました。

これで野良Kindle本を作ることができますよ。もちろんKindle ダイレクト・パブリッシングを利用して正規に販売しても問題ないはずです。

EPUB準拠のソースファイル概要

ガイドラインによると以下ふた通りのソースから生成できるとあります。

  • 本の内容をすべて含んだ単一のHTMLファイル
  • EPUB準拠のファイル群

具体的な説明はEPUB準拠のファイルについてしか載っていないので、ここでは単一ファイルは扱いません。EPUB準拠のファイル構成は以下のとおりです。

  • 表紙画像(JPEGファイル)
  • 論理目次(HTMLファイル)
  • 出版物ヘッダファイル(OPFファイル)
  • 本文コンテンツ(HTMLファイルなど)

出版物ヘッダファイル(OPFファイル)は電子書籍の設計図のようなもので、それ以外が電子書籍を構成する材料になります。

表紙画像について

表紙画像には以下の2種類があります。

  • マーケティング用表紙画像
  • 内部コンテンツ表紙画像

マーケティング用表紙画像は電子書籍ファイルとは別に提供するものとあります。長辺2560px以上、短辺1600px以上の300ppi、50MB以下のJPEG画像です。

一方内部コンテンツ表紙画像は電子書籍の実際の表紙で、大きい高解像度の画像という非常にあいまいな要求値になっています。なので電子書籍ファイルサイズを気にしなければ、マーケティング用表紙画像と共用するのが楽かも。

高解像度のKindleを持っていないので無印Kindleの内部コンテンツ表紙画像としては縦1200px、横900pxで十分ですが。上位のKindleをカバーするにはどの程度のサイズが必要なんでしょうね?

とりあえず準備した画像はOPFファイルで電子書籍に埋め込まれるので、本文コンテンツ側で表紙として表示させる必要はありません。というかしてはいけません。

OPFファイルでの指定方法は後述します。

目次について

目次には以下の2種類があります。

  • HTML目次(本の巻頭に表示される)
  • 論理目次(Kindleのナビゲーションに使用される)

HTML目次というのは本の巻頭に表示される、いわゆる「目次」です。当然電子書籍ですから<a>タグで本文の各部へリンクが張られていますが、見た目には普通の「本の目次」。

これは本文のHTMLファイルに書くことも可能ですが、後述の論理目次と統合してしまったほうが不整合が生じないのでよさそうです。

では論理目次とは何かというと、これはKindleのナビゲーションで表示されるリンクリストです。本文のどこを読んでいてもメニューボタンを押すと表示されるので、非常に便利な機能です。というかKindleユーザーにはあって当たり前の機能ですね。

この論理目次にはtoc nav要素を使用したHTMLベースのものと、NCXを使用したXMLベースのものがあります。

前者のほうが平易であるうえIDPF 3.0仕様の一部ということで、どちらでもよいのであればこちらを採用するほうがいいでしょう。ということで、IDPF 2.0仕様の一部であるNCXについてはここでは言及しません。

論理目次の書き方

論理目次なので、章や節などの上下関係を表現できます。(しなくてもいいけど)

具体的には<ol>タグの入れ子で表現します。例えばこんな感じ。

<!doctype html>
<html lang='ja'>
〜略〜
<body>
<nav epub:type="toc">
<ol>
  <li><a href="body.html#intro">序文</a></li>
  <li><a href="body.html#first">第一章</a></li>
  <ol>
    <li><a href="body.html#first-1">第一節</a></li>
    <li><a href="body.html#first-2">第二節</a></li>
    ...
  </ol>
  ...
</ol>
</nav>
</body>
</html>

body.htmlは本文ファイルで、それぞれリンク先にidを付与してあります。このようにして用意した論理目次ファイルは、表紙画像同様OPFファイルで電子書籍本体に組み込まれます。(後述)

出版物ヘッダファイルについて

まずはOPFファイルのスケルトン。package要素にバージョンとユニークID名を指定します。ユニークID名はmetadata要素内で指定する書籍IDの変数名になります。

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="3.0" unique-identifier="pub-id">

<metadata>
...
</metadata>

<manifest>
...
</manifest>

<spine>
...
</spine>

<nav epub:type="landmarks">
...
</nav>

</package>

ではpackage要素内の要素をそれぞれ順を追って説明します。

metadata要素

ここには電子書籍のタイトルや言語情報などを記述します。以下はNHK語学講座の「まいにち中国語」のテキストを勝手に繁体字化した野良電子書籍を作った際のmetadataです。

<metadata>
  <dc-metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
    <dc:identifier id="pub-id">science.junk-works.www</dc:identifier>
    <dc:title>まいにち中国語 注音繁体字版</dc:title>
    <dc:language>ja</dc:language>
    <meta property="dcterms:modified">2011-01-01T12:00:00Z</meta>
  </dc-metadata>
</metadata>

dc:identifier要素には先ほどpackage要素内で指定したユニークIDのID名を指定し、ユニークな値をセットします。通常はISBN番号などを書くようです。

dc:title要素にはタイトルを、dc:language要素には言語を指定します。

meta要素はEPUB Publications 3.0のドキュメントを読んだけどよくわからず。最低限ひとつはmetaを含む必要があって、必須項目がdcterms:modifiedらしいことはわかったんだけど、日時設定がよくわからない。とりあえずこのままで。。。

manifest要素

この中では表紙画像や目次、本文など電子書籍の構成ファイルを指定します。

<manifest>
  <item id="cover-image" media-type="image/jpg" href="cover.jpg" properties="cover-image" />
  <item id="toc" properties="nav" href="toc.xhtml" media-type="application/xhtml+xml" />
  <item id="content" media-type="application/xhtml+xml" href="content.html" />
</manifest>

id=”cover-image”で表紙画像を、id=”toc”で論理目次ファイルを指定し、id=”content”で本文ファイルを指定しています。

このとき本文を複数に分割していればそれぞれに固有のidを振り、すべてこの中に指定します。また、本文で使用している画像ファイルも同様にidを振ってここに指定します。

spine要素

spine要素はmanifest要素に列挙したファイルが実際に表示される順番を指定します。

<spine>
  <itemref idref="cover-image" />
  <itemref idref="toc" />
  <itemref idref="content" />
</spine>

前述のガイドのとおり、目次は本文の前に置いて巻頭に表示されるようにします。manifest要素での指定が論理目次の指定、このspine要素での指定がHTML目次の指定ということになるのかな?

nav要素

ガイドアイテムの指定です。古い仕様ではguide要素を、新しい仕様ではnav要素を使います。spine要素と重複している気がしないでもないですが、ガイドラインにはこの指定を強く推奨と書いてあるので素直に従っておきます。

これを指定するとKindleメニューで選択可能になるとのこと。表紙と目次を指定します。

<nav epub:type="landmarks">
  <ol>
    <li><a epub:type="cover-image" href="cover.jpg">表紙</a></li>
    <li><a epub:type="toc" href="toc.xhtml">目次</a></li>
  </ol>
</nav>

本文を用意する

最後に本文を用意します。Kindle Format 8はHTML5のほとんどの機能をサポートするそうです。注意点は以下のとおり。

  • 要素の配置にマイナス値を使わない
  • スクリプトを使用しない(JavaScriptはサポートしない)
  • <p>タグをネストさせると誤動作する
  • XMLエンティティの仕様は必要最小限にする(<,>,&程度)
  • 空白文字は通常のスペースか&nbsp;、&zwnj;以外は使用しない

他にも細かくあるようですが、普通にモダンなコーディングする分には気にしなくて良さそう。

文字コードはUTF-8を使用する必要があり、HTMLヘッダ内で以下のとおりエンコード指定します。…HTML5の簡略化指定はダメなのか。

<!doctype html>
<html lang='ja'>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
〜略〜
</html>

コンパイルする

まずはKindleGenをダウンロードしましょう。Windows用、Mac用に加えてLinux用があります。

ZIP展開して出てきたkindlegenに出版物ヘッダファイル(OPFファイル)を食わせると、エラーがなければ電子書籍(.mobiファイル)が生成されます。

$ kindlegen content.opf

*************************************************************
 Amazon kindlegen(MAC OSX) V2.9 build 1028-0897292 
 A command line e-book compiler 
 Copyright Amazon.com and its Affiliates 2014 
*************************************************************

Info(prcgen):I1047: Added metadata dc:Title        "まいにち中国語 注音繁体字版"
Info(prcgen):I1002: Parsing files  0000006
Info(prcgen):I1015: Building PRC file
Info(prcgen):I1006: Resolving hyperlinks
Info(pagemap):I8000: No Page map found in the book
Info(prcgen):I1045: Computing UNICODE ranges used in the book
Info(prcgen):I1046: Found UNICODE range: Basic Latin [20..7E]
Info(prcgen):I1046: Found UNICODE range: Hiragana [3040..309F]
Info(prcgen):I1046: Found UNICODE range: CJK Unified Ideographs [4E00..9FFF]
Info(prcgen):I1046: Found UNICODE range: Halfwidth and Fullwidth Forms [FF00..FFEF]
Info(prcgen):I1046: Found UNICODE range: Chinese, Japanese, and Korean (CJK) Symbols and Punctuation [3000..303F]
Info(prcgen):I1046: Found UNICODE range: Bopomofo [3100..312F]
Info(prcgen):I1046: Found UNICODE range: Spacing Modifier Letters [2B0..2FF]
Info(prcgen):I1046: Found UNICODE range: Katakana [30A0..30FF]
Info(prcgen):I1046: Found UNICODE range: General Punctuation - Windows 1252 [2026..2026]
Info(prcgen):I1017: Building PRC file, record count:   0000010
Info(prcgen):I1039: Final stats - text compressed to (in % of original size):  38.27%
Info(prcgen):I1040: The document identifier is: "MGTJTNW_IDDBJG"
Info(prcgen):I1041: The file format version is V6
Info(prcgen):I1031: Saving PRC file
Info(prcgen):I1032: PRC built successfully
Info(prcgen):I1016: Building enhanced PRC file
Info(prcgen):I1007: Resolving mediaidlinks
Info(prcgen):I1011: Writing mediaidlinks
Info(prcgen):I1009: Resolving guide items
Info(prcgen):I1017: Building PRC file, record count:   0000011
Info(prcgen):I1039: Final stats - text compressed to (in % of original size):  39.46%
Info(prcgen):I1041: The file format version is V8
Info(prcgen):I15000:  Approximate Standard Mobi Deliverable file size :   0000161KB
Info(prcgen):I15001:  Approximate KF8 Deliverable file size :   0000164KB
Info(prcgen):I1036: Mobi file built successfully

USB接続してKindleのdocumentsディレクトリ下にコピーするか、ブラウザアクセスできる場所に置いてそれを開くかすれば、めでたくKindleで読むことができますよ。( ´ ▽ ` )ノ

etc.ネタ

Posted by Takeru