PythonのライブラリEbookLibでEPUBを作成してみる
前回の記事では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ファイルとして書き出します。
epub.write_epub('book.epub', book)
デフォルトのオプションを上書きすることもできます
※ デフォルトのオプション
{ 'epub2_guide': True, 'epub3_landmark': True, <img src="https://dev.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,画像などが出力されています。