EPUBファイルを解剖してみる~楽天工房のファイルを解剖する~

EPUBファイルとは

電子書籍用のファイルのことです。詳細は、こちらのサイトにあります。

電子書籍を執筆することも可能です。それを作るのに、HTMLとCSSの知識(というか存在していること)を持っていればいけそうです。

【EPUBファイルとは】

EPUB3とは、電子書籍のファイルフォーマット規格の1つEPUBの最新メジャーバージョンである。別項「EPUB」でも説明しているように、EPUBはIDPF(International Digital Publishing Forum:国際電子出版フォーラム)と言う電子出版・電子書籍に関わる国際的な標準化団体が仕様を策定し、普及促進をしているもので、EPUB3は2011年にリリースされた。
その後、EPUBでの解説にも書いたとおり、策定団体がIDPFからW3Cへ統合され、開発が進められている。
前回のebookpedia記事公開(2015年12月)以降、次のマイナーバージョンとなる3.1(2017年1月)がリリース、現在の最新は2019年5月にリリースされた3.2となる。

とあります。まぁ電子書籍を出版するのに使用するファイル形式だということです。

筆者の持っている電子書籍リーダー(Kindle(アマゾン), KOBO(楽天)etc ...)ではPDFとEPUBの両方を読むことができる。その中でEPUB形式の書籍は英語のものは対象の単語を長押しすることで意味を検索してくる機能がついている。すげー重宝します。

EPUBファイルを解剖してみる

なんでそんなことをするのか?というところですが、EPUBファイルを作成したいけど「どう作ればよいのか?」が知りたいのでこの記事を書くことにしました。つまり調べてそれをまとめるということです。

参照するのはGitbookのEPUB仕様ですがまともに日本語訳していませんでした。。。Google翻訳で読んだ方が全然いい感じでした。。。

結局こちらのページを参照します。W3Recommendation Reading Systems 3.3

概要

【概要】

EPUB® 3 は、デジタル出版物およびドキュメントの配布および交換フォーマットを定義します。EPUB 形式は、HTML、CSS、SVG、その他のリソースを含む、構造化されセマンティックに拡張された Web コンテンツを単一ファイル コンテナで配布するために表現、パッケージ化、エンコードする手段を提供します。
この仕様は、EPUB 3 読み取りシステム (EPUB 出版物をレンダリングするユーザー エージェント) の適合要件を定義します。

とりあえず、EPUBはZIPファイルで、mimetypeファイルは非圧縮でZIPファイルに追加する必要があるということがわかっています。

mimetypeに関して、「非圧縮で・・・」というのは次のコマンドでZIPファイルに追加するという意味でした。

zip -0X '○○.epub' mimetype
zip -0X '○○.epub' META-INF/container.xml * -x mimetype

楽天工房でアップロードするとエラーになりました。コマンドは下のものが正しいようです。

zip -0X '○○.epub' mimetype
zip -r '○○.epub' * -x mimetype

意味としては、以下の通りです。
1行目:「mimeypeファイルは非圧縮で○○.epubに追加」
2行目:「○○.epubにこのディレクトリ以下にあるものすべてを追加、ただしmimetypeを除く」

zip -0は無圧縮のゼロレベルを意味します。

「-X」というオプションを指定しないとエクストラ フィールドという余計な物がmimetypeなどに追加されて電子書籍のチェッカーはエラーと判定してしまいます。
「zip -0X ○○.epub META-INF/container.xml * -x mimetype」はmimetype以外のファイルを全てzip圧縮します。

解剖開始

参考にするEPUBファイルをダウンロードしてきます。
そのファイルをコピーして、拡張子を「zip」に変更します。展開して開くと下のようになります。

キーポイントとしては「META-INF/container.xml」ファイルです。
まずはこれを見てみます。

container.xml

「container.xml」は名称固定のファイルです。META-INFフォルダ配下に配置することがルール付けされています。

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

どうやら、「full-path="OEBPS/content.opf"」を指定しているようです。でわこちらを見てみましょう。

content.opf

書籍の情報について書いてある設定ファイル。こちらに仕様が書いてある。

オープン・パッケージング・フォーマット(OPF)というらしい、そして「電子出版物のコンテンツを表現するための標準を記述しており、コンテンツの普及に対する障壁を軽減させることを目的としています。」とある。

<?xml version='1.0' encoding='UTF-8'?>

<package xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:opf="http://www.idpf.org/2007/opf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.idpf.org/2007/opf" unique-identifier="id" version="2.0">
  <metadata>
    <dc:rights>Copyrighted. Read the copyright notice inside this book for details.</dc:rights>
    <dc:identifier id="id" opf:scheme="URI">http://www.gutenberg.org/ebooks/16</dc:identifier>
    <dc:creator opf:file-as="Barrie, J. M. (James Matthew)">J. M. Barrie</dc:creator>
    <dc:title>Peter Pan</dc:title>
    <dc:language xsi:type="dcterms:RFC4646">en</dc:language>
    <dc:subject>Fantasy literature</dc:subject>
    <dc:subject>Peter Pan (Fictitious character) -- Fiction</dc:subject>
    <dc:subject>Never-Never Land (Imaginary place) -- Fiction</dc:subject>
    <dc:subject>Pirates -- Fiction</dc:subject>
    <dc:subject>Fairies -- Fiction</dc:subject>
    <dc:date opf:event="publication">2008-06-25</dc:date>
    <dc:date opf:event="conversion">2018-03-18T13:47:20.319743+00:00</dc:date>
    <dc:source>http://www.gutenberg.org/files/16/16-h/16-h.htm</dc:source>
  </metadata>
  <manifest>
    <item media-type="text/css" id="item1" href="pgepub.css"/>
    <item media-type="text/css" id="item2" href="0.css"/>
    <item media-type="text/css" id="item3" href="1.css"/>
    <!--Chunk: size=80460 Split on div-->
    <item media-type="application/xhtml+xml" id="item4" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-0.htm.html"/>
    <!--Chunk: size=63172 Split on div-->
    <item media-type="application/xhtml+xml" id="item5" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-1.htm.html"/>
    <!--Chunk: size=51622 Split on div-->
    <item media-type="application/xhtml+xml" id="item6" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-2.htm.html"/>
    <!--Chunk: size=55127 Split on div-->
    <item media-type="application/xhtml+xml" id="item7" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-3.htm.html"/>
    <!--Chunk: size=59859 Split on div-->
    <item media-type="application/xhtml+xml" id="item8" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-4.htm.html"/>
    <!--Chunk: size=71914-->
    <item media-type="application/xhtml+xml" id="item9" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-5.htm.html"/>
    <item media-type="application/x-dtbncx+xml" id="ncx" href="toc.ncx"/>
  </manifest>
  <spine toc="ncx">
    <itemref linear="yes" idref="item4"/>
    <itemref linear="yes" idref="item5"/>
    <itemref linear="yes" idref="item6"/>
    <itemref linear="yes" idref="item7"/>
    <itemref linear="yes" idref="item8"/>
    <itemref linear="yes" idref="item9"/>
  </spine>
</package>

各タグの調査

こちらのサイトにある内容で学習しました。

metadataタグ

    <dc:rights>Copyrighted. Read the copyright notice inside this book for details.</dc:rights>
    <dc:identifier id="id" opf:scheme="URI">http://www.gutenberg.org/ebooks/16</dc:identifier>
    <dc:creator opf:file-as="Barrie, J. M. (James Matthew)">J. M. Barrie</dc:creator>
    <dc:title>Peter Pan</dc:title>
    <dc:language xsi:type="dcterms:RFC4646">en</dc:language>
    <dc:subject>Fantasy literature</dc:subject>
    <dc:subject>Peter Pan (Fictitious character) -- Fiction</dc:subject>
    <dc:subject>Never-Never Land (Imaginary place) -- Fiction</dc:subject>
    <dc:subject>Pirates -- Fiction</dc:subject>
    <dc:subject>Fairies -- Fiction</dc:subject>
    <dc:date opf:event="publication">2008-06-25</dc:date>
    <dc:date opf:event="conversion">2018-03-18T13:47:20.319743+00:00</dc:date>
    <dc:source>http://www.gutenberg.org/files/16/16-h/16-h.htm</dc:source>
タグ名 意味 サンプル
dc:rights コピーライトを書く。 <dc:rights xml:lang="ja">ⓒ 2019, 保毛 </dc:rights>
dc:creator 作成者を書く。 <dc:creator opf:file-as="Barrie, J. M. (James Matthew)">J. M. Barrie</dc:creator>
dc:identifier 曖昧さのないものが必要とされる。URIやISBNなどが相当する。 <dc:identifier id="id" opf:scheme="URI">http://www.gutenberg.org/ebooks/16</dc:identifier>;
dc:title タイトルを書く。 <dc:title>Peter Pan</dc:title>
dc:language 資源がどの言語で書かれているのかを、RFC 3066の言語コード書式で書くのが望ましい。 <dc:language rdf:datatype="&dct;ISO639-2">jpn</dc:language>
dc:subject 資源の内容の話題。まとめられた語彙の中から使うことが望ましい。 <dc:subject rdf:datatype="&dcndl;NIISubject">情報学</dc:subject>
dc:date 資源に関する主要な出来事が起こった日付(更新日、作成日など)を記述する。ISO 8601(又はJIS X 0301)の書式に則ることが推奨される。 <dc:date rdf:datatype="&xs;#dateTime">2019-08-29T06:42+09:00</dc:date>
dc:source 資源が参照しているもの。公式な識別システムに従っている文字列や番号が望ましい。 <dc:source rdf:resource="URN:ISBN:978-4-10-353423-5"/>

manifestタグ

【引用】


manifestは必須(required)で、出版物を構成する全ファイルのリスト(例えば、コンテンツ・ドキュメント、スタイルシート、画像ファイル、組み込みフォント・ファイル、包含するスキーム)を提供しなければなりません(must)。manifest要素には、1つ以上のitem要素を含まなければなりません(must)。itemには、出版物の一部と見なされるドキュメント、画像ファイル、スタイルシートやその他の構成要素をそれぞれ記述します。manifestには、OPFパッケージ・ドキュメントの構成ファイルを参照するitem要素を含んではなりません(must not)。

itemタグで参照するドキュメントの内容を定義しているようです。

  • CSSファイルの指定
  • HTMLファイルの指定
  <manifest>
    <item media-type="text/css" id="item1" href="pgepub.css"/>
    <item media-type="text/css" id="item2" href="0.css"/>
    <item media-type="text/css" id="item3" href="1.css"/>
    <!--Chunk: size=80460 Split on div-->
    <item media-type="application/xhtml+xml" id="item4" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-0.htm.html"/>
    <!--Chunk: size=63172 Split on div-->
    <item media-type="application/xhtml+xml" id="item5" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-1.htm.html"/>
    <!--Chunk: size=51622 Split on div-->
    <item media-type="application/xhtml+xml" id="item6" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-2.htm.html"/>
    <!--Chunk: size=55127 Split on div-->
    <item media-type="application/xhtml+xml" id="item7" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-3.htm.html"/>
    <!--Chunk: size=59859 Split on div-->
    <item media-type="application/xhtml+xml" id="item8" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-4.htm.html"/>
    <!--Chunk: size=71914-->
    <item media-type="application/xhtml+xml" id="item9" href="@public@vhost@g@gutenberg@html@files@16@16-h@16-h-5.htm.html"/>
    <item media-type="application/x-dtbncx+xml" id="ncx" href="toc.ncx"/>
  </manifest>

spineタグ

【引用】


manifestの後には、spine素が1つだけなければならず(must)、これには1つ以上のitemref要素が含まれます。個々のitemrefは、manifestで指定されているOPSコンテンツ・ドキュメントを参照します。itemref要素の順序は、出版物で読まれる順序で関連するOPSコンテンツ・ドキュメントを編成します。

  <spine toc="ncx">
    <itemref linear="yes" idref="item4"/>
    <itemref linear="yes" idref="item5"/>
    <itemref linear="yes" idref="item6"/>
    <itemref linear="yes" idref="item7"/>
    <itemref linear="yes" idref="item8"/>
    <itemref linear="yes" idref="item9"/>
  </spine>

spineタグのtoc属性のncxは「宣言型目次」を示しているようだ。
linearは「linear="no"を設定し、これらのコンテンツのドキュメントが補助的であると指定」のようにnoなら補助的になるようだ。

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す