如何使用 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 属性。在实际项目中,可以将这些操作封装成函数,结合循环对成批文档应用统一的安全策略,从而替代大量重复的手工操作。

相关推荐
80s77715 小时前
动态代理和静态代理的区别,动态代理怎么提高网络安全性
python
GreenTea16 小时前
7000 万 QPS、500 PB:OpenAI 如何用一个 Python 存储平台撑住 10 亿用户
后端·架构
Flynt16 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet16 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
GreenTea16 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
niucloud-admin17 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
小叶肥辉17 小时前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain
2401_8734794017 小时前
IP属地为什么有时显示外省?用IP查询工具核查动态分配、运营商出口与GeoIP库
python·tcp/ip·ip
Bs_MoneyMagnet19 小时前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
OKkankan20 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用