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

相关推荐
青 春 记 忆3 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
GlueNa2SiO33 小时前
03-Flask模板引擎Jinja2详解
笔记·python·flask
东风破_4 小时前
从输入 juejin.cn 到看到页面:DNS、Nginx、服务器集群与 CDN 到底在做什么?
后端·mysql
东风破_4 小时前
从 0 设计一个博客数据库:用户、头像与文章表应该怎么建?
后端·mysql
大鸡腿同学4 小时前
黄仁勋点透的 AI 真相:能实现你知道但做不到的,却实现不了你不知道的
后端
FfHUCisI5 小时前
Go 编译过程全景
开发语言·后端·golang
FfHUCisI5 小时前
Golang 语法分析与 AST:Parser 与 go/ast
开发语言·后端·golang
临沂GEO6 小时前
GEO搜索优化科普|正规地理位置流量运营入门指南
大数据·人工智能·python·流量运营
大模型码小白6 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
++==7 小时前
RESTful详解:核心思想、框架、与HTTP的区别,API的设计风格
后端·http·restful