c# - 有没有办法用openxml制作一个只读段落?
问题描述
我正在使用 OpenXML 和 C# 生成一个 word 文档。我想阻止(只读)文本中的一个段落,以便用户在编辑时无法将其删除。
我做了一些不成功的测试,使整个文档成为只读的,但这不是我想要的。
var file = $"{directory}\\{fileName}.docx";
using (WordprocessingDocument package =
WordprocessingDocument.Create(file, WordprocessingDocumentType.Document))
{
package.AddMainDocumentPart();
var documentProtection = new DocumentProtection();
documentProtection.Edit = DocumentProtectionValues.ReadOnly;
package.MainDocumentPart.AddNewPart<DocumentSettingsPart>();
package.MainDocumentPart.DocumentSettingsPart.Settings = new Settings();
package.MainDocumentPart.DocumentSettingsPart.Settings.AppendChild(documentProtection);
package.MainDocumentPart.DocumentSettingsPart.Settings.Save();
package.MainDocumentPart.Document = new Document(DocBody);
package.MainDocumentPart.Document.Save();
Process.Start(file);
}
以下是我为生成段落而编写的代码:
var paragraph = new Paragraph();
var run = new Run();
var properties = new RunProperties();
var paragraphProperties = new ParagraphProperties();
properties.FontSize = new FontSize();
properties.FontSize.Val = new StringValue("20");
properties.RunFonts = new RunFonts()
{
Ascii = "Arial"
};
paragraphProperties.Justification = new Justification() { Val = JustificationValues.Center };
paragraph.Append(paragraphProperties);
run.Append(properties);
var text = new Text("Text content...") { Space = SpaceProcessingModeValues.Preserve };
run.Append(text);
paragraph.Append(run);
DocBody.Append(paragraph);
谢谢!
解决方案
实用(但不是 100% 安全)的解决方案是将受保护的一个或多个段落包装在一个锁定的富文本内容控件中,即SdtBlock
配置一个实例,使用户无法编辑或删除内容控件及其内容。
下面是一些示例标记,显示了一个锁定的内容控件,其中一个段落以这种方式保护,另一个段落在该内容控件之外。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:sdt>
<w:sdtPr>
<w:lock w:val="sdtContentLocked"/>
</w:sdtPr>
<w:sdtContent>
<w:p>
<w:r>
<w:t>This is a protected paragraph.</w:t>
</w:r>
</w:p>
</w:sdtContent>
</w:sdt>
<w:p>
<w:r>
<w:t>This is another, unprotected paragraph.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
记下由Open XML SDK 中w:lock
的类表示的元素。Lock
创建上述w:sdt
元素所需的 C# 代码如下:
var sdt =
new SdtBlock(
new SdtProperties(
new Lock { Val = LockingValues.SdtContentLocked }),
new SdtContentBlock(
new Paragraph(
new Run(
new Text("This is a protected paragraph.")))));
推荐阅读
- asp.net-core - 尽管两个身份验证都针对本地身份服务器 4,但两个本地主机站点不共享 cookie
- postgresql - 在 Postgres 中返回 json_build_object 处理删除语句中未找到的记录
- javascript - 使用字符串获取 obj 内部 obj 的道具
- visual-studio - 如何共享 Visual Studio 文件?
- python-3.x - 如何使 Gstreamer 插件可用于 PyGObject 绑定?
- python - 提取 excel 值并放入列表中
- javascript - Sequalize 隐式添加主键查询
- r - 检查多列上的所有值是否都是数字并将它们转换为数字
- ruby-on-rails - Rails Deleted User 模型,我得到未初始化的常量
- angular - Ionic 4 - Angular 6 formArrayName 未按预期工作