テキストエディタとzipコマンドだけで電子書籍を作ってみた

思うところがあって、ePub形式の電子書籍について調べている。

どうやら、ePubの実体は zip 圧縮されたXHTML+XMLファイルで構成されているらしく、テキストエディタさえあれば簡単に作れるっぽい。

以下のページを参考に自分でも作ってみた。

日本語Epubブックサンプル - 横浜工文社
.epub eBooks Tutorial

ePubを構成するファイル

ePubは以下のようなファイル群で構成される*1

mimetype
META-INF/
  container.xml
OEBPS/
  content.opf
  toc.ncx
  コンテンツ(XHTML)

以下、これらのファイルをテキストエディタで記述していく。

作業フォルダを用意する

まず、以下のような作業フォルダを用意する。

hello/
  META-INF
  OEBPS

mimetype を作成する

helloフォルダの直下に以下のような内容で mimetype というファイル名でファイルを作成する

application/epub+zip

このファイルは、電子書籍リーダーがファイルの形式を正しく認識するために必要で、後の手順zipでファイルをまとめるときにも「無圧縮」で、1番最初のファイルとしてzipファイルに格納する必要がある。

仕様の詳細は
OEBPS Container Format (OCF) 1.0 日本語版
を参照

META-INF/container.xml を作成する

META-INFフォルダ配下の container.xml ファイルは、ePubという入れ物の中にどのようなモノが含まれているのかといった情報をおさめたファイル。
Amazonで書籍を注文したときに届けられる段ボール箱をイメージしたら分かりやすいかも。

container.xmlを読めば、この箱の中にどのような書籍が含まれていかが分かるようになっている。

とりあえず、以下のようなXMLファイルを作成する。

<?xml version="1.0"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
  <rootfiles>
    <rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml" />
  </rootfiles>
</container>

仕様の詳細は
OEBPS Container Format (OCF) 1.0 日本語版
を参照

OEBPS/content.opf を作成する

OEBPSフォルダ配下のcontent.opf は、書籍のタイトル、著者などのメタ情報や、そのコンテンツを構成するファイルを定義しているファイル。
この例ではOEBPSフォルダの配下に作っているけど、先のcontent.xmlファイルに適切に記述すれば、任意のフォルダ名とすることができる。
が、歴史的な経緯で、OEBPSフォルダじゃないとちゃんと読み込んでくれないePubリーダーも存在するらしいので、OEBPSって名前にしておいたほうが無難かも。

content.opfの内容は以下のとおり

<?xml version="1.0"?>
<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId">
  <metadata xmlns:dc="http://purl.org/dc/elements/1.1/"
            xmlns:opf="http://www.idpf.org/2007/opf">
    <!-- 書籍のタイトル -->
    <dc:title>こんにちは .epub</dc:title>
    <!-- 著者 -->
    <dc:creator opf:role="aut">snaka72</dc:creator>
    <!-- 言語 RFC3066に従う -->
    <dc:language>ja</dc:language>
    <dc:rights>Public Domain</dc:rights>
    <dc:identifier id="BookId">urn:uuid:snaka72.20110403193850</dc:identifier>
  </metadata>
  <manifest>
    <item id="ncx" href="toc.ncx" media-type="text/xml" />
    <item id="titlepage" href="title_page.xhtml" media-type="application/xhtml+xml" />
    <item id="chapter01" href="chapter01.xhtml" media-type="application/xhtml+xml" />
    <item id="chapter02" href="chapter02.xhtml" media-type="application/xhtml+xml" />
  </manifest>
  <spine toc="ncx">
    <itemref idref="titlepage" />
    <itemref idref="chapter01" />
    <itemref idref="chapter02" />
  </spine>
</package>

仕様の詳細は
OPF 2.0 v1.0 日本語訳 [Open Packaging Format (OPF) 2.0 v1.0]
を参照

OEBPS/toc.ncx を作成する

OEBPS/toc.ncx とは、「目次」を定義するファイル。

以下のようなXMLファイルとなっている。

<?xml version="1.0"?>
<ncx xmlns="http://www.daisy.org/x3986/2005/ncx/" version="2005-1">
  <head>
    <!-- content の値は content.opf のBookIdの値と一致させること -->
    <meta name="dtb:uid" content="snaka72.20110403193850"/>
    <meta name="dtb:depth" content="1"/>
    <meta name="dtb:tatlPageCount" content="0"/>
    <meta name="dtb:maxPageNumber" content="0"/>
  </head>
  <!-- 書籍タイトル -->
  <docTitle>
    <text>hello .epub</text>
  </docTitle>
  <navMap>
    <navPoint id="title_page" playOrder="1">
      <navLabel>
        <text>もくじ</text>
      </navLabel>
      <content src="title_page.xhtml"/>
    </navPoint>
    <navPoint id="chapter01" playOrder="2">
      <navLabel>
        <text>第1章</text>
      </navLabel>
      <content src="chapter01.xhtml"/>
    </navPoint>
    <navPoint id="chapter02" playOrder="3">
      <navLabel>
        <text>第2章</text>
      </navLabel>
      <content src="chapter02.xhtml"/>
    </navPoint>
  </navMap>
</ncx>

ちなみに、XMLなので日本語を使う場合はエンコーディングUTF-8UTF-16にすること。
それ以外(Shift_JISEUC-JP)を使う場合は、charsetを適切に設定する必要がある。

NCXの仕様の詳細は、
Specifications for the Digital Talking Book
を参照

コンテンツ(XHTML)を作成

いよいよ、書籍のコンテンツを作ります。
とりあえず以下のような構成でXHTMLファイルを作ります。

  • 表示(兼目次)
  • 第1章
  • 第2章

中身はこんな感じ

title_page.xhtml

<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 STRICT//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
  <head>
    <title>こんにちは .epub</title>
  </head>
  <body>
    <h1>こんにちは .epub</h1>
    <h2>もくじ</h2>
    <ul>
      <li><a href="chapter01.xhtml">第1章</a></li>
      <li><a href="chapter02.xhtml">第2章</a></li>
    </ul>
  </body>
</html>

chapter01.xhtml

<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 STRICT//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
  <head>
    <title>Chapter01</title>
  </head>
  <body>
    <h2>第1章 こんにちわ</h2>
    <p>
      こんにちわ ePub
    </p>
  </body>
</html>

chapter02.xhtml

<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 STRICT//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
  <head>
    <title>Chapter02</title>
  </head>
  <body>
    <h2>第2章 よろしく</h2>
    <p>
      よろしく ePub
    </p>
  </body>
</html>

コンテンツの大部分は通常のXHTML/CSSと同様に記述することが可能ですが、制限や拡張されてい部分があるようです。
仕様の詳細は
OPS 2.0 v1.0 日本語訳 [Open Publication Structure (OPS) 2.0 v1.0]
を参照。

.epub ファイルを作る

これまで作ったファイルを、.epubファイルとしてアーカイブすれば、電子書籍の完成です。
.epubファイルは zip 形式で圧縮する必要があります。
また、mimetypeファイルは、「圧縮なし」で1番目のファイルとしてアーカイブファイルの中に格納しなければなりません。

zipコマンドが使えるなら、以下のような手順でアーカイブを作成することができます。

cd hello
zip -0 ../hello.epub  mimetype
zip -r ../hello.epub * -x mimetype

この手順は、
日本語Epubブックサンプル - 横浜工文社
がとても参考になりました。

iPhoneで見てみる

では、さっそく作成した、ePubファイルを iTunes にドラッグ&ドロップして、iPhone 転送します。
同期が完了したら、iPhoneiBook を開きます。すると、今しがた作成した書籍のタイトルが本棚に並んでいるのが見えると思います。
それを開いてみると...

無事、iPhoneで自分の作った書籍を読むことができました。

*1:ほんとは画像ファイルとか,スタイルシートとかも格納できるけど簡単のため省略している