我正在尝试使用开放的xml操作使word文档只读。我不确定我是在正确的轨道上还是完全错误的轨道。我在下面列出了所有相关的代码方式。它似乎没有预期的(或任何)效果。
我已经打开了xml并验证了xml中发生了一些权限,尽管我不确定它是否正确。
这是docprop / app.xml文件中的xml文件发生的事情之一
<?xml version="1.0" encoding="UTF-8"?>
<ap:Properties xmlns:ap="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties">
<ap:DocSecurity>4</ap:DocSecurity>
</ap:Properties>
这是单词/ settings.xml文件中发生的事情之一
<?xml version="1.0" encoding="UTF-8"?>
<w:settings xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:documentProtection w:enforcement="true" w:edit="readOnly"/>
</w:settings>
用于向文档添加只读权限的代码位于
之下public static class OpenXMLManipulations
{
public static void AddReadonlyPermissions(string filePath)
{
using (var myDocument = WordprocessingDocument.Open(filePath, true))
{
if (Equals(myDocument.ExtendedFilePropertiesPart, null))
myDocument.AddExtendedFilePropertiesPart();
if (Equals(myDocument.ExtendedFilePropertiesPart.Properties, null))
myDocument.ExtendedFilePropertiesPart.Properties = new Properties();
myDocument.ExtendedFilePropertiesPart.Properties.DocumentSecurity
= new DocumentSecurity("4");
myDocument.ExtendedFilePropertiesPart.Properties.Save();
/*
* Code 4 enforces read only
* http://msdn.microsoft.com/en-us/library/documentformat.openxml.extendedproperties.documentsecurity(v=office.14).aspx
*/
if (Equals(myDocument.MainDocumentPart.DocumentSettingsPart, null))
myDocument.MainDocumentPart.AddNewPart<DocumentSettingsPart>();
if (!Equals(myDocument.MainDocumentPart.DocumentSettingsPart.Settings, null) &&
(myDocument.MainDocumentPart.DocumentSettingsPart.Settings.ChildElements.Count > 0))
{
var dps = myDocument.MainDocumentPart.DocumentSettingsPart
.Settings.ChildElements.OfType<DocumentProtection>();
foreach(var _dp in dps)
_dp.Remove();
}
var dp = new DocumentProtection();
dp.Edit = DocumentProtectionValues.ReadOnly;
dp.Enforcement = OnOffValue.FromBoolean(true);
if (Equals(myDocument.MainDocumentPart.DocumentSettingsPart.Settings, null))
myDocument.MainDocumentPart.DocumentSettingsPart.Settings = new Settings();
myDocument.MainDocumentPart.DocumentSettingsPart.Settings.AppendChild(dp);
myDocument.MainDocumentPart.DocumentSettingsPart.Settings.Save();
//myDocument.Close();
}
}
}
我对这个过程有点恼火。什么指向我做错了什么?
当我打开示例word文档时,没有迹象表明我已经添加了任何permsissions修饰符,即。一切都正常打开。
谢谢, 萨姆
答案 0 :(得分:0)
您是否尝试将输出文件扩展名更改为.zip并查看包中的输出XML?
对于OpenXML标准,对app.xml的更改并非严格要求;并且w:documentProtection元素的edit和enforcement属性将使文档成为只读。但是,用户可以在不提供密码的情况下重新启用编辑。
如果您想使文档为只读并强制提供密码以使其可编辑,则文档设置部分的文档保护元素启用此功能(17.15.1.29),然后只读即可执行。