在文档分发与协作场景中,控制读者"能对文档做什么"往往比控制"谁能打开文档"更重要——把合同模板发给客户时,只希望对方填写空白项而不改动既定条款;把定稿发给团队时,只允许批注而不允许直接修改正文。这类需求通过限制编辑实现,与设置打开密码是两个不同的概念。Spire.Doc for JavaScript 基于 WebAssembly 在浏览器端直接处理 Word 文档,通过虚拟文件系统(VFS)管理字体和文件资源,无需后端服务支持。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.Doc for JavaScript 的方法。以下示例默认已安装 Spire.Doc 并完成 WebAssembly 模块初始化。
指定保护类型保护文档
Word 的限制编辑共有五种保护类型,分别对应不同的可编辑范围:NoProtection(不限制)、AllowOnlyComments(仅允许批注)、AllowOnlyFormFields(仅允许填写表单域)、AllowOnlyReading(仅允许阅读)、AllowOnlyRevisions(仅允许修订)。调用 Protect 方法传入 ProtectionType 枚举值与密码,即可按需为整篇文档施加限制。
指定保护类型的核心流程分为三个阶段:首先通过 FetchFileToVFS 将字体文件和目标 Word 文档载入 WASM 虚拟文件系统;然后实例化 Document 加载文件,调用 Protect 方法指定保护类型与解除限制所需的密码;最后保存文档并从 VFS 读取生成的文件,封装为 Blob 后触发浏览器下载。
function App() {
const protectWithSpecifiedType = async () => {
const docModule = window.wasmModule?.spiredoc;
if (!docModule) {
alert('Spire.Doc is not ready yet');
return;
}
const inputFileName = 'Template.docx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}/data/`);
// 加载文档
const doc = new docModule.Document();
doc.LoadFromFile(inputFileName);
// 以"仅允许阅读"类型保护文档,密码用于解除限制
doc.Protect({ type: docModule.ProtectionType.AllowOnlyReading, password: "123456" });
// 定义输出文件名并保存
const outputFileName = "SpecifiedProtectionType.docx";
doc.SaveToFile({ fileName: outputFileName, fileFormat: docModule.FileFormat.Docx2013 });
doc.Dispose();
const modifiedFileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([modifiedFileArray], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>保护指定类型的文档</h1>
<button onClick={protectWithSpecifiedType}>开始</button>
</div>
);
}
export default App;
以 AllowOnlyReading 类型保护后,文档内容仅可查看,编辑功能区被限制。

只锁定指定节
整篇文档统一保护并不总是合适。在合同、报价单这类模板中,通常只有少数几处需要填写,其余条款必须保持锁定。此时可以先把整篇文档按 AllowOnlyFormFields 保护,再将允许编辑的那一节通过 ProtectForm 属性单独放开,实现按节粒度的权限控制。
只锁定指定节的核心流程分为三个阶段:首先通过 FetchFileToVFS 将字体文件载入 WASM 虚拟文件系统;然后实例化 Document,用 AddSection 创建多个节并写入内容,先调用 Protect 将整篇文档按"仅允许填写表单域"保护,再把需要放开的节的 ProtectForm 属性设为 false;最后保存文档并从 VFS 读取生成的文件,封装为 Blob 后触发浏览器下载。
function App() {
const lockSpecifiedSections = async () => {
const docModule = window.wasmModule?.spiredoc;
if (!docModule) {
alert('Spire.Doc is not ready yet');
return;
}
// 新建文档,并添加两个节
const doc = new docModule.Document();
let s1 = doc.AddSection();
let s2 = doc.AddSection();
// 分别向两个节写入内容
s1.AddParagraph().AppendText("Spire.Doc 演示,第1部分");
s2.AddParagraph().AppendText("Spire.Doc 演示,第2部分");
// 整篇文档按"仅允许填写表单域"保护
doc.Protect({ type: docModule.ProtectionType.AllowOnlyFormFields, password: "123" });
// 单独放开第 2 节,使其可以编辑
s2.ProtectForm = false;
// 定义输出文件名并保存
const outputFileName = 'LockSpecifiedSections.docx';
doc.SaveToFile({ fileName: outputFileName, fileFormat: docModule.FileFormat.Docx2013 });
doc.Dispose();
const modifiedFileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([modifiedFileArray], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>锁定Word文档的指定部分</h1>
<button onClick={lockSpecifiedSections}>开始</button>
</div>
);
}
export default App;
第 2 节被放开后,文档中仅第 1 节保留编辑限制。

常见问题
设置 ProtectForm = false 后指定节仍无法编辑
原因:ProtectForm 仅在文档以 AllowOnlyFormFields(仅允许填写表单域)类型保护时生效。若文档使用的是 AllowOnlyReading 等其他保护类型,单独放开某一节不会起作用。
解决:确认 Protect 传入的保护类型与放开节的操作相匹配:
doc.Protect({ type: wasmModule.ProtectionType.AllowOnlyFormFields, password: "123" });
s2.ProtectForm = false;
保护后的文档仍可被选中复制
原因:所有保护类型限制的都是"编辑"行为,而非"读取"行为。AllowOnlyReading 只阻止修改正文,不影响选中、复制与搜索;若要连内容读取一并限制,应使用打开密码而非限制编辑。
解决:根据实际目的选择手段——需要防止内容被拿走时使用文档加密,仅在需要防止内容被改动时使用限制编辑:
doc.Protect({ type: wasmModule.ProtectionType.AllowOnlyReading, password: "123456" });
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







