如何在 .NET 中处理文档
本指南展示了如何在 Aspose.Words FOSS for .NET 中使用 Document 对象模型:创建空白文档、安全加载已有文档、遍历其章节/正文结构、合并文档以及应用编辑限制。Aspose.Words FOSS for .NET 可通过 NuGet 获取,或自行从源码构建。
分步指南
步骤 1:获取库
克隆仓库并进行构建 Aspose.Words.sln 在 Release 配置下,然后添加项目引用至 Aspose.Words.csproj 从您自己的 .NET 项目。完整的克隆和构建命令位于 安装指南。引用后,添加 using Aspose.Words; 在任何处理文档的文件顶部。
步骤 2:创建或加载文档
调用 new Document() 可获取空白文档,或将文件路径或 Stream 传递给 Document(fileName) / Document(stream) 构造函数以打开已有文档。接受 LoadOptions 参数的重载允许你为加密文件提供密码。在加载尚未信任其格式的文件之前,调用 FileFormatUtil.DetectFileFormat(fileName) ——它返回一个 FileFormatInfo,报告检测到的 LoadFormat 以及文件是 IsEncrypted、HasDigitalSignature 还是 HasMacros,从而在 Document 试图解析之前拒绝意外的输入。
第3步:使用 DocumentBuilder 编写内容
DocumentBuilder 包装一个 Document,并提供一个光标,您可以在遍历树结构时插入内容。Write(text) 和 Writeln(text) 在光标处插入文本,InsertParagraph() 开始一个新段落。构建器的 Font、ParagraphFormat、ListFormat 和 PageSetup 属性上设置的格式将应用于您接下来写的任何内容。使用 MoveToDocumentStart()、MoveToDocumentEnd()、MoveToSection(sectionIndex)、MoveToBookmark(bookmarkName) 或 MoveToParagraph(paragraphIndex, characterIndex) 重新定位光标,并读取 CurrentNode / CurrentParagraph / CurrentSection 以确认构建器的位置。
第4步:检查节和主体结构
一个 Document 通过 Document.Sections(以及 FirstSection / LastSection)公开一个 SectionCollection。每个 Section 恰好有一个 Body,其主要内容可通过 Body.Paragraphs(一个 ParagraphCollection)和 Body.Tables 访问。要在不手动遍历节点的情况下读取或搜索文本,请使用位于 Document、Section、Paragraph 等节点上的 Range —— Range.Text 返回其纯文本,Range.Replace(pattern, replacement) 执行仅在该范围内的查找替换。
第5步:合并两个文档
要复制整个文档,请调用 Document.Clone()。要将一个 Document 实例中的特定内容导入另一个实例,请在目标文档上调用 ImportNode(srcNode, isImportChildren),或调用 Document.AppendDocument(srcDoc, importFormatMode) 将源文档的每个节追加到当前文档的末尾。DocumentBuilder.InsertDocument(srcDoc, importFormatMode) 功能相同,只是将内容插入构建器的光标位置而不是文档末尾。在这三种情况下,都要有意选择 ImportFormatMode 值——KeepSourceFormatting、UseDestinationStyles 或 KeepDifferentStyles——因为它决定了在两者冲突时哪篇文档的样式优先。
第6步:应用编辑限制
调用 Document.Protect(type, password) 并传入 ProtectionType 值——ReadOnly、AllowOnlyComments、AllowOnlyRevisions 或 AllowOnlyFormFields——以限制 Word 接受文档的哪些编辑。Unprotect()(有或没有匹配的密码)可移除该限制。这仅影响 Word 内部的编辑;并不会加密已保存的文件。若要仅在打开文件时要求密码,请在保存时设置 OoxmlSaveOptions.Password。
常见问题与解决方案
Document(fileName) 对在 Word 中可以正常打开的文件会抛出异常。 该文件的格式不受此版本加载器的支持。调用 FileFormatUtil.DetectFileFormat(fileName) 首先并检查返回的内容 LoadFormat 在尝试加载之前。
在文档之间复制的内容会带入错误的字体或样式。 该 ImportFormatMode 传递给 AppendDocument or InsertDocument 与您预期的不符。请传递 KeepSourceFormatting or UseDestinationStyles 明确指定,而不是依赖默认值。
Unprotect() 似乎没有任何效果。 要么文档没有使用密码保护(调用 Unprotect() 不带参数),或者提供的密码与 Protect() 调用时使用的密码不匹配。
通过以下方式应用的格式化 DocumentBuilder 未在预期位置显示。 构建器级别的格式化(Font, ParagraphFormat)仅适用于已编写的内容 after 已设置。移动光标并在调用之前设置格式化 Write/Writeln, 不是之后。
常见问题
如何创建一个新的空白 Word 文档?
调用 new Document()。用 DocumentBuilder 包裹它,以立即开始插入内容。
Document.Clone() 和 ImportNode 有什么区别?
Clone() 将整个文档复制到一个新的 Document 实例中。ImportNode(srcNode, isImportChildren) 将单个节点(以及可选的子节点)从一个文档的树中带入另一个文档,这正是你用来组合特定内容而不是整个文档的方式。
我如何在加载文件之前安全地检查文件的格式?
调用 FileFormatUtil.DetectFileFormat(fileName)(或 Stream 重载),并在将文件传递给 Document 之前检查返回的 FileFormatInfo 的 LoadFormat、IsEncrypted、HasDigitalSignature 和 HasMacros 属性。
我如何只读取文档正文中的段落?
在章节的 Body 上使用 Body.Paragraphs 集合,或对其他节点类型使用 Body.GetChildNodes(nodeType, isDeep)。
Document.Protect 会加密保存的文件吗?
不——这是 Word 在打开文件时强加的编辑限制。若要在打开文件本身时要求密码,请在调用 Document.Save 时设置 OoxmlSaveOptions.Password。