Python如何实现为Word文档设置保护与加密
作者:大丸子
Word 文档在分发前常需设置保护:合同要限定谁能打开,制度文档要防止误改,报表要允许填数据但锁住格式。这些需求对应 Word 的两层保护机制——加密控制访问,打开时必须提供密码;编辑保护控制打开后能做什么,限制修改、批注或修订。两层独立使用,也可以叠加。
用 Free Spire.Doc for Python 可以在 Python 中完成这两层保护的全部操作:Encrypt 设置打开密码,Protect 按 ProtectionType 枚举限定编辑行为,PermissionStart 与 PermissionEnd 在保护范围内开放特定段落,ToPdfParameterList 在转 PDF 时同步加密。
pip install spire.doc.free
本文的输入文档是一份"项目管理制度",含三个节:封面(标题、版本号、密级、编制部门)、正文(三章条款加一张职责分工表)、附录(修订记录表)。所有操作都基于这份文档,产物与真实运行一致。
加密:设置打开密码
Encrypt 作用于文件层,对整个文档内容加密,打开时必须输入密码,与文档里的具体内容无关。加载文档、设置密码、另存即可:
from spire.doc import *
from spire.doc.common import *
document = Document()
document.LoadFromFile("项目管理制度.docx")
document.Encrypt("Pm@2026")
document.SaveToFile("加密文档.docx", FileFormat.Docx)
document.Close()生成的"加密文档.docx"用 Word 打开时会弹出密码输入框,密码正确才能查看内容;用 Spire.PDF 加载时不带密码会抛出 The document is encrypted and a password is required to open it,带密码则正常打开。

解密需要显式调用 RemoveEncryption。一个容易忽略的细节:用密码 LoadFromFile 之后直接 SaveToFile,输出文档仍然带密码——加密状态随文档对象保留,不会因为加载时提供了密码就自动清除。正确做法是加载后调用 RemoveEncryption 再保存:
document = Document()
document.LoadFromFile("加密文档.docx", FileFormat.Docx, "Pm@2026")
document.RemoveEncryption()
document.SaveToFile("解密文档.docx", FileFormat.Docx)
document.Close()编辑保护:限定打开后的修改方式
Protect 通过 ProtectionType 枚举限定编辑行为,第二个参数是移除保护时需要的密码。与加密不同,编辑保护不限制打开,任何人都能查看文档,只是不能随意修改。五种取值覆盖了常见的限制场景:
| ProtectionType | 允许的操作 | 典型用途 |
|---|---|---|
| AllowOnlyReading | 仅查看 | 终版制度文档,禁止任何修改 |
| AllowOnlyComments | 查看 + 批注 | 征求意见稿,允许批注但不改正文 |
| AllowOnlyRevisions | 查看 + 修订 | 审稿流程,修改以修订模式记录 |
| AllowOnlyFormFields | 查看 + 填写窗体域 | 固定模板报表,只允许填表 |
| NoProtection | 无限制 | 移除编辑保护 |
对同一份文档分别设置只读、仅批注、仅修订三种保护:
configs = [
(ProtectionType.AllowOnlyReading, "只读保护.docx"),
(ProtectionType.AllowOnlyComments, "仅批注保护.docx"),
(ProtectionType.AllowOnlyRevisions, "仅修订保护.docx"),
]
for ptype, outFile in configs:
document = Document()
document.LoadFromFile("项目管理制度.docx")
document.Protect(ptype, "Edit@2026")
document.SaveToFile(outFile, FileFormat.Docx2013)
document.Close()在 Word 中打开"只读保护.docx",顶部会出现限制编辑提示栏,尝试修改正文会弹出保护提示;"仅批注保护.docx"允许插入批注但无法替换文字;"仅修订保护.docx"的修改会以红色修订标记保留,不会直接覆盖原文。

移除编辑保护用 Protect(ProtectionType.NoProtection),它作用于编辑层,与加密层的 RemoveEncryption 互不替代。
局部可编辑:在只读文档中开放特定段落
实际场景里常需要"全文锁住,只留某几段可填"——比如制度文档里只有审批意见栏需要填写,其余内容禁止改动。PermissionStart 和 PermissionEnd 成对使用,标记之间的内容可编辑,前提是全文已设保护。先将文档设为只读,再单独开放正文第一条条款所在段落:
document = Document()
document.LoadFromFile("项目管理制度.docx")
document.Protect(ProtectionType.AllowOnlyReading, "Edit@2026")
targetPara = document.Sections[1].Body.Paragraphs[1]
start = PermissionStart(document, "editableRule1")
end = PermissionEnd(document, "editableRule1")
targetPara.ChildObjects.Insert(0, start)
targetPara.ChildObjects.Add(end)
document.SaveToFile("局部可编辑.docx", FileFormat.Docx)
document.Close()权限标记插入到段落 ChildObjects 的首尾位置:Insert(0, start) 放在最前,Add(end) 放在最后,两者之间的所有子对象都落入可编辑范围。在 Word 中打开这份文档,正文整体不可修改,但第一条条款所在段落可以正常编辑,其余段落仍受只读保护约束。

节级控制:锁定部分章节而放开其余
多节文档有时只需锁定部分章节。先对全文设保护,再对要放开的节单独解除。ProtectForm 属性控制单节是否受全文保护约束。先将全文设为仅窗体域保护,封面和正文保持锁定,附录放开允许补充修订记录:
document = Document()
document.LoadFromFile("项目管理制度.docx")
document.Protect(ProtectionType.AllowOnlyFormFields, "Edit@2026")
document.Sections[2].ProtectForm = False
document.SaveToFile("节级锁定.docx", FileFormat.Docx2013)
document.Close()这里用 AllowOnlyFormFields 而非 AllowOnlyReading,因为节级解除依赖窗体域保护机制——只读保护作用于文档整体,无法按节单独放开。生成的文档中,封面和正文无法编辑,附录的修订记录表可以自由填写。

转 PDF 并加密:分发环节的统一保护
正式分发时常把 Word 转 PDF 再加密,避免接收方拿到可编辑的源文件。ToPdfParameterList 携带转换参数,其 PdfSecurity 属性支持对转出的 PDF 设置打开密码,与 Word 层的加密互不影响:
document = Document()
document.LoadFromFile("项目管理制度.docx")
toPdf = ToPdfParameterList()
toPdf.PdfSecurity.Encrypt("Pdf@2026")
document.SaveToFile("制度文档_加密.pdf", toPdf)
document.Close()生成的 PDF 大小 101880 字节,打开时需要输入密码 Pdf@2026。即使源 Word 文档未加密,转出的 PDF 也可以独立加密;反过来,源文档加密后转 PDF 默认不继承密码,需要通过 PdfSecurity 单独设置。

解密与移除保护
解密和移除保护作用于不同层,需要分别处理。完整代码把加密文档解密、把只读保护文档解除保护:
# 解密:移除打开密码
document = Document()
document.LoadFromFile("加密文档.docx", FileFormat.Docx, "Pm@2026")
document.RemoveEncryption()
document.SaveToFile("解密文档.docx", FileFormat.Docx)
document.Close()
# 移除编辑保护
doc = Document()
doc.LoadFromFile("只读保护.docx")
doc.Protect(ProtectionType.NoProtection)
doc.SaveToFile("移除保护.docx", FileFormat.Docx2013)
doc.Close()解密后的"解密文档.docx"无需密码即可打开,内容与原文档一致;"移除保护.docx"的编辑限制已解除,可以自由修改。如果文档同时有加密和编辑保护,需要先 RemoveEncryption 再 Protect(NoProtection),或反之,两步独立完成。
何时使用哪种保护
加密适合控制文档的可见范围——外部分发的合同、报价单、人事档案,不设密码就可能被无关人员打开。编辑保护适合文档已经可以查看但要限制修改的场景:制度文件用只读保护防止误改,征求意见稿用仅批注保护收集反馈,审稿用仅修订保护保留修改痕迹。两层叠加用于既要控制访问又要限制编辑的高敏感文档,比如加密后只读保护的合同,即使密码泄露也无法直接篡改内容。
在分发流程中,这些操作可以串成自动化脚本:生成文档后按密级设置对应保护,转 PDF 时同步加密,最后把受保护文件推送到分发通道。批量处理时对每份文档循环执行,密码可以从配置或数据库读取,避免硬编码在脚本里。
以上就是Python如何实现为Word文档设置保护与加密的详细内容,更多关于Python保护与加密Word的资料请关注脚本之家其它相关文章!
