ePubファイルを自分で作る方法

2010/08/18

ePubファイルはメインコンテンツとなるXHTML文書に専用のメタ情報を付加してzip圧縮したものなので、外部サービスやePubファイル作成ソフトウェアなどを使用しなくても一般的なWebページ作成の知識があれば簡単に作ることができます。

ここでは以下の簡単な2ページ分のWebページからePubファイルを作成する手順を示します。

ePubの元文書(表紙)ePubの元文書(1ページ目)

XHTML文書

まず、元となるXHTML文書は以下のような構成になっているとします。

-+- css
 |   +- style.css
 +- image
 |   +- cafe.jpg
 +- text
     +- cover.xhtml (表紙)
     +- 001.xhtml   (1ページ目)

この構成に対してePubファイルとして必要なメタファイルを作成していきます。

メタファイル

必要となるメタファイルとディレクトリ構成を以下に示します。

-+- mimetype
 +- META-INF
 |   +- container.xml
 +- OEBPS
     +- content.opf
     +- toc.ncx
     +- <ここに前述のXHTMLファイルを配置する>

以下、それぞれのメタファイルについて説明します。

mimetype

ファイル名・内容ともに固定でePubファイル(zipファイル)の先頭に置き、このファイルがePubフォーマットであることを示します。

application/epub+zip
container.xml

ePubファイルの要であるopfファイルのパスを指定するためのファイルで、ファイル名は固定、内容はopfファイルのパスのみ編集します。

今回の例ではOEBPSディレクトリ配下にcontent.opfを置くので以下のように編集します。

<?xml version="1.0" encoding="UTF-8"?>
<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>
content.opf

コンテンツの詳細を以下の要素に分けて記述します。記述必須のものを中心に説明します。ファイル名は任意です。

metadata ... 全体概要

title: タイトル(必須)

creator: 著者名(記述すべき)

language: 記述言語(必須)

identifier: コンテンツを特定する識別子。URIやISBNを用いると分かりやすい(必須)

manifest ... 構成ファイルの詳細

item: 構成ファイル一つ一つに一意のIDを付与し、実ファイルとその種別を指定する(必須)

(*) 後述する目次ファイル(.ncx)のパスをここで指定する

spine ... 目次情報

itemref: 表示するページ毎に一意のIDを付与し、表示順にページ数分記述する

その他にも様々な情報を記述できるので詳細は以下を参照して下さい。

<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookID" version="2.0">
  <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">Life with IT</dc:creator>
    <dc:language>ja</dc:language>
    <dc:identifier id="BookID" opf:scheme="URL">http://l-w-i.net/m/20100818_01.txt</dc:identifier>
  </metadata>
  <manifest>
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
    <item id="style" href="css/style.css" media-type="text/css"/>
    <item id="cover" href="text/cover.xhtml" media-type="application/xhtml+xml"/>
    <item id="file001" href="text/001.xhtml" media-type="application/xhtml+xml"/>
    <item id="image-cafe" href="img/cafe.jpg" media-type="image/jpeg"/>
  </manifest>
  <spine toc="ncx">
    <itemref idref="cover"/>
    <itemref idref="file001"/>
  </spine>
</package>
toc.ncx

前述のcontent.opfで指定した目次ファイルです。

opfファイルで指定した目次のIDとXHTMLファイルとの関連付けを記述します。ファイル名は任意です。

各要素毎に記述内容を説明します。

head

uid: content.opfで指定したID

depth: コンテンツ階層の深さ。1以上を指定

totalPageCount: トータルページ数。0指定でよい

maxPageNumber: 最大ページ数。0指定でよい

docTitle

text: コンテンツのタイトル

navMap

navPoint: content.opfで各ページに付与したidを記述し、playOrderでナビゲート順を指定する。スタートは1

<?xml version="1.0" encoding="UTF-8"?>
<!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>
    <meta name="dtb:uid" content="http://l-w-i.net/m/20100818_01.txt"/>
    <meta name="dtb:depth" content="1"/>
    <meta name="dtb:totalPageCount" content="0"/>
    <meta name="dtb:maxPageNumber" content="0"/>
  </head>
  <docTitle>
    <text>ePubサンプル</text>
  </docTitle>
  <navMap>
    <navPoint id="cover" playOrder="1">
      <navLabel>
        <text>表紙</text>
      </navLabel>
      <content src="text/cover.xhtml"/>
    </navPoint>
    <navPoint id="file001" playOrder="2">
      <navLabel>
        <text>1ページ目</text>
      </navLabel>
      <content src="text/001.xhtml"/>
    </navPoint>
  </navMap>
</ncx>

ePubファイル作成

ここまでできたらいよいよePubファイルの作成を行います。

まずmimetypeはzipのファイルの先頭に非圧縮で配置する必要があるので以下の手順でzipファイルに格納します。

% zip -0 sample.epub mimetype

(*) -0オプション: 非圧縮指定

その他のファイルはまとめて以下のようにzip圧縮します。

% zip -r sample.epub META-INF OEBPS

(*) -rオプション: 配下のファイル全てを対象とする指定

これでePubファイルが完成です。

同フォーマットに対応した電子ブックリーダーで参照できればOKです。

参考までに、iPhoneのiBooksで参照すると以下のように見えます。

ePub(表紙)ePub(1ページ目)