Python – Ebooklib 读写 epub 电子书

文章目录

  • 一、关于 Ebooklib
  • 二、读取 EPUB
  • 1、元信息
  • 2、item
  • 三、创建EPUB


  • 一、关于 Ebooklib

    Ebooklib 用于管理 EPUB2/EPUB3 文件。

  • github : https://github.com/aerkalov/ebooklib/
  • 教程:http://docs.sourcefabric.org/projects/ebooklib/en/latest/tutorial.html
  • 示例:https://github.com/aerkalov/ebooklib/tree/master/samples

  • 二、读取 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表示自定义元信息)。第二个参数是键的名称。

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


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

  • DC:标识符
  • DC:标题
  • DC:语言

  • 访问 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:创建者
  • DC:贡献者
  • DC:出版商
  • DC:权利
  • DC:coverage
  • DC:日期
  • DC:描述

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

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

    您还可以有自定义元信息。
    对于实例,这就是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'})]
    

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

  • http://www.idpf.org/epub/30/spec/epub30-publications.html#sec-opf-dcmes-optional
  • http://www.idpf.org/epub/30/spec/epub30-publications.html
  • http://dublincore.org/documents/dces/

  • 2、item

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

    images = book.get_items_of_type(ebooklib.ITEM_IMAGE)
    

    使用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')
    

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

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

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

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

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

    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_guide True
    epub3_landmark True
    epub3_pages True
    landmark_title “Guide”
    pages_title “Pages”
    spine_direction True
    package_direction False
    play_order {‘enabled’: False, ‘start_from’: 1}

    覆盖默认选项时的示例:

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

    2024-06-06(四)

    作者:AI工程化

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python – Ebooklib 读写 epub 电子书

    发表回复