如何阻止对内容控件的访问 - 打开 xml

How to block access to content controls - open xml

我正在通过标签从 docx 读取内容控件。我想阻止访问它(用户将无法编辑内容)。我怎样才能做到这一点? 这是我通过 docx 文档中的标签名称获取控制权的代码:

using (WordprocessingDocument wordDocTarget = WordprocessingDocument.Open(targetFilePath, true))
{
      MainDocumentPart mainPartSource = wordDocSource.MainDocumentPart;
      SdtBlock sdtBlock = mainPartSource.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "myTagName").SingleOrDefault();

      // rest of my code (editing inner text) 
}

您可以在 SdtProperties 元素中插入 Lock (<w:lock>) 元素 - 这将使内容变为只读。例如,这定义了一个包含文本 'hello' 的纯文本内容控件,在 Word 中编辑文档时显示为只读:

<w:document>
    <w:body>
        <w:sdt>
            <w:sdtPr>
                <w:lock w:val="contentLocked" />
                <w:text />
            </w:sdtPr>
            <w:sdtContent>
                <w:p>
                    <w:r>
                        <w:t>hello</w:t>
                    </w:r>
                </w:p>
            </w:sdtContent>
        </w:sdt>
  ...
  </w:body>
</w:document>

在代码中你可以使用类似这样的东西来添加锁:

using (var document = WordprocessingDocument.Open(@"c:\temp\test.docx", true))
{
    SdtBlock sdtBlock = 
        document
        .MainDocumentPart
        .Document
        .Body
        .Descendants<SdtBlock>()
        .Where(b => b.SdtProperties.GetFirstChild<Tag>().Val == "myTagName")
        .SingleOrDefault();

    var contentLock = new Lock { Val = LockingValues.SdtContentLocked };
    sdtBlock.SdtProperties.AppendChild(contentLock);
}

我发现从 Word 文档开始然后使用 OpenXML Productivity Tool 查看 Word 生成的 xml 很有用。