You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Next.js中使用docx-templates生成只读docx文档的方法

在Next.js中用docx-templates生成带只读权限的DOCX文档

一、设置整个文档为只读

docx-templates本身不直接提供文档保护功能,需要通过修改生成后的DOCX文件(本质是ZIP包)的XML配置来实现。以下是具体步骤:

  1. 生成基础文档后,用PizZip加载生成的文件(docx-templates已依赖该库)
  2. 修改word/settings.xml,添加文档保护配置
import { createReport } from 'docx-templates';
import PizZip from 'pizzip';

export async function generateReadOnlyDocx(templatePath, data) {
  // 1. 从模板生成基础文档
  const templateBuffer = await fetch(templatePath).then(res => res.arrayBuffer());
  const baseDocBuffer = await createReport({
    template: templateBuffer,
    data,
    output: 'buffer',
  });

  // 2. 加载文档到PizZip
  const zip = new PizZip(baseDocBuffer);

  // 3. 修改settings.xml添加只读保护
  let settingsXml = zip.read('word/settings.xml', 'string');
  // 添加只读保护节点(enforcement=1表示启用保护,edit="readOnly"设为只读)
  const protectionNode = `
    <w:documentProtection 
      w:edit="readOnly" 
      w:enforcement="1" 
      xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" />
  `;
  // 插入到settings标签末尾
  settingsXml = settingsXml.replace('</w:settings>', `${protectionNode}</w:settings>`);
  zip.file('word/settings.xml', settingsXml);

  // 4. 生成最终的只读文档buffer
  return zip.generate({ type: 'nodebuffer' });
}

如果需要强制只读(需密码解除),需要添加密码哈希(注意:DOCX的密码是SHA-1哈希后的十六进制值,不是明文),修改documentProtection节点:

<w:documentProtection 
  w:edit="readOnly" 
  w:enforcement="1" 
  w:cryptProviderType="rsaFull" 
  w:cryptAlgorithmClass="hash" 
  w:cryptAlgorithmType="typeAny" 
  w:cryptAlgorithmSid="4" 
  w:cryptSpinCount="100000" 
  w:hash="你的密码SHA-1哈希值" 
  xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" />

二、设置部分内容为只读

要实现部分内容只读,需要定位到目标内容的XML节点,添加编辑限制属性,或用内容控件包裹并设置控件为不可编辑。

方法1:修改段落属性实现只读

假设你要保护的段落在模板中有特定标记(比如{{protectedContent}}),生成后找到对应段落添加w:edit="readOnly"属性:

// 接上面的zip对象
let documentXml = zip.read('word/document.xml', 'string');
// 找到目标段落的p标签,添加编辑限制
documentXml = documentXml.replace(
  '<w:p>',
  '<w:p><w:pPr><w:edit w:val="readOnly" /></w:pPr>'
);
zip.file('word/document.xml', documentXml);

方法2:用内容控件实现只读(推荐)

在Word模板中预先插入内容控件(开发者选项卡 → 控件),设置控件为"不可编辑",然后用docx-templates填充控件内容。生成后的文档中,该控件区域会保持只读状态。

注意事项

  • 客户端处理时,确保使用PizZip的浏览器兼容版本
  • DOCX的只读保护可以被用户通过"启用编辑"解除(除非设置了强制密码保护)
  • 精确修改XML节点时,建议先解压DOCX文件查看结构,避免破坏文档格式

内容的提问来源于stack exchange,提问作者Prachi Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:52:56