TOOLPIPO LAB EPUB

EPUBの画像・目次・章順がおかしいとき、どこを確認する?

電子書籍の画像が出ない。目次を押しても目的の場所へ飛べない。章の順番がおかしい。そんなとき、EPUBの中では何が食い違っているのでしょうか。

ファイル不足とfragment不足は異なる

結論

画像の指定、目次のリンク先、本文の順序指定は別の参照です。自作EPUBでそれぞれを変え、症状に対応する確認箇所を調べました。

検証概要

検証日
検証条件
自作ファイル・条件・実測結果は本文に掲載

症状によって、確認する場所が違う

画像なら画像の指定、目次ならリンク先、章順なら本文の順番指定を確認します。

EPUBは、本文や画像、目次などのファイルを1つにまとめた電子書籍の形式です。「この画像を使う」「この章へ飛ぶ」「この順番で読む」という指定も、中に入っています。

不具合ごとに、調べる場所を分ける
困っていることまず確認したいこと
画像が出ない指定された画像が入っているか。名前や保存場所が合っているか。
目次から飛べないリンク先の章があるか。その章の中に、移動先の目印があるか。
章の順番が違う本文を読む順番の指定が合っているか。目次の並びとは別。
本の構成を読み込めない本の組み立て方を書いた設定ファイルを、正しい場所から読み込めるか。

今回は、この指定をわざと変えた自作EPUBを調べました。読書アプリで表示を比較した実験ではなく、ファイルの中にある食い違いを確かめた結果です。

3章の短い電子書籍で試した

第1章・第2章・第3章の本文と、3章へ移動する目次、画像1枚を用意しました。この基準ファイルから、画像を消す、目次の行き先を変える、章の順番を変えるなど、10条件を作りました。

基準のEPUBでは、指定されたファイルや目次の行き先に不足は見つかりませんでした。以下は、そこから一部を変えた例です。

画像がない場合と、画像の名前が違う場合

まず、画像だけを削除しました。本文には「この画像を表示する」という指定が残っていますが、指定された画像はありません。検査でも、画像の不足を見つけられました。

別の例では、画像を残し、設定に書かれた名前だけを変えました。images/cover.pngという画像に対して、Images/Cover.pngを指定しています。

違うのは大文字と小文字だけですが、EPUBの中では同じ名前として扱えません。検査では「似た名前のファイルがある」という候補になりました。

つまり、画像を入れ直す前に、指定された名前と保存場所も確認する必要があります。

目次の行き先は「章」と「章の中の目印」

目次は、単に章の名前を並べたものではありません。押したときに移動する場所も指定しています。

今回の第2章リンクはchapter2.xhtml#section2です。前半のchapter2.xhtmlが章のファイル、後半の#section2が章の中の目印です。この目印をIDと呼びます。

章のファイル名を存在しない名前へ変えると、「行き先のファイルがない」と検出されました。一方、章は残して目印だけをsection99へ変えると、「ファイルはあるが、その目印がない」という別の結果になりました。

ファイル不足とfragment不足は異なる
目次リンクの前半は章のファイル、#以降は章の中の目印。どちらが欠けているかで、直す場所が違います。

目次が正しい順番でも、本文の順番は違うことがある

目次の第1章→第2章→第3章はそのままにして、本文を読む順番だけを第1章→第3章→第2章へ変えました。

3章ともファイルはそろっています。そのため、検査でリンク切れは見つかりませんでした。それでも、指定された本文の順番は変わっています。

この順番指定をspineと呼びます。図のc1・c2・c3は、それぞれ第1章・第2章・第3章を指す名前です。

ZIP順と目次は同じでもspineを変えると既定の本文順序が変わる
目次と本文順序は別の指定です。この図は設定の比較であり、読書アプリでページをめくった結果ではありません。

「リンク切れがない」は「意図した章順になっている」という意味ではありません。章順がおかしいときは、目次だけでなく本文の順番指定を見ます。

設定ファイルがあっても、違う場所を探すと読めない

EPUBには、使う本文や画像、読む順番をまとめた設定ファイルがあります。OPFと呼ばれるファイルです。

今回はそのファイルを残し、読み込む場所の指定だけを変えました。本当のファイルはEPUB/package.opfですが、存在しないEPUB/missing.opfを探すようにしています。

検査はそこで止まり、本の構成を読み取れませんでした。本文や画像が消えたのではなく、それらを案内する設定までたどれない状態です。

自分のEPUBは、まずファイルの食い違いを調べる

EPUB構造・リンク整合性チェッカーにEPUBを1件選ぶと、不足したファイルや目次の行き先、本文の順番指定をブラウザ内で調べられます。まず、困っている症状に関係する結果を見てください。

この検査は仕様全体の適合性確認ではなく、ファイルの食い違いを探すためのものです。問題が見つからなくても、読書アプリがその本に対応していないなど、別の理由で開けないことはあります。

設定ファイルの名前と、10条件の詳しい検証結果

使うファイル・本文順序・目次の3つを分ける

manifestは、使う本文・画像・CSS(見た目の指定)を登録する一覧です。spineは本文を読む順番、navはEPUB 3の目次などを持つ文書です。

manifestは使用素材、spineは本文順序、navは目次リンク
同じEPUBの中でも、使うファイルの一覧、本文の順番、目次の行き先は別々に指定します。

container.xmlがOPFの場所を示し、OPFにmanifestとspineが書かれています。manifestはZIPの全ファイル一覧ではなく、表示に使うファイルの一覧です。

containerからOPFへ、manifestとspineを通じて本文を参照
設定ファイルをたどって、本文や画像を見つける仕組み。container.xmlの案内が違うと、OPFまでたどれません。

自作の合成EPUB(synthetic fixture)だけを使いました。基準のZIP内は9ファイル、manifestは6件、spineは3件、目次リンクは3件です。画像は8×8ピクセルの自作PNGで、実在の本やユーザーファイルは使っていません。

10条件の実ファイル測定(EPUBCheck・リーダー試験とは別)
条件変えた箇所読み直した結果
正常なEPUB 3基準ファイル。変更なし。検査した参照に問題なし
OPFの参照先がないcontainer.xmlのfull-pathだけをEPUB/missing.opfへ変更。実際のpackage.opfは残す。containerの参照先不足 1件。OPFへ到達できず、Tool解析はここで停止
画像ファイルがないmanifestと本文の参照は残し、EPUB/images/cover.pngだけを削除。manifestの不足 1件+本文の画像参照不足 1件(同じPNG)
本文順序のIDがないspineのc2をmissing-chapterへ変更。章ファイルは残す。spineのID参照不足 1件
本文順序だけ1→3→2spineのみc1,c3,c2へ変更。navは1,2,3のまま。spineは c1 → c3 → c2。参照不足・リンク切れは0件
目次のファイルがないnavの第2章リンクだけmissing-chapter.xhtml#section2へ変更。内部リンク先のファイル不足 1件
章はあるが行き先のIDがないnavの第2章リンクだけchapter2.xhtml#section99へ変更。ファイル不足0件、fragment不足 1件
画像パスの大文字小文字が違うmanifestの画像hrefだけImages/Cover.pngへ変更。実ファイルと本文srcはimages/cover.pngのまま。完全一致なし、case mismatch候補 1件
mimetypeを圧縮mimetypeは先頭・内容は正しいまま、ZIPの圧縮方法をDEFLATEへ変更。mimetypeの圧縮方法 8(DEFLATE)。確認候補 1件
EPUB 2・NCXの比較OPF 2.0・NCX目次・XHTML 1.1で構成。EPUB 3のnavは含めない。NCX 1件。navなしをEPUB 3の不足と誤判定しなかった

画像の「不足1件+1件」は、同じ画像を一覧と本文からそれぞれ指定しているためです。画像が2枚消えたという意味ではありません。OPFへたどれない例の解析件数0も、本文が空になったという意味ではありません。

まとめ方の決まりと、古いEPUBの違いも確認した

EPUBをZIPとしてまとめるときにも決まりがあります。形式を識別するmimetypeファイルは先頭に置き、圧縮せず、内容をapplication/epub+zipにします。今回はそのファイルだけを圧縮しました。基準の圧縮方法は0(非圧縮)、変更後は8(DEFLATE)でした。

古いEPUB 2の目次には、navではなくNCXという形式が使われます。比較用のEPUB 2では、NCXから3章へ移動する指定を確認でき、目次不足の検出は0件でした。EPUB 3と同じ目次ファイルがないだけでは、不足とは判断できません。

10条件を試せる合成EPUBのZIP

検証用EPUB 10件と測定結果をダウンロード

ZIPを展開し、1つの.epubを選んでください。どこを変えたかはREADME.txtに記載しています。故意に壊したファイルも含むため、読書用の本ではありません。

構成数・サイズ・SHA-256と測定方法

生成後のZIPからファイル数・格納順・圧縮方法を読み直し、XMLの記載とToolPipoの解析を照合しました。下の「OPFに記載」は、入口が壊れた例でも残っているOPFを直接読んだ数です。

配布したEPUBの構成数(フォルダentryなし)
条件ZIP内のファイルOPFに記載:素材/本文順序目次のリンクXHTML/PNG
正常なEPUB 396/334/1
OPFの参照先がない96/334/1
画像ファイルがない86/334/0
本文順序のIDがない96/334/1
本文順序だけ1→3→296/334/1
目次のファイルがない96/334/1
章はあるが行き先のIDがない96/334/1
画像パスの大文字小文字が違う96/334/1
mimetypeを圧縮96/334/1
EPUB 2・NCXの比較96/333/1

配布ZIP:28,608バイト。SHA-256:8a37882f55219f34e0ef8889aece380f169abb0cf9f328b5a6fed101dec99380。

各EPUBの実サイズとSHA-256
EPUBファイルバイト数SHA-256
01-valid-epub3.epub3017b6ea5475cdd30e0a5125b736c0065db476e1caf00eb0573079be7abb2828418e
02-rootfile-missing.epub3019159b9838854cbcc1c88bc23f1c602af3f17c2dcb6b0d955f402983b537dae7f8
03-manifest-missing.epub28306f6bf62c1dfc243eb4778b5dbebc09e464cec31227c20db973929c759740a39c
04-spine-idref.epub30256878e21a62c7f9f30514cb10b7c0246ab5991240ef135aa59acf438f4abd109b
05-spine-reordered.epub3017cd70a697cd60e432e556619bc66849f68bdfc3a430c1beb146f9b50b299664c0
06-nav-file-missing.epub302458f6d25b3fa54e327d18d45c63bd8be9e51052e63e92d56a8e2980719972d97e
07-fragment-missing.epub301820db83c53ca2d2f219d9de5666ec3893ad4190fc713a0edf8e31f7ebf8626068
08-case-mismatch.epub3021d3eb23e06dac326ae8b14149042af09daeaebb9af0b7f1ef53d3341669cd0de7
09-mimetype-compressed.epub30192b6f9113098cfcb95d220ae253ca3ffba0fdd2d46662370c90b68bd62c892d8b
10-valid-epub2.epub3160afafb7c3d651a87234e6229890faf9010a1a2e2e4d2cb4069b82c744d982bee8

ZIP格納順・圧縮方法・参照先・測定結果(JSON)

検証範囲と一次資料

検証日:2026年9月30日。合成ファイルの構造・参照を測定しました。Javaが利用できず、EPUBCheckは未実行です。診断コード・ERROR・WARNING・USAGEの件数、終了コードは測定していません。リーダー間の表示比較、DRM付きEPUB、大型・複雑な本も対象外です。

仕様の公開状況も確認しました。EPUB 3.3はW3C Recommendation(2026年1月13日)、EPUB 3.4はCandidate Recommendation Draft(2026年8月3日)です。3.4は確定したRecommendationではありません。

EPUBCheck公式リポジトリでは5.4.0を最新のproduction-ready版と案内しています。今回の参照検査に問題がない例も、EPUBCheck合格・仕様全体への適合とは表現していません。

制作方針はコンテンツ制作・計算検証方針をご覧ください。

自分のファイルで確認する

自分のファイルで確認する

関連する検証