EPUB3作成webサービス

テキストファイルと表紙画像ファイルをアップロードするだけでEPUB3を作成するページを作った。
ので、例によって忘れないうちにメモ
(ちなみに。作成したEPUB3、縦書き表示のスクリーンショット → kindle KDPの縦書き表示)
EPUB3といっても、ファイルのほとんどはxhtmlとcssなので、HTMLをエディタで直に書ける程度のスキルがあればそれでOK。書誌情報の設定ファイルなどもXMLのようなもので、ひな形ひとつあれば、どこにどんな情報を入れるのか見当がつくので上書きすればOK。最後にそれらを所定のディレクトリにおさめて、zipで梱包するだけ。
以上、エディタとzipするためのアプリがひとつあれば手作業でできる。
上記のことをperl を使って、サイトにCGIを組み込んでみた。といっても難しいことはなく手順どおりにやるだけだった。
EPUB3ファイルのディレクトリ構成やファイルのひな形には、FUSEeというフリーウエアが出力する .epub ファイルを参考にした。
ファイル、ディレクトリ構成
mimetype
META-INF/container.xml
OEBPS/content.opf
OEBPS/text/nav.xhtml
OEBPS/text/cover.xhtml
OEBPS/text/contents001.xhtml
OEBPS/images/cover_hyo1.jpg
OEBPS/images/hyo1.jpg
OEBPS/style/default.css
OEBPS/style/nav.css
上記で必須なのが META-INF/container.xml
<?xml version="1.0" encoding="utf-8"?>
<container xmlns="urn:oasis:names:tc:opendocument:xmlns:container" version="1.0">
<rootfiles>
<rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml" />
</rootfiles>
</container>
ここで指定されている OEBPS/content.opf が基本設定ファイルとなってる
content.opf
これに実体ファイルのありかやID名など、いろいろなお約束が書かれている。大事なファイル。
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookID" version="3.0" xml:lang="ja">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:identifier id="BookID">urn:uuid:net.doncha.books.0.00000001</dc:identifier>
<meta refines="#BookID" property="identifier-type">uuid</meta>
<dc:title id="title0">タイトル</dc:title>
<dc:creator id="creator0">著者</dc:creator>
<dc:language id="language0">ja</dc:language>
<meta name="cover" content="images.cover.hyo1.jpg" />
<meta name="epub.doncha.net" content="1.0" />
<meta property="dcterms:modified">2012-10-05T09:00:00Z</meta>
</metadata>
<manifest>
<item id="nav" href="text/nav.xhtml" media-type="application/xhtml+xml" properties="nav" />
<item id="text.cover.xhtml" href="text/cover.xhtml" media-type="application/xhtml+xml" />
<item id="text.contents001.xhtml" href="text/contents001.xhtml" media-type="application/xhtml+xml" />
<item id="text.contents002.xhtml" href="text/contents002.xhtml" media-type="application/xhtml+xml" />
<item id="images.hyo1.jpg" href="images/hyo1.jpg" media-type="image/jpeg" />
<item id="images.cover.hyo1.jpg" href="images/cover_hyo1.jpg" media-type="image/png" properties="cover-image" />
<item id="style.nav.css" href="style/nav.css" media-type="text/css" />
<item id="style.default.css" href="style/default.css" media-type="text/css" />
</manifest>
<spine page-progression-direction="rtl">
<itemref idref="text.cover.xhtml" linear="no" />
<itemref idref="text.contents001.xhtml" linear="yes" />
<itemref idref="text.contents002.xhtml" linear="yes" />
</spine>
<guide>
<reference type="cover" title="Cover Page" href="text/cover.xhtml" />
</guide>
</package>
・実体ファイルとそれに対するIDの組み合わせの羅列、のようなもので、これが基準となるファイル。
・identifierのBookIDは一意の文字列。なので、URLとDBに登録した連番と組み合わせて作った。
([10/11 17:55:46] 訂正。連番ではなく、IPアドレスとperlのtimeを組み合わせた物に変更した)
大雑把に。実体ファイルに ID をつけて、ID名で指定していく。IDと実体ファイルは1対1。複数IDに同じファイルを指定するとValidatorにひっかかる。
・metadata で本の定義。
・manifest で使うすべてのファイルのidなどを定義。
・spine は読む順番に上から下へ並べる。linear=yes が順番に組み込む linear=noは順番には出ない(カバーなど)
・guide はどうやらEPUB2までの下位互換、らしい。
OEBPS/text/contents001.xhtml
本文ファイル(名前は content.opf に指定。特に決まった命名規則はない)
ビューワーによって一度に読み込めるファイルサイズの上限がある、という話なので、わたしのスクリプトでは「章立て」ごとにファイルを分割した。contents001.xhtml contents002.xhtml contents003.xhtmlなどなど。
OEBPS/text/nav.xhtml
目次ファイル。本文ファイルの見出し h タグにidをふってあるので、それを ol タグでリストにしたhtmlファイル。本文ファイルと整合性チェックが入るのできちんと合わせる必要がある。
[11/16 12:24:12] 追記。kindleで目次を設定するには
OEBPS/toc.ncx というファイルが必要。guideにtype tocを指定して、spineにhtml版目次を指定する必要がある。
[12/19 14:56:52] 追記。kindleの目次について整理した → http://t2aki.doncha.net/?id=1355879465
OEBPS/text/cover.xhtml
表紙ファイル。img タグで表紙画像を指定しているだけのhtmlファイル。content.opf のspineの項目 coverの linearをno にすることで、本を開いたときに表紙を表示しないようにしてある。
OEBPS/style/
OEBPS/images/
の2つのディレクトリには各々スタイルシートと画像ファイルが入っているだけ。スタイルシートは http://www.epubcafe.jp/egls/kusamakura で公開してくれている basic_vertical.css を基本にして使わせてもらった(ありがとうございます)
HTMLにタグづけしてスタイルシートを頑張れば、凝ったレイアウト・デザインも可能。とりあえず今回は h タグと p タグをつけ足しただけの単純な本文HTMLファイル。
mimetype は application/epub+zip と一行、ファイルタイプが書かれたファイル
以上のファイルを揃えてzipで梱包すれば EPUB3 ファイルのできあがり。
・mimetype はzipファイルの中で先頭に置く必要がある。
・mimetype は圧縮してはいけない。
この2点だけ注意。
perl の Archive::Zip
my $zip = Archive::Zip->new();
my $none = $zip->addFile(’mimetype’); 返り値 $none
$none->desiredCompressionMethod( COMPRESSION_STORED ); $noneは圧縮しない
これで mimetype を圧縮せずにまず先頭に置いて、あとは適当な順番で addFile する。
ウチのようなテキトーなサイトではなくて、EPUB3の仕様などは以下のサイトを参照にしましょう。
http://blog.imagedrive.jp/epub3
と、作ってみた感想。
普通にHTML書けばそれでイケる。ので、作って公開したのはいいけど、他のパッケージソフトや、フリーウエアで使い勝手の良いものを見つけて、凝ったレイアウトデザインを目指したほうがいいような気がする。
とりあえず、ウチの場合、テキストファイルと画像ファイルだけ流し込めばそれっぽく電子書籍にはなるので、電子書籍って、EPUBってこんな感じなのか、という程度の使い方でよろしくお願いします。
ちなみに、実際に
↑このページに本文テキストと表紙用画像を流し込んで作ったEPUB3で、amazon、kindleストアに並べて販売中!
[2013/02/04 14:21:35] 追記。
EPUB3をkindleのKDP登録に使う場合、少しクセがある。そのあたり、検索されているようなので、この雑記帖に散らかしてある縦書きやkindleの目次についてなどへのリンクをまとめてみた。
| << | 2026/1 | >> | ||||
|---|---|---|---|---|---|---|
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
【最近の20件】
- 20260129 ブログをレスポンシブ対応にリニューアル
- 20260126 ブログのふり返り
- 20260121 小ネタ:ed25519秘密鍵公開鍵とJson serialized canonical
- 20260120 ActivityPubは自作実装しよう!
- 20260117 RFC9421版HTTP Signatureに対応
- 20260111 HTTP Signatureの署名対象文字列
- 20260109 web本棚のActivityPub対応
- 20260106 web本棚のソースコード公開
- 20260104 web本棚
- 20260101 謹賀新年2026
- 20251231 2025年ふりかえり
- 20251213 perlと30年
- 20251210 ActivityPubの投稿削除
- 20251101 日常雑感
- 20251026 テキトーフェッチメール
- 20251014 ActivityPubサーバーで投稿の編集
- 20251008 元WINDOWS10のノパソにlinux mint
- 20251002 GBLシーズン「変わりゆく物語」でACE到達
- 20250925 ブログのアクセス制限
- 20250922 ActivityPubサーバーに引用を実装


