PythonのライブラリEbookLibでEPUBを作成してみる

2021.12.15

前回の記事ではEbookLibを使ってEPUBの読み込みを行いました。

今回は同じくEbookLibを使いEPUBを作っていきたいと思います。

※ EPUBのバージョンは3とします。

メタデータ

EPUBを作る上で最低限必要なメタデータがあります。

この3つ以外の要素は全て省略可能なカスタムメタデータとして扱います。

from ebooklib import epub
book = epub.EpubBook()

# metadata
book.set_identifier('sample123456')
book.set_title('Sample book')
book.set_language('ja')

# custom metadata
book.add_metadata('DC', 'description', 'EbookLibを使ったEPUBの作成を行うサンプル')
book.add_metadata(None, 'meta', '', {'name': 'schema:accessMode', 'content': 'textual'})
book.add_author('Alice')

pp.pprint(book.metadata)

opfファイルには

   <dc:identifier id="id">sample123456</dc:identifier>
   <dc:title>PythonのライブラリEbookLibでEPUBを作成してみる</dc:title>
   <dc:language>ja</dc:language>
   <dc:description>EbookLibを使ったEPUBの作成。
   PDFから読み込んだテキストデータを使ってEPUB化も試してみる。</dc:description>
   <dc:creator id="creator">Alice</dc:creator>
   <meta content="textual" name="schema:accessMode"></meta>

のように格納されます。

チャプター

本の内容を作成していきます。

ebooklib.epub.EpubHtml を用います。

file_nameとtitleを定義する必要があります。 titleは目次を生成するときに使用され、file_nameはEPUBのxhtmlファイル名になります。

ページを作る例

c1 = epub.EpubHtml(title='はじめに',
                   file_name='intro.xhtml',
                   lang='ja')
c1.set_content(u'<html><body><h1>はじめに</h1><p>はじめに</p></body></html>')

c2 = epub.EpubHtml(title='この本について',
                   file_name='about.xhtml')
c2.set_content('<h1>この本について</h1><p><img src="images/image_1.png"></p><p>This is a book.</p>')

はじめにというページと、この本についてというページを作成しました。 この後、これらのコンテンツを本に追加する必要があります。

# 本にコンテンツを追加
book.add_item(c1)
book.add_item(c2)

add_itemはあらゆる種類のアイテム(画像、css,video,htmlなど)を追加できます。

cssを追加する例

# cssを追加
style = 'body { font-size: 10px; font-family: Roboto, Arial, sans-serif;}'

nav_css = epub.EpubItem(uid="style_nav",
                        file_name="style/nav.css",
                        media_type="text/css",
                        content=style)
book.add_item(nav_css)

画像を追加する例

# 画像追加
import io
from PIL import Image

image_path = './image_1.png'
img1 = Image.open(image_path) 
b = io.BytesIO()
img1.save(b, 'png')
b_image1 = b.getvalue()

image = epub.EpubItem(uid="image_1",
                        file_name="images/image_1.png",
                        media_type="image/png",
                        content=image_path)
book.add_item(image)

Table of contents(目次)

目次は手動で作る必要があります。

ebooklib.epub.Linkを使って手動でリンクを定義するか、単にアイテムオブジェクトを内部に挿入するかのどちらかです。 手動で挿入する場合、章と異なるタイトルを目次に定義することができます。 アイテムオブジェクトを挿入した場合、そのアイテムを作成するときに定義したタイトルが使用されます。

ページファイルがどんな順番で並ぶのかの情報を記述するspine要素に追加することも可能です

# 目次の作成
# - add manual link
# - add section
# - add auto created links to chapters

book.toc = (epub.Link('intro.xhtml', '前書き', 'intro'), 
                 (epub.Section('第1章'), #セクションのタイトル
                 (c1, c2)) #サブチャプター
            )

## Spineを作成
book.spine = ['nav', c1, c2]

## ナビファイルの追加
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())

このようなコードを実行することで、以下のような見た目のEbookを作成できます

htmlファイルには、以下の内容で作成されます

nav

<nav id="id" role="doc-toc" epub:type="toc">
      <h2>PythonのライブラリEbookLibでEPUBを作成してみる</h2>
      <ol>
        <li>
          <a href="intro.xhtml">前書き</a>
        </li>
        <li>
          <span>第1章</span>
          <ol>
            <li>
              <a href="intro.xhtml">はじめに</a>
            </li>
            <li>
              <a href="about.xhtml">この本について</a>
            </li>
          </ol>
        </li>
      </ol>
</nav>

ncx

<navMap>
    <navPoint id="intro">
      <navLabel>
        <text>前書き</text>
      </navLabel>
      <content src="intro.xhtml"/>
    </navPoint>
    <navPoint id="sep_0">
      <navLabel>
        <text>第1章</text>
      </navLabel>
      <content src="intro.xhtml"/>
      <navPoint id="chapter_0">
        <navLabel>
          <text>はじめに</text>
        </navLabel>
        <content src="intro.xhtml"/>
      </navPoint>
      <navPoint id="chapter_1">
        <navLabel>
          <text>この本について</text>
        </navLabel>
        <content src="about.xhtml"/>
      </navPoint>
    </navPoint>
</navMap>

EPUBに書き出し

最後にepubファイルとして書き出します。

ebooklib.epub.write_epub

epub.write_epub('book.epub', book)

デフォルトのオプションを上書きすることもできます

※ デフォルトのオプション

{
  'epub2_guide': True, 
  'epub3_landmark': True, <img src="https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/12/088444f47809b4c7ab11fbdd25b9e91e.png" alt="" width="581" height="239" class="aligncenter size-full wp-image-815061" />
  'pages_title': 'Pages', 
  'play_order': {'start_from': 1, 'enabled': False}, 
  'spine_direction': True
}
epub.write_epub('book.epub', book, {"epub3_pages": False})

作成したEPUBをリーダーで開いてみます

このようにpythonで入力した内容が出力されていました。

EPUBの中身はこんな感じです。

追加した HTML、css,画像などが出力されています。