Python 实现 Word 与 TIFF 双向转换的方案

在文档处理的实际业务中,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 环境中的集中管理与展示需求。两个方向的代码量均控制在较小规模,便于集成到自动化批处理脚本中。开发者可根据实际业务中对"可编辑性"与"版面保真度"的优先级,选择合适的方向加以应用。

相关推荐
wo_jack2 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
量化分析码农3 小时前
【Python量化波动率实战 02】波动率会传染:EWMA 指数加权给近期行情更大话语权
后端
橙橙笔记3 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
小小张说故事3 小时前
Python 的 class 语句到底执行了什么?拆开 __prepare__、metaclass.__new__ 和那个被讲反的 __set_name__ 顺序
python
GISer_Jing4 小时前
如何学习Agent
后端·langchain
JWASX5 小时前
【Go】map 源码解析 - group
后端·golang·map·源码分析
天天被压力6 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力6 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
量化分析码农6 小时前
【Python量化波动率实战 01】波动率是怎么算的:年化、滚动与区间估计一次讲清
后端
特立独行的猫A6 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python