在文档处理的实际业务中,Word 与 TIFF 之间的格式转换存在明确的需求场景。Word 文档便于编辑与协作,而 TIFF 作为一种位图图像格式,在需要固定版面展示、防止内容被轻易篡改或用于印刷存档时具有优势。反过来,当仅有 TIFF 图像而需要在 Word 环境中进行统一管理或展示时,将 TIFF 转换回 Word 文档同样具有实用价值。
本文介绍如何使用 Python 第三方库 Spire.Doc for Python 实现 Word 到 TIFF 以及 TIFF 到 Word 的双向转换。需要说明的是,TIFF 转 Word 的过程本质上是将图像逐页嵌入 Word 文档,生成的 Word 文件中的内容为图片形式,不具备可编辑的文本结构。
环境准备
实现上述转换需要安装 Spire.Doc for Python 以及 Pillow(PIL)库。Spire.Doc 负责 Word 文档的读取与生成,Pillow 则用于处理 TIFF 多帧图像的拆分与合并。安装命令如下:
bash
pip install Spire.Doc
pip install pillow
安装完成后,在脚本中导入所需模块即可开始操作。
Word 转 TIFF 的实现思路
将 Word 文档转换为多页 TIFF 的核心逻辑分为两步:首先利用 Spire.Doc 将文档的每一页渲染为图像数据流,然后借助 Pillow 将这些独立的图像帧合并为一个多页 TIFF 文件。
完整代码如下:
python
from spire.doc import *
from spire.doc.common import *
from PIL import Image
from io import BytesIO
# 创建 Document 对象
doc = Document()
# 加载 Word 文档
doc.LoadFromFile("C:\\Users\\Administrator\\Desktop\\示例.docx")
# 创建一个空列表,用于存放 PIL 图像
images = []
# 遍历文档中的每一页
for i in range(doc.GetPageCount()):
# 将指定页转换为图像数据流
with doc.SaveImageToStreams(i, ImageType.Bitmap) as imageData:
# 将图像流读取为 PIL 图像对象
img = Image.open(BytesIO(imageData.ToArray()))
# 将 PIL 图像追加到列表
images.append(img)
# 将 PIL 图像列表保存为多页 TIFF 文件
images[0].save("output/Word转TIFF.tiff", save_all=True, append_images=images[1:])
# 释放资源
doc.Dispose()
代码中 GetPageCount() 获取文档总页数,SaveImageToStreams() 将指定页转换为位图流。Pillow 的 save 方法通过 save_all=True 和 append_images 参数将多张图像写入同一个 TIFF 文件,从而实现多页 TIFF 的输出。最终生成的 TIFF 文件保留了原 Word 文档的版面视觉效果。
需要留意的是,SaveImageToStreams() 返回的对象配合 with 语句使用,可以确保图像数据流在读取完毕后被正确释放。另外,images[0].save() 要求列表中至少存在一张图像,因此转换前应确认源文档不为空页。
TIFF 转 Word 的实现思路
TIFF 转 Word 的方向则依赖 Pillow 读取 TIFF 的多帧结构,将每一帧提取为独立的 PNG 图像,再通过 Spire.Doc 逐页插入到新建的 Word 文档中。为了确保图像在 Word 页面中不被额外边距挤压,需要将节的页边距设为零,并将页面尺寸调整为与图像尺寸一致。
完整代码如下:
python
from spire.doc import *
from spire.doc.common import *
from PIL import Image
import io
import os
# 创建 Document 对象
doc = Document()
# 添加一个节
section = doc.AddSection()
# 将页边距全部设置为 0
section.PageSetup.Margins.All = 0.0
# 确保临时目录存在
os.makedirs("temp", exist_ok=True)
# 加载 TIFF 图像
tiff_image = Image.open("C:\\Users\\Administrator\\Desktop\\TIFF.tiff")
# 遍历 TIFF 中的每一帧
for i in range(tiff_image.n_frames):
# 定位到当前帧
tiff_image.seek(i)
# 提取当前帧的图像
frame_image = tiff_image.copy()
# 将当前帧保存为 PNG 文件
frame_image.save(f"temp/output_frame_{i}.png")
# 添加一个段落
paragraph = section.AddParagraph()
# 将图像追加到段落中
image = paragraph.AppendPicture(f"temp/output_frame_{i}.png")
# 获取图像的宽度和高度
width = image.Width
height = image.Height
# 将页面尺寸设置为与图像尺寸一致
section.PageSetup.PageSize = SizeF(width, height)
# 将文档保存为 Word 文件
doc.SaveToFile("output/TIFF转Word.docx", FileFormat.Docx2019)
# 释放资源
doc.Dispose()
这里 n_frames 属性返回 TIFF 文件的帧数,seek(i) 定位到指定帧,copy() 则复制当前帧的独立图像对象,避免后续操作受到帧指针移动的影响。AppendPicture() 将图像插入段落,随后将页面尺寸同步设置为图像的宽高,以避免图像被缩放或产生多余空白。生成的 Word 文档每一页对应 TIFF 的一帧,内容以图片形式呈现,适合作为视觉存档或展示用途,但不支持对其中文字的直接编辑。
代码中临时 PNG 文件存放在 temp 目录,运行前应确保该目录存在,或在脚本中通过 os.makedirs 自动创建。转换完成后,可根据需要清理这些临时文件。
注意事项
在实际使用中,有几个方面值得留意。
- 第一,Word 转 TIFF 的渲染效果依赖于库对原文档版式的解析精度,复杂表格、特殊字体或嵌入对象可能存在细微偏差,建议在转换后抽样检查。
- 第二,TIFF 转 Word 生成的文档本质上是"图片容器",如果后续需要对内容进行文本编辑,则不适合采用此方案,应考虑 OCR 识别或获取原始文档源文件。
- 第三,两个方向的转换均涉及文件路径操作,示例中使用了 Windows 绝对路径,实际部署时建议改为相对路径或通过配置传入,以提升脚本的可移植性。
小结
本文展示了使用 Spire.Doc for Python 配合 Pillow 完成 Word 与 TIFF 双向转换的完整流程。Word 转 TIFF 适用于版面固定化与图像存档场景,TIFF 转 Word 则解决了图像内容在 Word 环境中的集中管理与展示需求。两个方向的代码量均控制在较小规模,便于集成到自动化批处理脚本中。开发者可根据实际业务中对"可编辑性"与"版面保真度"的优先级,选择合适的方向加以应用。