
在日常办公中,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 使用。
在受保护的文档中留出可编辑区域
有些场景下,文档整体只读,但希望指定段落仍可编辑,比如合同中的签字栏、问卷中的答题区。实现方式是在保护文档后,用 PermissionStart 和 PermissionEnd 标签把允许编辑的段落圈出来:
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()
PermissionStart 与 PermissionEnd 使用相同的 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 / PermissionEnd 和 ProtectForm 属性。在实际项目中,可以将这些操作封装成函数,结合循环对成批文档应用统一的安全策略,从而替代大量重复的手工操作。