この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
前回の記事では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://d1tlzifd8jdoy4.cloudfront.net/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,画像などが出力されています。