2011年4月18日月曜日

ePub 2.0 ことはじめ (1) シンプルな ePub を作る

「ePub 2.0 ことはじめ」と題して、ePub 2.0 ドキュメントを作ってみます。どうぞ、よろしく。

はじめに

ePub 作成用のツールは色々出ていますが、「ePub 2.0 ことはじめ」ではエディターを使ってベタベタに ePub を作ります。これは、私が ePub 作成ツールが苦手なのと、ePub 2.0 の仕様について勉強したいためです。

なお、「ePub 2.0 ことはじめ」で作る ePub のソースコードは GitHub で公開しています。よろしければ、ご自由にお使い下さい。

シンプルな ePub を作る

まずは、ePub ドキュメント用のディレクトリー (epub-first-step) を作ります。一つの ePub ドキュメントに関するファイル (テキスト、画像 etc.) は全てこのディレクトリーの中に置きます。

$ mkdir epub-first-step
$ cd epub-first-step

ePub を作るのに最低限必要なファイルは次の 4 つです。

  • mimetype
  • META-INF/container.xml
  • OEBPS/content.opf
  • OEBPS/text.html

と、そのはずなのですが、iBooks で開こうとすると「本のフォーマットエラー この本はフォーマットが認識出来ないか無効なため開けません」というエラーが出て ePub ファイルが開けません。どうやら、目次ファイルも必要なようです。

  • OEBPS/toc.xml
mimetype

mimetype ファイルは、このドキュメントが ePub 形式であることを教えるためのファイルです。次の様にして作ります。

$ echo application/epub+zip > mimetype
META-INF/container.xml

META-INF というディレクトリーの中に container.xml というファイルを作ります。container.xml ファイルの目的は、どこに ePub ファイルの中身を説明したファイルがあるかをビューワー・アプリに教えることです。

まず、META-INF ディレクトリーを作ります。

$ mkdir META-INF

META-INF/container.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>

rootfile 要素の full-path 属性に opf ファイルへのパスを書きます。ここでは「OEBPS/content.opf」を指定しました。

mimetype ファイルと META-INF ディレクトリー (とその中身) の名前は予約語です。変更してはいけません。

opf ファイル

opf ファイルには、ePub (正確には zip ファイル) が含んでいるファイルの一覧とその説明を書きます。opf ファイルのファイル名は「書名.opf」か「content.opf」としているものを多く見かけます。ここでは「OEBPS/content.opf」とします。

ディレクトリー名は OEBPS とします。OEBPS とは ePub 規格の前身に当たる電子書籍フォーマットです。仕様では「OEBPS」でなくとも良いはずですが、歴史的な経緯で、OEBPSフォルダじゃないとちゃんと読み込んでくれないePubリーダーも存在するらしいので念のために OEBPS にします。

さあ OEBPS ディレクトリーを作ります。ePub ドキュメントの中身は、このディレクトリーの中に置く様にします。

$ mkdir OEBPS

今回は、hello.xhtml というサンプル・テキストだけ置くことにしましょう。この場合 opf ファイルの中身は次の様になります:

<?xml version="1.0" encoding="UTF-8"?>
<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 2.0 ことはじめ</dc:title>
    <dc:creator opf:role="aut">絳アト</dc:creator>
    <dc:language>ja</dc:language>
    <dc:identifier id="BookId">urn:uuid:akaato.com20110418</dc:identifier>
 </metadata>
 <manifest>
   <item id="ncx" href="toc.ncx" media-type="text/xml" />
   <item id="hello" href="hello.xhtml" media-type="application/xhtml+xml" />
 </manifest>
 <spine toc="ncx">
   <itemref idref="hello" />
 </spine>
</package>

metadata 要素の中に、書名・著者名・言語を入れます。重要なのは dc:identifier 要素で、世界で唯一の文字列にしなければなりません。本であれば ISBN を使うと良いでしょう。私は、自分のサイト名と作成年月日を ID にしました。

manifest 要素には、中に入っている全てのファイルとそのファイルの種類 (media-type) を指定します。今回は、XHTML ファイルと目次ファイルの二つです。item 要素には必ず id 属性を付けます。この id 属性は、次の spine 要素の中で使うことになります。

spine 要素では、ファイルを読む「順番」を上から順に指定してゆきます。今回はファイルが一つなので順番は関係ありませんが...。idref 属性で指定する ID は、先の manifest 要素の中の item 要素で書いた id 属性値です。

ncx ファイル

ncx ファイルは目次のためのファイルです。今回は「toc.ncx」というファイル名にしました。toc.ncx ファイルの中身は次の通りです:

<?xml version="1.0" encoding="UTF-8"?>
<ncx xmlns="http://www.daisy.org/x3986/2005/ncx/" version="2005-1">
  <head>
    <meta name="dtb:uid" content="akaato.com20110418"/>
    <meta name="dtb:depth" content="1"/>
    <meta name="dtb:tatlPageCount" content="0"/>
    <meta name="dtb:maxPageNumber" content="0"/>
  </head>
  <docTitle>
    <text>ePub 2.0 ことはじめ</text>
  </docTitle>
  <navMap>
    <navPoint id="hello" playOrder="1">
      <navLabel>
        <text>サンプル</text>
      </navLabel>
      <content src="hello.xhtml"/>
    </navPoint>
  </navMap>
</ncx>

見た目の通りですが、1 つ注意点。<meta name="dtb:uid" content="akaato.com20110418"/> で、content 属性の値には、content.opf ファイルの dc:identifier 属性の値から先頭の「urn:uuid:」を除いた文字列を入れます。

XHTML ファイル

本当にシンプルな XHTML ファイルを作りましょう。ファイル名は hello.xhtml です。

<?xml version="1.0" encoding="UTF-8"?>
<!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>こんにちは</title>
</head>
<body>
  <p>こんにちは</p>
</body>
</html>

ePub の作成

ePub を作るファイルは全て用意できました。それでは、これらのファイルを固めて ePub ファイルにしましょう。

ePub は zip で固めます。注意点は 2 つ。1 つ目は圧縮しないこと。2 つ目は mimetype ファイルを zip アーカイブの先頭に置くことです。以下のコマンドを実行すると、上記の条件を満たした zip ファイルが出来上がります。

$ zip -0 ../epub-first-step.epub mimetype
$ zip -r ../epub-first-step.epub * -x mimetype

次回は、ePub ビューワーで作成した ePub ドキュメントを見てみましょう。

参考サイト

0 件のコメント:

コメントを投稿