在数字化时代,文档的安全性变得越来越重要。经常需要确保文档不被未授权的人编辑或复制。本文将介绍如何使用OpenXML API来禁用Microsoft Word文档(DOCX)的复制粘贴功能,而不需要使用Interop组件。
在之前的文章中,已经解释了不同类型的Word文档以及如何使用C#和Word Interop对象来保护Word文档。如果对OpenXMLAPI有疑问或需要介绍,比如它是什么、为什么使用它、从哪里下载等,可以查看之前关于OpenXML API的文章。
要开始这个应用程序,需要以下几样东西:
知道DOCX文档实际上是一组XML标签,在其中,DocumentProtection标签用于设置文档限制。当提取Word文档时,可以在'word/settings.xml'文件中找到这些标签。
DocumentProtection标签如下所示:
<w:documentProtection
w:edit="forms"
w:enforcement="1"
w:cryptProviderType="rsaFull"
w:cryptAlgorithmClass="hash"
w:cryptAlgorithmType="typeAny"
w:cryptAlgorithmSid="4"
w:cryptSpinCount="50000"
w:hash="0AMSgIVdSif6F5unNC/Lk3rBvr4="
w:salt="m3sJnUyPgf0hUjz+U1Sdxg==" />
其中,各个属性的含义如下:
下面是一个代码片段,展示了如何以编程方式在XML中添加上述属性:
DocumentFormat.OpenXml.OnOffValue docProtection = new DocumentFormat.OpenXml.OnOffValue(true);
documentProtection.Enforcement = docProtection;
documentProtection.CryptographicAlgorithmClass = CryptAlgorithmClassValues.Hash;
documentProtection.CryptographicProviderType = CryptProviderValues.RsaFull;
documentProtection.CryptographicAlgorithmType = CryptAlgorithmValues.TypeAny;
documentProtection.CryptographicAlgorithmSid = 4;
UInt32 uintVal = new UInt32();
uintVal = (uint)iterations;
documentProtection.CryptographicSpinCount = uintVal;
documentProtection.Hash = Convert.ToBase64String(generatedKey);
documentProtection.Salt = Convert.ToBase64String(arrSalt);
_objDoc.MainDocumentPart.DocumentSettingsPart.Settings.AppendChild(documentProtection);
_objDoc.MainDocumentPart.DocumentSettingsPart.Settings.Save();
_objDoc.Close();
当使用密码锁定任何文档时,实际上会创建其盐值,并使用加密矩阵生成一个密钥,最后使用'HashAlgorithm'类通过'ComputeHash'方法对其进行加密。这个方法会在多次输入迭代中被调用,最终结果将存储在XML中。
如果从XML中排除上述标签,则不会对文档应用锁定,相同的代码也适用于解锁文档,只需将ENUM更改为'DocumentProtectionValues.None'。
为了阻止复制/粘贴,使用了表单锁定技术,但如果使用基于表单的模板,用户可以从表单字段中复制/粘贴内容。要运行附带的演示代码,需要在计算机上安装OpenXML API。
OpenXML是一个开放标准,用于Word处理文档、演示文稿和电子表格,可以由多个应用程序在不同平台上自由实现。OpenXML标准的目的是将由Microsoft Office应用程序创建的文档解耦,以便其他应用程序可以独立于专有格式操纵它们,而不会丢失数据。