Ms word 添加只读权限以打开XML或Word文档

Ms word 添加只读权限以打开XML或Word文档,ms-word,openxml,Ms Word,Openxml,我正在尝试使用开放式xml操作使word文档只读。我不确定我是在正确的轨道上还是完全错误的轨道上。我在下面列出了我所有的相关代码。它似乎没有预期的(或任何)效果 我已经打开了xml并验证了xml中正在发生的一些事情,尽管我不确定这是否正确 这是docprop/app.xml文件中的xml文件发生的事情之一 <?xml version="1.0" encoding="UTF-8"?> <ap:Properties xmlns:ap="http://schemas.openxmlf

我正在尝试使用开放式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>

4.
这是word/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();
        }

    }
}
公共静态类OpenXmlOperations
{
公共静态void AddReadonlyPermissions(字符串文件路径)
{
使用(var myDocument=WordprocessingDocument.Open(filePath,true))
{
if(等于(myDocument.ExtendedFilePropertiesPart,null))
myDocument.AddExtendedFilePropertiesPart();
if(等于(myDocument.ExtendedFilePropertiesPart.Properties,null))
myDocument.ExtendedFilePropertiesPart.Properties=新属性();
myDocument.ExtendedFilePropertiesPart.Properties.DocumentSecurity
=新文件担保(“4”);
myDocument.ExtendedFilePropertiesPart.Properties.Save();
/*
*代码4强制执行只读
* http://msdn.microsoft.com/en-us/library/documentformat.openxml.extendedproperties.documentsecurity(v=办公室14)aspx
*/
if(等于(myDocument.MainDocumentPart.DocumentSettingsPart,null))
myDocument.MainDocumentPart.AddNewPart();
如果(!等于(myDocument.MainDocumentPart.DocumentSettingsPart.Settings,null)&&
(myDocument.MainDocumentPart.DocumentSettingsPart.Settings.ChildElements.Count>0))
{
var dps=myDocument.main documentpart.DocumentSettingsPart
.Settings.ChildElements.OfType();
foreach(dps中的var_dp)
_dp.Remove();
}
var dp=新文档保护();
dp.Edit=DocumentProtectionValues.ReadOnly;
dp.Enforcement=OnOffValue.FromBoolean(真);
if(等于(myDocument.MainDocumentPart.DocumentSettingsPart.Settings,null))
myDocument.MainDocumentPart.DocumentSettingsPart.Settings=新设置();
myDocument.MainDocumentPart.DocumentSettingsPart.Settings.AppendChild(dp);
myDocument.MainDocumentPart.DocumentSettingsPart.Settings.Save();
//myDocument.Close();
}
}
}
我对这个过程有点恼火。有没有关于我做错了什么的线索

当我打开示例word文档时,没有迹象表明我添加了任何Permissions修饰符,即所有内容都正常打开

谢谢,
Sam

您是否尝试将输出文件扩展名更改为.zip并查看包中的输出XML

对于OpenXML标准来说,对app.xml的更改并不是绝对必要的;w:documentProtection元素的编辑和强制属性将使文档成为只读的。但是,用户可以在不提供密码的情况下重新启用编辑

如果要使文档只读并强制提供密码以使其可编辑,则文档设置部分(17.15.1.29)的“文档保护”元素可启用此选项,然后可以强制执行只读