Epub: opfファイルの書き方
.opf(Open Packaging Format)というパッケージドキュメントはファイル全体の設計図という役割にあたる。ここにファイルに書籍情報のメタ情報/リソースの参照/EPUBの構成(読み上げる順番)を定義させる需要なファイルになります。
この.opfによってEPUBの書籍のメタ情報や各章の順番、リソースの読み込みが行われている。各章のページは別途作成する必要がる。またこのファイルでは下記のタグを使用するので押さえておく必要がある。
<metadata> | 書籍のタイトルや著者情報・作成日などを記載するメタ情報 |
<manifest> | 書籍で使用するすべてのリソース先のファイルパスを記載する |
<spine> | <manifest>で取り込まれたリソースをどのような順番で構成するかを決める |
各タグについては順番ずつ説明していく。まずは.opfの作成から始めていく。
.opfの作成
.opfの作成位置は特に決まりはない。META-INFのcontainer.xmlでfull-path="..."と記述した場所に.opfファイルがあれば問題ない。例えば下記のような構成だとEPUB/package.opfにパッケージドキュメントが格納されているのでcontainer.xmlのfull-pathはfull-path="EPUB/package.opf"となる。
また、フォルダー名/ファイル名の指定はないので自由に設定できる。
sample
│ mimetype
│
├─EPUB
│ package.opf
│
└─META-INF
container.xml
別にパッケージドキュメントをフォルダー内に入れる必要もないのでsample直下においても問題はない。その代わりfull-path="package.opf"とする必要がある。
sample
│ mimetype
│ package.opf
├─EPUB
│ chapter1.xml
│ chapter2.xml
│ ...
└─META-INF
container.xml
package.opfを作成したらまずxmlの宣言文を記述する必要がある。
<?xml version="1.0" encoding="UTF-8" ?>
<package>
続いて<package>要素を下記のように記述していきます。この要素の役割は各リソースのすべての情報をカプセル化する役割がありいくつかのルールがあります。細かなルール等は3.4.1 The package Elementをご覧ください。ここでは必須の属性だけを説明したいと思います。
<?xml version="1.0" encoding="UTF-8" ?>
<package version="3.0" unique-identifier="uid" xmlns="http://www.idpf.org/2007/opf">
</package>
version
ここにはEPUB仕様のバージョンを記載します。現状3.0なのでそちらを記載する。
unique-identifier
unique-identifier属性の値は識別子の参照を設定する役割があります。この値は任意で"uid"と設定しています。基本的にEPUBはメインの識別子をメタデータに埋め込みます。この後に説明する<metadata>内に含まれる<dc:identifier>という識別子を格納する場所があり、どの識別子を参照するのか設定する必要があります。これについては後程。
xmlns=”http://www.idpf.org/2007/opf”
この名前空間宣言は必須でこの宣言がないとEpubcheckでエラーになるので必須になる。
<package>要素についてはこの3つの属性が必須項目なので押さえておくとよい。
続いて冒頭でも触れましたが<package>の基本的な中身は<metadata>/<manifest>/<spine>といった構成になっています。そしてこの各要素は書く順番があり、<metadata>/<manifest>/<spine>といった順番になります。またこの各要素は1つのみで複数存在してはいけないルールとなっています。
<?xml version="1.0" encoding="UTF-8" ?>
<package version="3.0" unique-identifier="uid" xmlns="http://www.idpf.org/2007/opf">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
...
</metadata>
<manifest>
...
</manifest>
<spine>
...
</spine>
</package>
<metadata xmlns:dc=”http://purl.org/dc/elements/1.1/”>
続いてメタ情報を入れる<metadata>について解説していく。package要素の1番目の要素になりmetadataに含める最小限の子要素は下記のようになる。
<?xml version="1.0" encoding="UTF-8" ?>
<package version="3.0" unique-identifier="uid">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:identifier id="uid">urn:uuid:7e50346d-d5c2-405b-93aa-xxxx</dc:identifier>
<dc:title>Sample</dc:title>
<dc:languag>ja</dc:languag>
<meta property="dcterms:modified">2026-09-12T01:57:09Z</meta>
</metadata>
....
</package>
Dublin Core要素dc:の要素を有効にするには属性にxmlns:dc="http://purl.org/dc/elements/1.1/"と記載する必要がある。これがないとFATAL(RSC-016)のエラーが表示される。ちなみに、metadata属性に設定しなくても問題なく、package属性にしても問題ない。
<dc:identifier>
この要素は識別子IDを格納する要素になります。特に決まりはないが本を出版している場合はurn:isbn:...と記載されている場合が多い。今回はUUID形式で記載しています。<package>の属性を作成する際にunique-identifier="uid"と指定しましたがここにid="uid"と記載し紐づけている。この設定がないとエラーになるので注意。
UUIDの生成方法だが、Windowsの場合PowerShellを起動して下記のコードを実行すると生成できる。
PS C:\desktop\Epub> [guid]::NewGuid()
Guid
----
7e50346d-d5c2-405b-93aa-xxxx
<dc:title>
ここには本のタイトルを入力します。
<dc:languag>
EPUBコンテンツ内の言語を入力します。
<meta property=”dcterms:modified”>
ここの<meta>要素には最終更新日時を必ず1つ含める必要がります。さらに値の指定があり[ISO 8601]の規格でなければならない。
YYYY-MM-DDThh:mm:ssZ
Windowsで生成する場合PowerShellで下記のように実行すると生成できる。
PS C:\desktop\Epub> Get-Date -Format "yyyy-MM-ddThh:mm:ssZ"
2026-09-12T01:57:09Z
著者名
こちらは必須ではないが上記だけのmetadataだと著者名が表示されない。設定するには次の要素を使用すると表示される。記述位置はmetadata内であれば問題ない。
<dc:creator>名前</dc:creator>
<manifest>
<manifest>は要素の2番目の要素で、EPUBで使用するすべてのリソースファイル(画像/XML/HTML/CSSなど)を記述する必要があります。1つでも漏れがあるとエラーになるので注意。
<item>
<item>要素は<manifest>の子要素となる。必須の属性は次の通り。
<item href="[required]" id="[required]" media-type="[required]"/>
HowToLearnHacking
│ mimetype
│
├─EPUB
│ │ chapter1.xhtml
│ │ .
│ │ .
│ │ .
│ │ nav.xhtml
│ │ package.opf
│ │ style.css
│ │
│ └─cover
│ cover.png
│ cover.xhtml
│
└─META-INF
container.xml
例えば上記のようなファイル構造に置いた場合下記のように記述する。
<?xml version="1.0" encoding="UTF-8" ?>
<package version="3.0" unique-identifier="uid" xmlns="http://www.idpf.org/2007/opf">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:identifier id="uid">urn:uuid:7e50346d-d5c2-405b-93aa-84f078c760a6</dc:identifier>
<dc:title></dc:title>
<dc:languag>ja</dc:languag>
<dc:creator></dc:creator>
<meta property="dcterms:modified"></meta>
</metadata>
<manifest>
<item href="cover/cover.jpg" id="cover-image" media-type="image/jpg"/>
<item href="cover/cover.xhtml" id="cover" media-type="application/xhtml+xml" properties="cover-image"/>
<item href="style.css" id="css" media-type="text/css"/>
<item href="nav.xhtml" id="nav" media-type="application/xhtml+xml"/>
<item href="chapter1.xhtml" media-type="application/xhtml+xml" id="chapter1"/>
...
</manifest>
<spine>
...
</spine>
</package>
hrefは相対パスで記述すれば問題ない。
idに関してはこの後解説する<spine>要素に<itemref idref="..."/>と記載してどのリソースを参照するのかをidref=""で紐づける必要がるので適当に設定する。指定はない。
media-typeに関しては3.2 Core media typesをみて作成したファイル等のメディアタイプをそのまま入れる。
<spine>
<spine>要素は各ページの順番を構成する役割がある。通常【表紙】→【目次】→【各章】といった構成なので次のように記載する。またidref=""の値は<item>で設定したidの値を記述する。
<?xml version="1.0" encoding="UTF-8" ?>
<package version="3.0" unique-identifier="uid" xmlns="http://www.idpf.org/2007/opf">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:identifier id="uid">urn:uuid:7e50346d-d5c2-405b-93aa-84f078c760a6</dc:identifier>
<dc:title></dc:title>
<dc:languag>ja</dc:languag>
<dc:creator></dc:creator>
<meta property="dcterms:modified"></meta>
</metadata>
<manifest>
<item href="cover/cover.jpg" id="cover-image" media-type="image/jpg"/>
<item href="cover/cover.xhtml" id="cover" media-type="application/xhtml+xml" properties="cover-image"/>
<item href="style.css" id="css" media-type="text/css"/>
<item href="nav.xhtml" id="nav" media-type="application/xhtml+xml" properties="nav"/>
<item href="chapter1.xhtml" media-type="application/xhtml+xml" id="chapter1"/>
...
</manifest>
<spine>
<itemref idref="cover"/>
<itemref idref="nav"/>
<itemref idref="chapter1"/>
...
</spine>
</package>