轻松使用 Python 将 RTF 转换为 Word(含批量转换与格式互转)

RTF(Rich Text Format,富文本格式)是 Word 生态里资格最老的交换格式之一:Windows 自带的写字板默认存的就是它,不少遗留系统的报表导出、邮件客户端的正文导出也仍在用它。它的优势是兼容性极好------几乎所有文字处理软件都能打开;短板则同样明显------不支持现代 Word 的高级特性,格式表达能力有限,也不利于程序进一步处理。

所以一旦历史文档需要重新进入日常办公流程,"把 RTF 转成 docx"就成了绕不开的一步:转成 .docx 后才能继续加批注、插表格、套模板,才能被新系统正常解析。这类需求往往还是批量的------档案室里一整柜的历史文件、某个老模块一次性导出的几百份报表。

本文介绍如何用 Spire.Doc for Python 完成 RTF 到 Word 文档的转换:先走通单文件转换这条最核心的链路,再扩展到整批文件夹处理;顺带讲清反方向的 Word 转 RTF、转换前自动识别文件格式,以及把 RTF 片段直接插入 Word 文档的进阶用法。

环境准备

本文使用 Spire.Doc for Python。它的 Document 对象是所有格式转换的统一入口------加载时自动识别源格式,保存时用 FileFormat 枚举指定目标格式,所以 RTF 与 docx 之间的转换不需要任何专门的解析代码。通过以下命令安装:

bash 复制代码
pip install Spire.Doc

安装完成后,同时导入 spire.doc 与 spire.doc.common 两个模块即可开始使用。

核心转换:RTF 到 DOCX

转换链路只有四步:创建 Document 对象 → LoadFromFile 加载 RTF 文件 → SaveToFile 以 FileFormat.Docx 保存 → Close 释放资源。

python 复制代码
from spire.doc import *
from spire.doc.common import *

inputFile = "Template_RtfFile.rtf"
outputFile = "RtfToDocx.docx"

# 创建文档对象并加载 RTF 文件
document = Document()
document.LoadFromFile(inputFile)

# 以 docx 格式保存
document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()

LoadFromFile 不要求显式声明源格式,会根据文件内容自动识别,传进去的是 RTF 还是 docx 对它没有区别。格式转换实际上是通过 SaveToFile 的第二个参数来完成的,换成什么 FileFormat,就输出什么格式。

转换后的 docx 会完整保留 RTF 里的文字、段落、字体和颜色等基础格式,之后就可以用常规的 Word 处理流程继续加工了。

输出为 Word 97-2003 格式

有些下游系统还停留在 Word 2003 时代,只认二进制的 .doc 而不接受 .docx。这种情况下无需改动任何逻辑,只要把目标枚举从 FileFormat.Docx 换成 FileFormat.Doc 即可。

python 复制代码
document = Document()
document.LoadFromFile(inputFile)

# 保存为 Word 97-2003 二进制格式
document.SaveToFile("RtfToDoc.doc", FileFormat.Doc)
document.Close()

FileFormat 枚举覆盖了 Doc、Docx、Docm、Rtf、Html、Pdf、Odt 等十余种格式,所以"RTF 转 Word"本质上只是这个枚举的一次取值选择。同一份 RTF 如果需要同时产出新旧两种格式,加载一次、调用两次 SaveToFile 就够了。

批量转换整个文件夹

历史档案数字化的典型场景是一次处理一个文件夹。思路很简单:用标准库 os 列出目录下所有 .rtf 文件,逐个套用上面的转换链路,输出文件名换成 .docx 后缀。

python 复制代码
import os
from spire.doc import *
from spire.doc.common import *

def ConvertFolderRtfToDocx(input_folder: str, output_folder: str):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    for name in os.listdir(input_folder):
        if name.endswith(".rtf"):
            inputFile = os.path.join(input_folder, name)
            outputFile = os.path.join(output_folder, name.replace(".rtf", ".docx"))

            document = Document()
            document.LoadFromFile(inputFile)
            document.SaveToFile(outputFile, FileFormat.Docx)
            document.Close()
            print("已转换:" + name)

ConvertFolderRtfToDocx("./rtf_files", "./docx_files")

在批量转换时需要注意提前新建好输出目录;document.Close() 放在循环体内逐次释放,几百份文件跑下来不会堆积句柄。如果源文件格式不统一(RTF、doc 混在一起),可以结合下一节的格式检测再做分发。

反向操作:Word 转 RTF

当接收方系统只支持 RTF,比如某些老接口仍以 RTF 作为报文格式,我们就需要把 Word 文档导出为 RTF。整体思路不变,目标枚举换成 FileFormat.Rtf。

python 复制代码
document = Document()
document.LoadFromFile("ToRtf.doc")

# 保存为 RTF 格式
document.SaveToFile("ToRtf.rtf", FileFormat.Rtf)
document.Close()

与正向转换对称,LoadFromFile 加载的源文件是 .doc 还是 .docx 都可以,SaveToFile 指定 FileFormat.Rtf 后即输出富文本格式。这样一正一反两条路打通后,RTF 与 Word 文档之间的任何方向的批量迁移都能复用同一套代码骨架。

转换前先识别文件格式

批量处理外来文件时,扩展名并不可靠------改过名的 docx、实际是 Word XML 的 .rtf 都可能遇到。Spire.Doc 提供了 DetectedFormatType 属性,加载后即可拿到真实格式,据此再做分发处理。

python 复制代码
from spire.doc import *
from spire.doc.common import *

doc = Document()
doc.LoadFromFile(inputFile)

# 获取实际检测到的文件格式
ff = doc.DetectedFormatType
if ff == FileFormat.Rtf:
    print("RTF 格式,按 RTF 流程处理")
elif ff == FileFormat.Doc:
    print("Word 97-2003 文档")
elif ff == FileFormat.Docx:
    print("Office Open XML 文档")
else:
    print("其他格式:" + str(ff))
doc.Close()

DetectedFormatType 能识别的格式远不止这三种,还包括 Docm、Dot、Html、Odt 等。把这段检测逻辑放进批量脚本的开头,就能做到"是什么格式走什么分支",比单纯信任扩展名健壮得多。

进阶:把 RTF 片段插入 Word 文档

除了整份文件的转换,还有一种更细粒度的需求:只拿到一段 RTF 字符串------比如某个老接口返回的富文本片段------想把它嵌进新建的 Word 文档里。Spire.Doc 对此提供了 AppendRTF 方法,直接把 RTF 文本追加到段落上。

python 复制代码
from spire.doc import *
from spire.doc.common import *

document = Document()

# 新建节与段落
section = document.AddSection()
para = section.AddParagraph()

# 一段 RTF 字符串(含字体表定义)
rtfString = """{\\rtf1\\ansi\\deff0 {\\fonttbl {\\f0 hakuyoxingshu7000;}}\\f0\\fs28 Hello, World}"""

# 将 RTF 片段追加到段落
para.AppendRTF(rtfString)

document.SaveToFile("InsertRtfStringToDoc.docx", FileFormat.Docx)
document.Close()

AppendRTF 会解析这段 RTF 的字体表与字号定义(\\fs28 即 14 磅),把格式一并还原进 docx 段落。这个方法适合"RTF 以字符串形式存在"的场景------整份文件用 LoadFromFile,零散片段用 AppendRTF,两条路各司其职。

实用技巧:从流加载与保存

在 Web 服务或消息队列里,文件往往以字节流而非磁盘文件的形式到达。这时不必先落盘再转换,Stream 可以直接进入加载与保存流程。

python 复制代码
from spire.doc import *
from spire.doc.common import *

# 从流中加载文档
stream = Stream(inputFile)
doc = Document(stream)
stream.Close()

# 转换后保存到新流
newStream = Stream()
doc.SaveToStream(newStream, FileFormat.Rtf)
newStream.Position = 0
newStream.Save(outputFile)
doc.Close()

加载时 Document(stream) 构造完成后即可关闭源流,因为内容已读入内存;保存时 SaveToStream 写入目标流后,记得把 Position 回拨到 0,后续的读取者才能从头拿到完整数据。整条链路不产生中间临时文件,对磁盘 IO 敏感的服务端场景尤其合适。

总结

处理 RTF 与 Word 文档之间的互转其实非常简单。核心流程就是加载文件后直接指定目标格式进行保存,无论是现代的 Word 格式、经典的老版本格式还是 RTF 自身,都能轻松实现双向转换,并能通过循环遍历搞定批量处理。在此基础之上,结合格式自动识别、片段直接插入以及流式处理等能力,足以从容应对从零散文档处理到海量档案迁移的各种实际需求,让这些老格式的文件顺畅地融入现代办公流程中。

相关推荐
zh路西法1 小时前
【深入理解 LSTM】从时间反向传播(BPTT)到长时记忆:门控机制与实验验证
pytorch·python·rnn·gru·lstm·bptt
青少儿编程课堂1 小时前
蓝桥杯青少组 + 全国青少年信息素养大赛 + 电子学会图形化考级|校园推箱子大挑战解析
c++·python·算法·bfs·信息学竞赛
2601_966949651 小时前
Python 实战:如何统计五档盘口买卖盘总挂单量?附计算公式与代码
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
全栈陈序员2 小时前
【Python】基础语法入门(二十九)—— 正则表达式实战:文本处理利器
开发语言·人工智能·python·正则表达式
得物技术2 小时前
Jev 实战:为AI工作流引入轻量决策层 x10倍提速|得物技术
python·llm·测试
reasonsummer2 小时前
【教学类-07-12】20261028大3班破译电话号码html(手机按钮版本)
python·html
摇滚侠2 小时前
《On Java 中文版 基础卷》阅读笔记 复用 13
java·笔记·python
用户298698530142 小时前
Python 将 Word 文档转换为 XML 的实践要点
后端·python·api
薛之谦_2 小时前
用 Java 实现阿里云式 IAM 子用户管理:架构设计与表结构详解
java·python·阿里云