如何使用 Python 加密和保护 Word 文档

在日常办公中,Word 文档经常包含合同条款、财务报表、内部规范等敏感内容。将这些文件直接发给他人时,往往需要限制对方的访问权限------要么要求输入密码才能打开,要么只允许阅读、禁止修改。手动在 Word 中逐个设置这些选项很繁琐,而在批量分发文档时更不现实。用 Python 可以统一处理这类需求:一次脚本运行,就能为一批文档加上密码、设置编辑限制,甚至指定某些段落仍可填写。

本文以 Spire.Doc for Python 为例,介绍如何对 Word 文档执行加密、保护、解除保护以及设置可编辑区域等常见操作。

环境准备

安装 Spire.Doc 库:

bash 复制代码
pip install Spire.Doc

然后在脚本中引入必要的模块:

python 复制代码
from spire.doc import *
from spire.doc.common import *

用密码加密文档

最直接的保护方式是给文档设置打开密码。只有输入正确密码的用户才能查看内容。加密只需调用 Encrypt() 方法:

python 复制代码
# 创建 Document 对象并加载文档
document = Document()
document.LoadFromFile("合同模板.docx")

# 设置打开密码
document.Encrypt("E-iceblue")

# 保存加密后的文档
document.SaveToFile("加密后的合同.docx", FileFormat.Docx)
document.Close()

加密后,双击打开该文件会弹出密码输入框。Encrypt() 传入的字符串即为打开密码,保存时文档会以加密形式写入磁盘。

设置保护类型,限制编辑

如果希望文档可以打开,但不能被随意修改,可以使用 Protect() 方法。它接受两个参数:保护类型和密码。密码用于解除保护,保护类型则由 ProtectionType 枚举指定。

python 复制代码
document = Document()
document.LoadFromFile("会议纪要.docx")

# 仅允许阅读,修改需提供密码
document.Protect(ProtectionType.AllowOnlyReading, "123456")

document.SaveToFile("只读会议纪要.docx", FileFormat.Docx2013)
document.Close()

ProtectionType 提供多种粒度:

  • AllowOnlyReading:只允许阅读,其余编辑操作都被禁止;
  • AllowOnlyFormFields:只能填写表单域,适合需要收集填写的场景;
  • NoProtection:解除保护。

选择哪种类型取决于文档的使用方式。例如,需要收集信息的通知文件可以配合 AllowOnlyFormFields 使用。

在受保护的文档中留出可编辑区域

有些场景下,文档整体只读,但希望指定段落仍可编辑,比如合同中的签字栏、问卷中的答题区。实现方式是在保护文档后,用 PermissionStartPermissionEnd 标签把允许编辑的段落圈出来:

python 复制代码
document = Document()
document.LoadFromFile("调研问卷.docx")

# 先保护整个文档
document.Protect(ProtectionType.AllowOnlyReading, "password")

# 为可编辑区域创建一对起止标签
start = PermissionStart(document, "editID")
end = PermissionEnd(document, "editID")

# 将标签插入到第一个段落的开头和结尾
first_paragraph = document.Sections[0].Paragraphs[0]
first_paragraph.ChildObjects.Insert(0, start)
first_paragraph.ChildObjects.Add(end)

document.SaveToFile("问卷-可编辑版.docx", FileFormat.Docx)
document.Close()

PermissionStartPermissionEnd 使用相同的 ID 标识同一个区域,两者之间的内容即为允许编辑的范围。这样,读者在只读文档中仍可修改被标记的段落。

锁定指定节

对于由多个节(Section)组成的文档,可以只保护部分节。思路是:先对整个文档启用保护,再将不需要保护的节设为 ProtectForm = False

python 复制代码
document = Document()

# 添加两个节并写入文本
s1 = document.AddSection()
s2 = document.AddSection()
s1.AddParagraph().AppendText("第一节:受保护的内容")
s2.AddParagraph().AppendText("第二节:可编辑的内容")

# 使用表单域保护类型保护整个文档
document.Protect(ProtectionType.AllowOnlyFormFields, "123")

# 解除第二节的保护
s2.ProtectForm = False

document.SaveToFile("分节保护.docx", FileFormat.Docx2013)
document.Close()

这种做法的典型应用是:文档前半部分是固定的说明文字,后半部分是留给用户填写的表格或内容。

打开加密文档并解除保护

当需要修改受保护的文档时,先带密码加载,再解除保护:

python 复制代码
document = Document()

# 用密码加载加密文档
document.LoadFromFile("加密后的合同.docx", FileFormat.Docx, "E-iceblue")

# 解除所有保护
document.Protect(ProtectionType.NoProtection)

document.SaveToFile("解密后的合同.docx", FileFormat.Docx)
document.Close()

LoadFromFile() 的第三个参数即文档的打开密码。之后调用 Protect(ProtectionType.NoProtection) 即可移除编辑限制。

实用提示

  • 密码只保存在生成的文件中,脚本本身不会记录密码;如果密码丢失,加密的文档将无法正常打开,建议在脚本外部统一管理密码。
  • Protect()Encrypt() 可以叠加使用:先设置打开密码,再启用编辑保护,形成双重防线。
  • 批量处理时,把密码和文件路径放在一个循环或列表中,即可一次加密整批文档。

总结

本文演示了用 Python 对 Word 文档进行加密、编辑保护、可编辑区域设置、分节保护以及解除保护的完整流程。核心 API 包括 Encrypt()Protect()PermissionStart / PermissionEndProtectForm 属性。在实际项目中,可以将这些操作封装成函数,结合循环对成批文档应用统一的安全策略,从而替代大量重复的手工操作。

相关推荐
Fluxproxy1 小时前
AI数据集采集、批量模型推理报错频发?AI项目网络稳定性优化实战
python·ai·ai编程
他们叫我秃子1 小时前
前端开发转 Go 全栈(五):终于遇到熟人了,Go 的闭包和高阶函数原来这么像 JavaScript
前端·后端·go
SomeB1oody1 小时前
【RustyML入门】2.6. 线性判别分析
开发语言·后端·机器学习·rust·教程
妙码生花1 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十七):AI时代对组件封装的新理解、agInput 统一入口,动态表单预备
前端·后端·go
Yao8061 小时前
SpringAI + Ollama + DeepSeek + RAG 搭建 AI 航线规划系统
后端
大勇前进1 小时前
SQL Server 分页查询多种写法对比:哪种性能最高?
后端
妙码生花1 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十六):附件管理、增加根据文件后缀生成 SVG 文件图标的接口
前端·后端·go
Fanta丶1 小时前
10.Python class类的定义和魔术方法
python
前端Hardy1 小时前
Vue 终于杀进终端界!这个开源项目让 CLI 开发像写网页一样简单
前端·javascript·后端