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

相关推荐
RuoyiOffice1 小时前
达梦 DM8 + openGauss:RuoYi Office 的 MySQL 数据转换与导入实践
数据库·spring boot·python·sql·信创
程序猿乐锅1 小时前
面向对象练习:图书借阅系统里的封装、抽象类与多态
开发语言·前端·数据库·后端·python·学习·1024程序员节
xyouyuweizhu1 小时前
Java IO 流详解:流的作用、流的划分与标准输入输出流
java·python·php
lumengabc1 小时前
视频制作文字转语音PPT台词生成合成合并视频导出ffmpeg软件python edge-tts
python
MSTcheng.1 小时前
Agent 跑到一半崩了,怎么从上一步接着跑?LangGraph StateGraph 实战:状态持久化、断点恢复与人工审批
python·状态管理·ai agent·langgraph·断点恢复·人工审批
略略略咯咯1 小时前
33333
开发语言·windows·python
java_prinln1 小时前
11. 说说 Single-Agent 和 Multi-Agent 的设计方案?
python
垆边人似月.1 小时前
第三篇:函数、文件与异常处理 / Functions, Files & Exception Handling
开发语言·python
我的xiaodoujiao2 小时前
Django 权限系统项目实战详细图文教程 4--系统登录功能实现 2
后端·python·django