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 自身,都能轻松实现双向转换,并能通过循环遍历搞定批量处理。在此基础之上,结合格式自动识别、片段直接插入以及流式处理等能力,足以从容应对从零散文档处理到海量档案迁移的各种实际需求,让这些老格式的文件顺畅地融入现代办公流程中。