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

相关推荐
cpp_w1 小时前
C#基础3- 面向对象中级应用3
后端·c#
代码小学僧1 小时前
如何低成本部署网站?Vercel 和 Cloudflare 怎么选?
前端·后端·serverless
benchmark_cc1 小时前
实时行情和分钟 K 线应该如何配合使用?从信号计算到交易决策的完整分析
大数据·python·数据分析·pandas·量化交易·股票数据·quantdash
LMT流氓兔1 小时前
第四单元——第17课:让回答边生成、边显示
服务器·数据库·人工智能·python·oracle·langchain
MetWeave1 小时前
从零跑一个气象数据管道:抓取、清洗、对账、节奏
后端·python
用户3851408539472 小时前
Python 的 O_NOFOLLOW 为什么挡不住中间目录的符号链接?
python
gopher95112 小时前
RUST:序列化与反序列化 serde + derive 详解
开发语言·后端·rust
铁皮饭盒2 小时前
CPU就行, 老照片变清晰, 本地部署582mb腾讯的模型, 本地部署, 过节了给长辈们变个小魔术
前端·javascript·后端
七夜zippoe2 小时前
Spring Boot 接通义千问:从拿 Key 到第一个对话接口跑通(保姆级)
java·spring boot·后端