TL;DR
O'Reilly Japan の EPUB を Send to Kindle に送ろうとしたが、何度やっても失敗した。
epubcheck をかけると OPF-096 が出ていたので、OPF の spine にある linear="no" を修正した。これで epubcheck はクリーンになった。
ただし、それでも Send to Kindle は通らなかった。
最終的に通ったのは、Calibre で
EPUB → MOBI → EPUB
とラウンドトリップ変換したファイルだった。
Amazon 側の変換器が具体的に何を嫌っていたのかは分からない。
環境
- macOS / Homebrew
- 対象: O'Reilly Japan の EPUB 3.0
- 『ゼロから作るDeep Learning』
- 使用ツール
epubcheck- Calibre の
ebook-convert
起きたこと
O'Reilly Japan からダウンロードした EPUB を Send to Kindle にアップロードしても、処理が完了せず、Kindle ライブラリに反映されなかった。
最初はファイル名、ファイルサイズ、DRM あたりを疑った。
file oreilly-XXXX.epub
ls -la oreilly-XXXX.epub
unzip -l oreilly-XXXX.epub | grep -iE "encryption|rights|drm"
結果は以下。
- EPUB ファイルとして認識されている
- サイズは約 10MB で、Send to Kindle の上限内
- DRM っぽいファイルも見当たらない
epubcheck で確認する
次に epubcheck を入れて検証した。
brew install epubcheck
epubcheck oreilly-XXXX.epub
すると、次のエラーが出た。
Validating using EPUB version 3.3 rules.
ERROR(OPF-096): .../OEBPS/deep-learning-from-scratch.opf(22,98):
Non-linear content must be reachable, but found no hyperlink to "OEBPS/index.xhtml".
Check finished with errors
Messages: 0 fatals / 1 error / 0 warnings / 0 infos
OPF の spine に、次のような記述があった。
<itemref idref="deep-learning-from-scratch" linear="no"/>
linear="no" は非リニアコンテンツ扱いになる。
EPUB 3.3 の検証では、非リニアコンテンツも本文側からリンクで到達可能である必要があるらしい。
今回のファイルでは、その到達経路がないため OPF-096 になっていた。
OPF を直して再パッキングする
いったん EPUB を展開する。
mkdir -p /tmp/epub-fix/extracted
cd /tmp/epub-fix/extracted
unzip -q /path/to/oreilly-XXXX.epub
OPF を編集する。
- <itemref idref="deep-learning-from-scratch" linear="no"/>
+ <itemref idref="deep-learning-from-scratch"/>
その後、EPUB として再パッキングする。
EPUB では mimetype を先頭に、かつ無圧縮で置く必要がある。
zip -X0 /tmp/epub-fix/fixed.epub mimetype
zip -Xr9D /tmp/epub-fix/fixed.epub META-INF OEBPS
再度 epubcheck を実行する。
epubcheck /tmp/epub-fix/fixed.epub
結果はクリーンになった。
No errors or warnings detected.
0 fatals / 0 errors / 0 warnings / 0 infos
これで通るかと思ったが、Send to Kindle ではまだ失敗した。
Calibre でラウンドトリップ変換する
次に Calibre の ebook-convert を試した。
brew install --cask calibre
まず EPUB から MOBI に変換する。
ebook-convert fixed.epub intermediate.mobi --language=ja
その後、MOBI から EPUB に戻す。
ebook-convert intermediate.mobi roundtrip.epub --language=ja
この roundtrip.epub を Send to Kindle に送ったところ、ようやく通った。
ただし、このファイルを epubcheck にかけると、大量の RSC-005 が出る。
たとえば、
-
<img>のalt欠落 -
valignなどの古い HTML 属性 - EPUB としては厳密でない HTML
といった類のエラーが出る。
何が効いたのか
正確な原因は分からない。
ただ、MOBI を経由すると Calibre が内部的に構造を作り直すため、元の EPUB 3 固有の構造がかなりならされる。
たとえば、以下のような要素が影響していた可能性はある。
- SVG titlepage
-
spine周りの指定 - CSS
- EPUB 3 系の構造
- Amazon 側の変換器との相性
ただし、どれが決定打だったかまでは切り分けていない。
分かったこと
epubcheck は EPUB としての妥当性を見るには有用だが、Send to Kindle の通過可否を保証するものではない。
Amazon 側の変換器は独自にチェックや変換をしているはずで、その詳細な失敗理由は外からは見えない。
そのため、epubcheck のエラーを全部潰しても、Kindle 側で弾かれることはある。