Python文档格式转换之Word转为EPUB的示例代码

 更新时间:2026年09月28日 11:36:57   作者:缺点内向  
Word 文档在写作和编辑阶段确实方便,但面对电子阅读器或移动设备时,它的阅读体验往往不如专用格式,下面我们就来看看如何使用Python实现Word转EPUB吧

Word 文档在写作和编辑阶段确实方便,但面对电子阅读器或移动设备时,它的阅读体验往往不如专用格式。EPUB 作为电子书的主流标准,支持自适应排版、字体缩放和目录导航,更适合在 Kindle、Apple Books 等平台上阅读。如果手头有整理好的 Word 文档,将其转换为 EPUB 是一种自然的扩展需求。

本文介绍用 Python 完成这一转换的具体做法。

转换工具的选择

Python 生态中处理 Word 文档的库不少,但能直接输出 EPUB 格式的选择相对有限。python-docx 专注于 docx 文件的读写,不涉及电子书格式转换;调用 LibreOffice 的命令行方式则依赖外部软件安装,在服务器或容器环境中部署不够轻便。

一种更直接的方案是使用独立的文档处理库,通过纯代码完成加载与导出,不需要 Microsoft Word 或 LibreOffice 的参与。

下面以 Spire.Doc for Python 为例说明操作流程。

基础转换

安装方式:

pip install Spire.Doc

最简单的转换代码只需三步:

from spire.doc import *
from spire.doc.common import *

# 创建文档对象
doc = Document()

# 加载 Word 文件
doc.LoadFromFile("input.docx")

# 保存为 EPUB
doc.SaveToFile("output.epub", FileFormat.EPub)

# 释放资源
doc.Close()

FileFormat.EPub 参数指定了输出格式。转换过程中,Word 文档里的标题样式会自动映射为 EPUB 的章节结构,读者在电子书阅读器中可以通过目录直接跳转。

进阶:添加封面图片

电子书没有封面会显得不够完整,尤其在书库列表中,封面是读者最先看到的内容。该库提供了单独的 SaveToEpub 方法,可以在保存时指定封面图片:

doc = Document()
doc.LoadFromFile("input.docx")

# 创建图片对象并加载封面文件
picture = DocPicture(doc)
picture.LoadImage("cover.png")

# 保存时传入封面参数
doc.SaveToEpub("output_with_cover.epub", picture)

doc.Close()

封面图片支持 PNG、JPEG 等常见格式。电子书平台通常建议封面宽度不低于 1600 像素,以保证在高分辨率屏幕上的清晰度。

需要注意的几点

免费版本的限制:该库的免费版在读取或写入 Word 文件时,限制为 500 个段落和 25 个表格,超出限额的内容会被自动截断。对于超过这个体量的文档,需要评估是否适用。

格式映射的完整性:Word 转 EPUB 并非所有元素都能完美对应。复杂表格、文本框、特定字体效果可能在 EPUB 中呈现不同。EPUB 本质上是 XHTML 的打包格式,其排版能力与 Word 的页面模型有差异,转换后建议在目标阅读器中实际验证一次。

批量处理的写法:

import os

input_dir = "word_files/"
output_dir = "epub_files/"
os.makedirs(output_dir, exist_ok=True)

for filename in os.listdir(input_dir):
    if filename.endswith(".docx") or filename.endswith(".doc"):
        doc = Document()
        doc.LoadFromFile(os.path.join(input_dir, filename))
        
        epub_name = os.path.splitext(filename)[0] + ".epub"
        doc.SaveToFile(os.path.join(output_dir, epub_name), FileFormat.EPub)
        
        doc.Close()

每次循环结束后调用 Close() 释放文档对象,避免批量处理时内存持续增长。

知识扩展

将 Word 文档转换为 EPUB 电子书,Python 生态提供了几种不同层次的方案。选择哪种,取决于你对格式保真度、开发成本和是否需要处理复杂排版的权衡。

方案一:使用 pypandoc(推荐,成本最低)

Pandoc 是文档转换领域的“瑞士军刀”,pypandoc 是其 Python 封装。它支持从 DOCX 到 EPUB 的直接转换,且能保留标题层级、加粗/斜体、列表和基础表格。

1. 安装

pip install pypandoc

Pandoc 本身需要单独安装。Windows 用户可从 pandoc.org 下载安装包,macOS 用 brew install pandoc,Linux 用 sudo apt install pandoc。

2. 基础转换代码

import pypandoc

def docx_to_epub_pandoc(input_path, output_path, title=None, author=None):
    """
    使用 Pandoc 将 DOCX 转换为 EPUB。
    """
    extra_args = [
        '--toc',                    # 生成目录
        '--toc-depth=2',            # 目录深度到二级标题
        '--metadata', f'title={title or "Untitled"}',
        '--metadata', f'author={author or "Unknown"}',
        '--standalone',
    ]

    pypandoc.convert_file(
        input_path,
        'epub',
        outputfile=output_path,
        extra_args=extra_args
    )
    print(f'✅ EPUB 已生成:{output_path}')

调用示例:

docx_to_epub_pandoc(
    'input.docx',
    'output.epub',
    title='我的电子书',
    author='作者名'
)

3. 进阶:自定义 CSS 与封面

Pandoc 允许通过 --css 和 --epub-cover-image 参数精细控制输出样式。

def docx_to_epub_pandoc_advanced(input_path, output_path, css_path=None, cover_path=None):
    extra_args = [
        '--toc',
        '--toc-depth=3',
        '--metadata', 'title=Advanced Book',
        '--metadata', 'author=Author Name',
    ]

    if css_path:
        extra_args.extend(['--css', css_path])

    if cover_path:
        extra_args.extend(['--epub-cover-image', cover_path])

    pypandoc.convert_file(
        input_path,
        'epub',
        outputfile=output_path,
        extra_args=extra_args
    )

注意:Pandoc 对复杂表格(合并单元格、嵌套表格)和自定义 Word 样式的支持有限。如果文档包含大量此类元素,转换后可能需要手动调整。

方案二:使用商业库(格式保真度最高)

Aspose.Words for Python

Aspose.Words 是文档处理领域的商业标杆,转换质量最高,但需要许可证(免费版有功能限制)。

import aspose.words as aw

def docx_to_epub_aspose(input_path, output_path):
    # 加载许可证(如有)
    license = aw.License()
    # license.set_license("license.lic")  # 取消注释并填入许可证路径

    doc = aw.Document(input_path)

    # 按分页符拆分章节
    options = aw.saving.HtmlSaveOptions()
    options.document_split_criteria = aw.saving.DocumentSplitCriteria.PAGE_BREAK
    options.save_format = aw.SaveFormat.EPUB

    doc.save(output_path, options)
    print(f'✅ EPUB 已生成:{output_path}')

特点:保留原始排版、表格、图片位置和字体样式的能力最强,适合对保真度要求极高的生产环境。

Spire.Doc for Python

Spire.Doc 的 API 更简洁,免费版有页数限制,可申请 30 天临时许可证。

from spire.doc import Document, FileFormat

def docx_to_epub_spire(input_path, output_path, cover_image=None):
    doc = Document()
    doc.LoadFromFile(input_path)

    if cover_image:
        from spire.doc import DocPicture
        picture = DocPicture(doc)
        picture.LoadImage(cover_image)
        doc.SaveToEpub(output_path, picture)
    else:
        doc.SaveToFile(output_path, FileFormat.EPub)

    doc.Close()
    print(f'✅ EPUB 已生成:{output_path}')

方案三:纯 Python 实现(python-docx + ebooklib)

如果你需要完全控制转换流程,或者预算为零,可以用 python-docx 读取 Word 内容,再用 ebooklib 构建 EPUB。

1. 安装

pip install python-docx ebooklib beautifulsoup4

2. 完整代码

import os
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from ebooklib import epub
from bs4 import BeautifulSoup

def docx_paragraph_to_html(paragraph):
    """将 python-docx 的段落转换为 HTML。"""
    html_parts = []
    for run in paragraph.runs:
        text = run.text
        if not text:
            continue
        # 转义 HTML 特殊字符
        text = text.replace('&', '&').replace('<', '<').replace('>', '>')

        if run.bold:
            text = f'<strong>{text}</strong>'
        if run.italic:
            text = f'<em>{text}</em>'
        if run.underline:
            text = f'<u>{text}</u>'

        html_parts.append(text)

    content = ''.join(html_parts)
    if not content.strip():
        return ''

    # 根据 Word 样式映射为 HTML 标签
    style_name = paragraph.style.name if paragraph.style else ''

    if style_name.startswith('Heading 1'):
        return f'<h1>{content}</h1>'
    elif style_name.startswith('Heading 2'):
        return f'<h2>{content}</h2>'
    elif style_name.startswith('Heading 3'):
        return f'<h3>{content}</h3>'
    elif style_name.startswith('List'):
        return f'<li>{content}</li>'
    else:
        return f'<p>{content}</p>'


def docx_to_epub_pure(docx_path, epub_path, book_title=None, author=None):
    """纯 Python 实现:python-docx + ebooklib。"""
    doc = Document(docx_path)

    # 1. 将 Word 段落转换为 HTML 片段
    html_fragments = []
    in_list = False

    for para in doc.paragraphs:
        frag = docx_paragraph_to_html(para)
        if not frag:
            continue

        # 列表项包裹
        if frag.startswith('<li>'):
            if not in_list:
                html_fragments.append('<ul>')
                in_list = True
            html_fragments.append(frag)
        else:
            if in_list:
                html_fragments.append('</ul>')
                in_list = False
            html_fragments.append(frag)

    if in_list:
        html_fragments.append('</ul>')

    full_html = '\n'.join(html_fragments)

    # 2. 创建 EPUB 书籍对象
    book = epub.EpubBook()
    book.set_identifier(f'id-{os.path.basename(docx_path)}')
    book.set_title(book_title or os.path.splitext(os.path.basename(docx_path))[0])
    book.set_language('zh')
    book.add_author(author or 'Unknown')

    # 3. 创建章节
    chapter = epub.EpubHtml(
        title='正文',
        file_name='content.xhtml',
        lang='zh'
    )
    chapter.content = f'<html><body>{full_html}</body></html>'
    book.add_item(chapter)

    # 4. 设置目录和书脊
    book.toc = (chapter,)
    book.spine = ['nav', chapter]

    # 5. 添加默认导航样式
    style = epub.EpubItem(
        uid='style_default',
        file_name='style/default.css',
        media_type='text/css',
        content='body { font-family: serif; line-height: 1.6; }'
    )
    book.add_item(style)
    chapter.add_item(style)

    # 6. 写入文件
    epub.write_epub(epub_path, book)
    print(f'✅ EPUB 已生成:{epub_path}')

调用示例:

python

docx_to_epub_pure(
    'input.docx',
    'output_pure.epub',
    book_title='纯 Python 转换示例',
    author='Your Name'
)

3. 纯 Python 方案的局限

  • 图片丢失:上述代码未处理 Word 中的图片。如需包含图片,需要从 docx 中提取 InlineShape,保存为文件,并在 HTML 中以 <img> 标签引用,同时将图片添加到 EPUB 的 manifest 中。
  • 表格丢失:需要额外遍历 doc.tables 并生成 <table> HTML。
  • 样式丢失:仅能映射标题层级和粗体/斜体,无法保留字体、颜色、行距等复杂格式。
  • 超链接丢失:需要手动解析 paragraph._element 中的超链接关系。

小结

Word 转 EPUB 的核心代码量很少,关键在于理解转换过程中格式映射的边界——标题层级、段落样式、基础图片通常能保留,但复杂的页面布局和排版效果不一定能完整迁移。对于以文字为主的文档,转换效果通常可以接受;如果文档包含大量精细表格或特殊版式,转换后需要人工检查。选择工具时,优先考虑能否在目标运行环境(服务器、容器)中正常部署,以及免费方案的限制是否在可接受范围内。

到此这篇关于Python文档格式转换之Word转为EPUB的示例代码的文章就介绍到这了,更多相关Python Word转EPUB内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中顺序表的实现简单代码分享

    Python中顺序表的实现简单代码分享

    这篇文章主要介绍了Python中顺序表的实现简单代码分享,展示了代码运行结果,然后分享了相关实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 详解python 条件语句和while循环的实例代码

    详解python 条件语句和while循环的实例代码

    这篇文章主要介绍了详解python 条件语句和while循环,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • django框架forms组件用法实例详解

    django框架forms组件用法实例详解

    这篇文章主要介绍了django框架forms组件用法,结合实例形式详细分析了Django框架forms组件源码及常用操作方法与使用注意事项,需要的朋友可以参考下
    2019-12-12
  • python可视化实现代码

    python可视化实现代码

    今天小编就为大家分享一篇关于python可视化实现代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • pandas实现excel表格处理并读取指定sheet的方法

    pandas实现excel表格处理并读取指定sheet的方法

    这篇文章主要介绍了pandas实现excel表格处理并读取指定sheet的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • Opencv图像添加椒盐噪声、高斯滤波去除噪声原理以及手写Python代码实现方法

    Opencv图像添加椒盐噪声、高斯滤波去除噪声原理以及手写Python代码实现方法

    椒盐噪声的特征非常明显,为图像上有黑色和白色的点,下面这篇文章主要给大家介绍了关于Opencv图像添加椒盐噪声、高斯滤波去除噪声原理以及手写Python代码实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • python在word中插入目录和更新目录实现方式

    python在word中插入目录和更新目录实现方式

    文章主要介绍了如何在Word文档中插入和更新目录,并提供了具体的代码示例,插入目录时,需要使用`TablesOfContents`对象,并设置使用默认样式、超链接和显示的最低层级,更新目录时,可以使用全部更新或只更新页码的方法
    2025-12-12
  • pandas数据的合并concat()和merge()方式

    pandas数据的合并concat()和merge()方式

    Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于关联数据,如合并订单与客户信息
    2025-08-08
  • Python使用PyPDF2轻松实现pdf的拆分与合并

    Python使用PyPDF2轻松实现pdf的拆分与合并

    日常工作中使用 pdf 文件时,拆分与合并是一个十分常见的操作,本文详细介绍了使用Python3和PyPDF2库实现PDF文件的拆分与合并操作,文中的示例代码讲解详细,需要的小伙伴可以参考下
    2026-04-04
  • python进阶学习实时目标跟踪示例详解

    python进阶学习实时目标跟踪示例详解

    这篇文章主要为大家介绍了python进阶学习实时目标跟踪示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论