Python - Ebooklib 读写 epub 电子书



一、关于 Ebooklib

Ebooklib 用于管理 EPUB2/EPUB3 文件。


二、读取 EPUB

import ebooklib
from ebooklib import epub

book = epub.read_epub('test.epub')

有一个ebooklib.epub.read_epub()函数 用于读取EPUB文件, EPUB文件全路径作为参数,返回ebooklib.epub.EpubBook类的实例。


1、元信息

ebooklib.epub.EpubBook.get_metadata() 方法用于获取元信息。

它接受2个参数:
第一个是命名空间的名称(DC表示Dublin Core,OPF表示自定义元信息)
第二个参数是键的名称。

它总是返回一个列表。如果没有为该键定义任何内容,列表将为空。


DC

对于EPUB3,来自Dublin Core集所需的最小元信息为:

  • DC:identifier
  • DC:title
  • DC:language

访问 Dublin Core 元信息时,使用DC命名空间。

>>> book.get_metadata('DC', 'title')
[('Ratio', {})]

>>> book.get_metadata('DC', 'creator')
[('Firstname Lastname ', {})]

>>> book.get_metadata('DC', 'identifier')
[('9781416566120', {'id': 'isbn_9781416566120'})]

Dublin Core集的可选择的元信息有:

  • DC:creator
  • DC:contributor
  • DC:publisher
  • DC:rights
  • DC:coverage
  • DC:date
  • DC:description

下面是 Dublin Core核心元信息在 content. opf 文件内部的定义方式。

<dc:language>en</dc:language>
<dc:identifier id="isbn_9781416566120">9781416566120</dc:identifier>

OPF 自定义元信息

您还可以有自定义元信息。
对于实例,这就是content. opf文件中定义 自定义元信息的方式。
您可以多次定义相同的键。

<meta content="my-cover-image" name="cover"/>
<meta content="cover-image" name="cover"/>

访问自定义元信息时,您将使用命名空间OPF
请注意,您现在将获得 不止一个结果。

>>> book.get_metadata('OPF', 'cover')
[(None, {'content': 'my-cover-image', 'name': 'cover'}),
 (None, {'content': 'cover-image', 'name': 'cover'})]

查看官方留档了解更多信息:


2、item

所有资源(样式表、图像、视频、声音、脚本和html文件)都是项目(items)。

images = book.get_items_of_type(ebooklib.ITEM_IMAGE)

get_items_of_type 根据类型获取

使用ebooklib.epub.EpubBook.get_items_of_type() 拉取数据项的类型。

以下是您可以使用的 当前项目类型列表:

  • ITEM_UNKNOWN
  • ITEM_IMAGE
  • ITEM_STYLE
  • ITEM_SCRIPT
  • ITEM_NAVIGATION
  • ITEM_VECTOR
  • ITEM_FONT
  • ITEM_VIDEO
  • ITEM_AUDIO
  • ITEM_DOCUMENT
  • ITEM_COVER
  • ITEM_SMIL

cover_image = book.get_item_with_id('cover-image')

get_item_with_id() 根据id 获取

使用ebooklib.epub.EpubBook.get_item_with_id() 通过 id(如果你知道)拉取数据项。

index = book.get_item_with_href('index.xhtml')

get_item_with_href

使用ebooklib.epub.EpubBook.get_item_with_href() 通过文件名拉取数据。

items = book.get_items_of_media_type('image/png')

使用ebooklib.epub.EpubBook.get_items_of_type() 通过媒体类型拉取数据。


get_items 返回所有
all_items = book.get_items()

使用 ebooklib.epub.EpubBook.get_items() 返回所有项目。
这是你最常用的 处理未知EPUB文件方法。


重要的是要记住!方法 get_item_with_idget_item_with_href 将返回项目对象。
方法 get_items_of_typeget_items_of_typeget_items 将返回迭代器(而不是列表)。

要从现有项目中获取内容(关于它是图像、样式表还是html文件),您可以使用 ebooklib.epub.EpubItem.get_content()

对于超文本标记语言项,您也使用 ebooklib.epub.EpubHtml.get_body_content()

有什么区别?get_content 总是 返回文件的全部内容,而 get_body_content 只返回超文本标记语言文档的<body>部分中的任何内容。

for item in book.get_items():
    if item.get_type() == ebooklib.ITEM_DOCUMENT:
        print('==================================')
        print('NAME : ', item.get_name())
        print('----------------------------------')
        print(item.get_content())
        print('==================================')

三、创建EPUB

from ebooklib import epub

book = epub.EpubBook()

EPUB有一些 您需要满足的 最小元信息要求。

您需要定义唯一标识符、书名 当谈到语言代码时,推荐的最佳实践是使用受控词表,如RFC 4646 -http://www.ietf.org/rfc/rfc4646.txt

book.set_identifier('sample123456')
book.set_title('Sample book')
book.set_language('en')

book.add_author('Aleksandar Erkalovic')

您还可以添加自定义元信息。

第一个来自Dublin Core命名空间,第二个纯粹是自定义的。

book.add_metadata('DC', 'description', 'This is description for my book')
book.add_metadata(None, 'meta', '', {'name': 'key', 'content': 'value'})

这就是我们的自定义元信息,在 content.opf 文件中的效果。

<dc:description>This is description for my book</dc:description>
<meta content="value" name="key"></meta>

章节由ebooklib.epub.EpubHtml

章节用ebooklib.epub.EpubHtml表示。
您必须定义文件名和标题。在我们的例子中,标题将在生成目录时使用。

定义内容时,您可以将其定义为有效的HTML文件,或您作为内容的HTML元素的一部分。
它将忽略您在<head> 元素中的任何内容。

# intro chapter
c1 = epub.EpubHtml(title='Introduction',
                   file_name='intro.xhtml',
                   lang='en')
c1.set_content(u'<html><body><h1>Introduction</h1><p>Introduction paragraph.</p></body></html>')

# about chapter
c2 = epub.EpubHtml(title='About this book',
                   file_name='about.xhtml')
c2.set_content('<h1>About this book</h1><p>This is a book.</p>')

做一些基本的调试,看看什么样的内容最终会出现在书中。

在这种情况下,我们插入了章节的标题和语言定义。

如果我们将样式表文件附加到本章,它还将添加指向样式表文件的链接。

>>> print(c1.get_content())
b'<?xml version=\'1.0\' encoding=\'utf-8\'?>\n<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:epub="http://www.idpf.org/2007/ops" epub:prefix="z3998: http://www.daisy.org/z3998/2012/vocab/structure/#"
lang="en" xml:lang="en">\n  <head>\n    <title>Introduction</title>\n  </head>\n  <body>\n    <h1>Introduction</h1>\n
<p>Introduction paragraph.</p>\n  </body>\n</html>\n'

任何类型的项目(样式表、图像、HTML 文件)都必须添加到书中。

book.add_item(c1)
book.add_item(c2)

您可以将任何类型的文件添加到书中。

对于实例,在这种情况下,我们添加样式表文件。

我们为它定义文件名、唯一ID、media_type和内容。

就像您需要将其添加到书中的章节文件一样。样式表文件也可以添加到章节中。
在这种情况下,链接将自动添加到 HTML 章节中。

style = 'body { font-family: Times, Times New Roman, serif; }'

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

必须手动定义目录。ToC是元素的元组/列表。

您可以使用 ebooklib.epub.Link 手动定义链接,或只是插入项目对象。

当你手动插入时,你可以定义 ToC中 不同的的标题,而不是章节中的标题。

如果您只是插入item对象,它将使用您创建该项目时 定义的任何标题 。

节只是有两个值的元组。

第一个是节的标题,第二个是带有子章节的元组/列表。

book.toc = (epub.Link('intro.xhtml', 'Introduction', 'intro'),
              (
                epub.Section('Languages'),
                (c1, c2)
              )
            )

所以作为书脊(Spine)。您可以为项目使用唯一的ID,或者只是将它的实例添加到书脊中。

book.spine = ['nav', c1, c2]

最后,我们需要添加NCX和导航链接(Navigation tile)。它们不会自动添加。

book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())

最后写下你的书。你需要指定书的完整路径,你不能把它写到文件对象或其他东西。

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

它还接受一些选项。

选项默认值
epub2_guideTrue
epub3_landmarkTrue
epub3_pagesTrue
landmark_title“Guide”
pages_title“Pages”
spine_directionTrue
package_directionFalse
play_order{‘enabled’: False, ‘start_from’: 1}

覆盖默认选项时的示例:

epub.write_epub('test.epub', book, {"epub3_pages": False})

2024-06-06(四)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐园

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值