EPUBの概要
PS:上記の注意書きは手動で追加したものです。記事は旧ブログから移行されたもので、更新日がブログの自動注意書きのトリガー条件に達していないためです。
EPUBとは
EPUBは、自由でオープンな電子書籍フォーマットです。当初は国際デジタルパブリッシングフォーラム(International Digital Publishing Forum、略称IDPF)によって策定が推進され、その後、関連標準のメンテナンスはW3Cに移管されました。
EPUBは、固定レイアウトのドキュメントを表示するためにも、コンテンツの自動リフローを実現するためにも使うことができます。コンテンツのリフローとは、電子書籍のコンテンツが、読書デバイスの画面サイズ、フォントサイズ、組版設定などに応じて表示方法を自動的に調整することです。これが、EPUBが多くの固定レイアウト文書よりも電子書籍リーディングに適している理由の一つです。
EPUBの発展は、1999年にオープン電子書籍フォーラム(Open eBook Forum、略称OeBF)が提唱したOEBPS(Open eBook Publication Structure)にまで遡ることができます。後にOeBFはIDPFに改名され、OEBPSも徐々にEPUB標準の基礎へと発展しました。
1999年9月、OeBFはOEBPS 1.0をリリースしました。その後、OEBPSは1.0.1と1.2の2回のアップデートを経ました。2006年、IDPFはEPUBのコンテナフォーマットを定義するOCF 1.0(Open Container Format)をリリースしました。2007年、IDPFはOPF 2.0(Open Packaging Format)とOPS 2.0(Open Publication Structure)をリリースし、これらがEPUB 2.0標準の重要な構成要素となりました。
2010年にはEPUB 2.0.1がリリースされました。2011年にはEPUB 3.0がリリースされ、HTML5、CSS、オーディオ、ビデオ、スクリプト、国際化組版などへの対応がさらに強化されました。その後、2014年にEPUB 3.0のメンテナンスバージョンとしてEPUB 3.0.1が、2017年にはEPUB 3.1がそれぞれリリースされました。なお、IDPFとW3Cの統合に伴い、EPUB標準のメンテナンスは徐々にW3Cの体制下に移行しています。
現在、一般的に見られるEPUBは、主にEPUB 2とEPUB 3の2種類に分けられます。実際の制作や解析のためにファイルを展開する際には、EPUB 2の構造に遭遇することがよくあります。一方、比較的新しい仕様はEPUB 3が中心です。この記事では、主にEPUB 2の電子書籍ファイルを例に、EPUBの基本的なファイル構造について説明します。
EPUBのファイル構造
EPUBファイルの実体は、ZIP圧縮ファイルです。WinHexや他のバイナリエディタでEPUBファイルを開くと、ZIPファイルに一般的なファイルヘッダーを確認できます。例:
50 4B 03 04
そのため、多くのEPUBファイルは、拡張子を .epub から .zip に変更し、圧縮ソフトで解凍することで内部構造を確認できます。
EPUBは通常、XML、CSS、XHTML、そして画像やフォントなどのリソースに基づいています。その構成は次のとおりです。
- XML:電子書籍のメタデータ、目次、ファイルマニフェストなどの情報を記述するために使用されます。
- XHTML:本文コンテンツを格納するために使用されます。
- CSS:レイアウトとスタイルを制御するために使用されます。
- 画像、フォントなどのリソース:表紙、挿絵、カスタムフォントの表示に使用されます。
[乙野四方字].我会呼唤你的名字.epub を例にとると、ファイル名を [乙野四方字].我会呼唤你的名字.zip に変更して解凍すると、以下のようなファイル構造を確認できます。表示の都合上、一部のファイルは省略されています。
│ mimetype
│
├─META-INF
│ container.xml
│
└─OEBPS
│ content.opf
│ toc.ncx
│
├─Fonts
│ ziti1-1.ttf
│ ...
│
├─Images
│ cover.jpg
│ note.png
│
├─Styles
│ style.css
│
└─Text
contents.xhtml
...
このうち、mimetype と META-INF/container.xml は、EPUBにおいて非常に重要な二つのファイルです。通常、これらは固定的に存在します。
注意すべき点として、OEBPS というフォルダ名は必須ではなく、一般的な慣例に過ぎません。電子書籍のメイン設定ファイルの場所を実際に決定するのは、META-INF/container.xml 内のパス宣言です。
mimetype ファイル
mimetype はプレーンテキストファイルであり、その内容は次のように固定されています。
application/epub+zip
これは、このZIPコンテナがEPUBファイルであることを識別するために使用されます。
標準的なEPUBファイルでは、mimetype は通常、圧縮パッケージ内の最初のファイルである必要があり、圧縮されるべきではありません。これにより、リーダーや検出ツールがファイルタイプをより迅速に識別できます。
META-INF フォルダ
META-INF フォルダは、EPUBコンテナに関連する情報を格納するために使用されます。デフォルトでは、このディレクトリには少なくとも container.xml ファイルが一つ含まれます。
container.xml は通常、以下のようなものです。
<?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>
ここで、rootfile 要素の full-path 属性は、OPFファイルの場所を指定します。リーダーはこのパスに基づいてEPUBのメイン設定ファイルを見つけます。
container.xml 以外にも、META-INF には以下のファイルが存在する可能性があります。
manifest.xml:ファイルリストmetadata.xml:メタデータsignatures.xml:デジタル署名encryption.xml:暗号化情報rights.xml:権利管理情報
これらのファイルは、すべてのEPUBに必須というわけではなく、通常のEPUB制作や展開時の確認では、あまり気にする必要はありません。
OEBPS フォルダ
多くのEPUBファイルでは、OEBPS フォルダは実際の書籍コンテンツを格納するために使用され、以下のものが含まれます。
content.opf:電子書籍のメイン設定ファイルtoc.ncx:目次ファイル- XHTML本文ファイル
- CSSスタイルファイル
- フォントファイル
- 画像ファイル
一般的なリソースフォルダの命名は以下の通りです。
Fonts:フォントファイルImages:画像ファイルStyles:CSSスタイルファイルText:XHTML本文ファイル
これらのフォルダ名は必須ではなく、一般的な整理方法に過ぎません。OPFファイルでパスが正しく宣言されていれば、リーダーは対応するリソースを見つけることができます。
OPF ファイル
OPFファイルはEPUBにおいて最も重要なファイルの一つであり、その実体はXMLファイルです。電子書籍のメタデータ、ファイルマニフェスト、読書順序などの情報を記述する役割を担います。
OPFファイルのルート要素は <package> であり、一般的な属性は以下の通りです。
xmlns:XML名前空間を指定します。EPUB 2では通常http://www.idpf.org/2007/opfです。version:EPUB仕様のバージョンを指定します。例:2.0または3.0。unique-identifier:電子書籍の一意識別子を指定し、<metadata>内の特定の<dc:identifier>のidに対応します。
例:
<package version="2.0" unique-identifier="BookId" xmlns="http://www.idpf.org/2007/opf">
ここで、BookId は実際には識別子IDであり、後続の <metadata> で定義する必要があります。
OPFファイルは通常、以下の部分で構成されます。
<metadata>:メタデータ<manifest>:ファイルマニフェスト<spine>:読書順序<guide>:特殊ページインデックス。EPUB 2でよく見られます。<tour>:ガイドツアー情報。あまり使用されません。
metadata:メタデータ
<metadata> は、タイトル、著者、言語、主題、出版日など、電子書籍の基本情報を記述するために使用されます。
通常、Dublin Coreメタデータ要素、つまり一般的な dc:title、dc:creator、dc:language などのタグを使用します。
一般的な要素は以下の通りです。
<dc:title>書籍名を記述するために使用します。
<dc:title>Introduction to XML</dc:title>書籍名を指定するために使用します。
著者を記述するために使用します。
<dc:creator>John Doe</dc:creator><dc:subject>主題またはキーワードを記述するために使用します。
<dc:subject>XML</dc:subject><dc:description>概要、要約、または説明を記述するために使用します。
<dc:description>This document provides an introduction to XML.</dc:description><dc:publisher>出版社または発行者を記述するために使用します。
<dc:publisher>XYZ Publications</dc:publisher><dc:contributor>編集者、翻訳者、校正者などの貢献者を記述するために使用します。
<dc:contributor>Editor: Jane Smith</dc:contributor><dc:date>日付を記述するために使用します。通常は作成日、出版日、または修正日です。
<dc:date>2022-01-21</dc:date><dc:type>リソースタイプを記述するために使用します。
<dc:type>Text</dc:type><dc:format>リソースフォーマットを記述するために使用します。
<dc:format>application/epub+zip</dc:format><dc:identifier>リソースの一意識別子を記述するために使用します。UUID、URL、ISBNなどが使用できます。
<dc:identifier id="BookId">urn:uuid:5208e6bb-5d25-45b0-a7fd-b97d79a85fd4</dc:identifier><dc:source>リソースのソースを記述するために使用します。
<dc:source>https://example.com/collection</dc:source><dc:language>言語を記述するために使用します。
<dc:language>zh</dc:language><dc:relation>他のリソースとの関係を記述するために使用します。
<dc:relation>Is Part Of: XYZ Series</dc:relation><dc:rights>著作権と使用権限を記述するために使用します。
<dc:rights>Copyright © 2022, All Rights Reserved</dc:rights>
Dublin Core要素以外にも、metadata には拡張情報を補足するための <meta> タグを含めることができます。例:
<meta name="cover" content="cover.jpg"/>
なお、ここでの cover.jpg は通常ファイルパスではなく、<manifest> で宣言された特定のファイルIDです。
例:
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
<dc:title>我会呼唤你的名字</dc:title>
<dc:creator opf:file-as="末影服" opf:role="aut">乙野四方字</dc:creator>
<dc:language>zh</dc:language>
<dc:subject>轻小说</dc:subject>
<dc:description>EPUB制作:末影服</dc:description>
<dc:date opf:event="modification">2022-10-07</dc:date>
<meta content="1.7.0" name="Sigil version"/>
<dc:identifier id="BookId" opf:scheme="UUID">urn:uuid:5208e6bb-5d25-45b0-a7fd-b97d79a85fd4</dc:identifier>
<meta name="cover" content="cover.jpg"/>
</metadata>
manifest:ファイルマニフェスト
<manifest> は、XHTML文書、画像、スタイルシート、フォントファイルなど、電子書籍に含まれるすべてのリソースファイルを列挙するために使用されます。
各ファイルは <item> 要素によって宣言されます。例:
<item id="cover.jpg" href="Images/cover.jpg" media-type="image/jpeg"/>
ここで、
id:ファイルID。EPUB内部でこのリソースを参照するために使用されます。href:ファイルの相対パス。media-type:ファイルのメディアタイプ。
例:
<manifest>
<item id="Section001.xhtml" href="Text/Section001.xhtml" media-type="application/xhtml+xml"/>
<item id="Section002.xhtml" href="Text/Section002.xhtml" media-type="application/xhtml+xml"/>
<item id="Section003.xhtml" href="Text/Section003.xhtml" media-type="application/xhtml+xml"/>
<item id="Summary.xhtml" href="Text/Summary.xhtml" media-type="application/xhtml+xml"/>
<item id="contents.xhtml" href="Text/contents.xhtml" media-type="application/xhtml+xml"/>
<item id="cover.jpg" href="Images/cover.jpg" media-type="image/jpeg"/>
<item id="cover.xhtml" href="Text/cover.xhtml" media-type="application/xhtml+xml"/>
<item id="message.xhtml" href="Text/message.xhtml" media-type="application/xhtml+xml"/>
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
<item id="note.png" href="Images/note.png" media-type="image/png"/>
<item id="style.css" href="Styles/style.css" media-type="text/css"/>
<item id="title.xhtml" href="Text/title.xhtml" media-type="application/xhtml+xml"/>
<item id="ziti2.ttf" href="Fonts/ziti2.ttf" media-type="font/ttf"/>
<item id="ziti3.ttf" href="Fonts/ziti3.ttf" media-type="font/ttf"/>
</manifest>
spine:読書順序
<spine> は、電子書籍の本文の読書順序を定義するために使用されます。リーダーは通常、<spine> 内の順序に従ってコンテンツを順次表示します。
<spine> は複数の <itemref> 子要素で構成されます。例:
<itemref idref="cover.xhtml"/>
ここで、idref は <manifest> 内の特定の <item> の id に対応します。
例:
<spine toc="ncx">
<itemref idref="cover.xhtml" properties="duokan-page-fullscreen"/>
<itemref idref="title.xhtml"/>
<itemref idref="message.xhtml"/>
<itemref idref="Summary.xhtml"/>
<itemref idref="contents.xhtml"/>
<itemref idref="Section001.xhtml"/>
<itemref idref="Section002.xhtml"/>
</spine>
EPUB 2では、toc="ncx" はNCX目次ファイルのIDを指定するために使用されます。このIDは <manifest> で事前に宣言する必要があります。
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
guide:特殊ページインデックス
<guide> は、表紙、目次、本文開始ページなど、電子書籍内の特殊なページを列挙するために使用されます。この部分はEPUB 2でよく見られますが、必須ではありません。
例:
<guide>
<reference type="toc" title="Table Of Contents" href="Text/contents.xhtml"/>
<reference type="cover" title="Cover" href="Text/cover.xhtml"/>
</guide>
ここで、
type:ページタイプtitle:ページタイトルhref:対応するファイルパス
tour:ガイドツアー
<tour> は、電子書籍内の一部のページを特定の順序で整理し、ガイドツアーの経路を形成するために使用されます。この要素はあまり見られず、通常のEPUB制作ではほぼ使用されません。
NCX ファイル
NCXファイルはEPUB 2で一般的な目次ファイルであり、通常 toc.ncx という名前が付けられます。その実体もXMLファイルであり、電子書籍の目次構造を記述するために使用されます。
なお、EPUB 3では主にXHTML形式のナビゲーションドキュメント、つまり一般的な nav.xhtml が使用されます。ただし、古いリーダーとの互換性のために、一部のEPUB 3ファイルには依然として toc.ncx が保持されていることがあります。
以下では、[乙野四方字].我会呼唤你的名字.epub を解凍して得られた toc.ncx を例に説明します。
head:目次ヘッダー情報
toc.ncx 内の <head> は通常、以下のようなものです。
<head>
<meta name="dtb:uid" content="urn:uuid:5208e6bb-5d25-45b0-a7fd-b97d79a85fd4"/>
<meta name="dtb:depth" content="2"/>
<meta name="dtb:totalPageCount" content="0"/>
<meta name="dtb:maxPageNumber" content="0"/>
</head>
ここで、
dtb:uid:電子書籍の一意識別子。通常、OPFファイル内の<dc:identifier>と一致させます。dtb:depth:目次階層の深さ。dtb:totalPageCount:総ページ数。通常のEPUBでは通常0です。dtb:maxPageNumber:最大ページ番号。通常のEPUBでは通常0です。
厳密には、dtb:uid はOPFファイル内の識別子と一致させることが推奨されます。一致していなくても、一部のリーダーは正常に開く可能性がありますが、推奨されません。
docTitle:目次タイトル
<docTitle> は、目次ファイルに対応する書籍名を記述するために使用され、通常は以下のように記述します。
<docTitle>
<text>作品名</text>
</docTitle>
ここでの書籍名は、OPFファイル内の <dc:title> と一致させることが推奨されます。一致していなくても、リーダーは通常OPF内の書籍名を優先します。
navMap:目次構造
NCXファイルで最も主要なノードは <navMap> です。
<navMap> は複数の <navPoint> ノードで構成されます。各 <navPoint> は一つの目次項目を表し、表紙、制作情報、章、あとがきなどに対応させることができます。
<navPoint> 内の一般的な子ノードは以下の通りです。
<navLabel>:目次の表示名<content>:目次項目が指すファイルパス
ここで、playOrder 属性は目次内での現在の目次項目の順序を定義するために使用され、content ノードの src 属性は章ファイルの場所を定義するために使用されます。
<navPoint> はネストすることもでき、それによって多階層の目次構造を形成します。
例:
<navMap>
<navPoint id="navPoint-1" playOrder="1">
<navLabel>
<text>表紙</text>
</navLabel>
<content src="Text/cover.xhtml"/>
</navPoint>
<navPoint id="navPoint-2" playOrder="2">
<navLabel>
<text>制作情報</text>
</navLabel>
<content src="Text/message.xhtml"/>
</navPoint>
<!-- 中間部分省略 -->
<navPoint id="navPoint-29" playOrder="29">
<navLabel>
<text>終章、あるいは世界のどこかで</text>
</navLabel>
<content src="Text/Section009.xhtml"/>
</navPoint>
</navMap>
まとめ
簡単に言うと、EPUBは特定のルールに従って整理されたZIP圧縮ファイルと理解できます。そのコア構造はおおよそ以下の通りです。
EPUB ファイル
├─ mimetype
├─ META-INF
│ └─ container.xml
└─ 書籍コンテンツディレクトリ
├─ content.opf
├─ toc.ncx / nav.xhtml
├─ XHTML 本文
├─ CSS スタイル
├─ 画像
└─ フォント
ここで、
mimetypeはファイルタイプを宣言するために使用されます。container.xmlはOPFファイルを指し示すために使用されます。content.opfはメタデータ、ファイルマニフェスト、読書順序を記述するために使用されます。toc.ncxまたはnav.xhtmlは目次を記述するために使用されます。- XHTML、CSS、画像、フォントなどのファイルが共に電子書籍の本文とリソースを構成します。
これらのファイル間の関係を理解すれば、EPUBの展開、修正、制作が格段にわかりやすくなります。