Python 文档格式转换:Word 转 EPUB 实践

0 阅读3分钟

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