跳到主要内容

EPUB 格式(开放电子书)

EPUB(Electronic Publication,电子出版物)格式由国际数字出版论坛(IDPF)于 2007 年制定,现由 W3C 维护(EPUB 3.0+)。基于开放标准(XHTML、CSS、ZIP),采用容器化结构打包多个 HTML 文件和资源,支持自适应布局、数学公式和多媒体内容,是数字出版和电子书阅读器的通用开放格式。

格式简介

EPUB 是一种开放的电子书标准格式,设计用于在不同设备和阅读器上提供一致的阅读体验。EPUB 格式基于 Web 标准(HTML、CSS、XML),使得电子书可以像网页一样灵活排版和显示。

EPUB 文件扩展名为 .epub,MIME 类型为 application/epub+zip。EPUB 格式是开放标准,不受单一厂商控制,被广泛用于数字出版。

技术特点

核心特性

  • 开放标准:基于 W3C 和 IDPF 标准,完全开放
  • Web 技术:使用 HTML、CSS、JavaScript
  • 自适应布局:支持响应式设计,适应不同屏幕
  • 可访问性:支持屏幕阅读器和辅助技术
  • 多媒体支持:支持音频、视频、交互内容

EPUB 版本

  • EPUB 2.0:2007 年发布,基于 XHTML 1.1
  • EPUB 3.0:2011 年发布,增强功能(HTML5、CSS3、JavaScript)
  • EPUB 3.1:2017 年发布,进一步改进
  • EPUB 3.2:2019 年发布,当前最新版本

内容格式

  • XHTML/HTML5:文档内容
  • CSS:样式和布局
  • SVG:矢量图形
  • JavaScript:交互功能(EPUB 3.0+)
  • MathML:数学公式(EPUB 3.0+)

文件结构

EPUB 文件实际上是一个 ZIP 压缩包,包含以下结构:

book.epub (ZIP 文件)
├── mimetype # MIME 类型声明(未压缩)
├── META-INF/
│ └── container.xml # 容器文件,指向 OPF
├── OEBPS/ # 内容目录(可自定义名称)
│ ├── content.opf # 包文档(清单、元数据、导航)
│ ├── toc.ncx # 导航控制文件(EPUB 2.0)
│ ├── nav.xhtml # 导航文档(EPUB 3.0)
│ ├── chapter1.xhtml # 章节内容
│ ├── chapter2.xhtml
│ ├── styles.css # 样式文件
│ └── images/ # 图片资源
│ └── cover.jpg
└── [其他资源文件]

关键文件

  • mimetype:必须包含 application/epub+zip,且必须未压缩
  • container.xml:指向 OPF 文件的位置
  • content.opf:包文档,包含清单、元数据和导航信息
  • toc.ncx:EPUB 2.0 的导航文件
  • nav.xhtml:EPUB 3.0 的导航文件

使用场景

适用场景

  • 数字出版:电子书、电子杂志、技术文档
  • 教育内容:教材、课程材料
  • 企业文档:手册、报告、培训材料
  • 个人出版:自出版电子书

优缺点

优点:

  • 开放标准,不受厂商控制
  • 基于 Web 技术,易于创建和编辑
  • 支持丰富的格式和交互
  • 自适应布局,适应不同设备
  • 文件体积相对较小

缺点:

  • 某些阅读器支持有限
  • 复杂布局可能在不同设备上显示不一致
  • 需要一定的技术知识来创建

代码示例

Python 读取 EPUB

import zipfile
from xml.etree import ElementTree as ET

# EPUB 文件是 ZIP 压缩包
with zipfile.ZipFile('book.epub', 'r') as zip_file:
# 读取容器文件
container_xml = zip_file.read('META-INF/container.xml')
root = ET.fromstring(container_xml)

# 获取 OPF 文件路径
opf_path = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:container}rootfile').get('full-path')

# 读取 OPF 文件
opf_content = zip_file.read(opf_path)
opf_root = ET.fromstring(opf_content)

# 提取元数据
metadata = opf_root.find('.//{http://www.idpf.org/2007/opf}metadata')
title = metadata.find('.//{http://purl.org/dc/elements/1.1/}title').text
print(f"书名: {title}")

Python 使用 ebooklib

import ebooklib
from ebooklib import epub

# 读取 EPUB
book = epub.read_epub('book.epub')

# 获取元数据
print(f"标题: {book.get_metadata('DC', 'title')[0][0]}")
print(f"作者: {book.get_metadata('DC', 'creator')[0][0]}")

# 读取章节
for item in book.get_items():
if item.get_type() == ebooklib.ITEM_DOCUMENT:
content = item.get_content().decode('utf-8')
print(content[:200]) # 打印前 200 个字符

Python 创建 EPUB

import ebooklib
from ebooklib import epub

# 创建 EPUB 书籍
book = epub.EpubBook()

# 设置元数据
book.set_identifier('id123456')
book.set_title('示例电子书')
book.set_language('zh-CN')
book.add_author('作者姓名')

# 添加章节
chapter1 = epub.EpubHtml(title='第一章', file_name='chap01.xhtml', lang='zh-CN')
chapter1.content = '<h1>第一章</h1><p>这是第一章的内容。</p>'
book.add_item(chapter1)

# 添加默认 NCX 和 Nav 文件
book.toc = [chapter1]
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())

# 设置封面
book.set_cover('cover.jpg', open('cover.jpg', 'rb').read())

# 生成 EPUB 文件
epub.write_epub('output.epub', book)

相关工具

  • 阅读器
    • Adobe Digital Editions:官方 EPUB 阅读器
    • Calibre:跨平台电子书管理工具
    • Apple Books:macOS/iOS 内置阅读器
    • Google Play Books:Android 阅读器
  • 编辑器
    • Sigil:开源 EPUB 编辑器
    • Calibre Editor:Calibre 内置编辑器
    • Adobe InDesign:专业排版工具(可导出 EPUB)
  • 转换工具
    • Calibre:支持多种格式转换
    • Pandoc:通用文档转换工具
  • 编程库
    • Python: ebooklibepub2pypub
    • JavaScript: epub.jsepub-gen
    • Java: epublib

相关链接

参考