在Next.js中使用docx-templates生成只读docx文档的方法
在Next.js中用docx-templates生成带只读权限的DOCX文档
一、设置整个文档为只读
docx-templates本身不直接提供文档保护功能,需要通过修改生成后的DOCX文件(本质是ZIP包)的XML配置来实现。以下是具体步骤:
- 生成基础文档后,用
PizZip加载生成的文件(docx-templates已依赖该库) - 修改
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
相关产品推荐
相关产品推荐

