文档信息
文档信息
本指南展示了如何使用 Aspose.Words FOSS for .NET 读取和写入文档元数据。每个已加载或新创建的 Document 在其内容旁携带两种元数据:一套固定的内置属性(作者、标题、字数等)以及一套由您自行定义的开放式自定义属性。Aspose.Words FOSS for .NET 还实现了在文档正文中显示这些元数据的 Word 字段——AUTHOR、COMMENTS 和 DOCPROPERTY——因此属性值可以作为实时、可更新的文本出现。
内置文档属性
Document.BuiltInDocumentProperties 返回一个 BuiltInDocumentProperties 集合,其中每个标准 Word 元数据字段对应一个属性:Author、Title、Subject、Comments、Category、Company、Manager、Keywords、CreatedTime、LastSavedTime、LastSavedBy、LastPrinted、RevisionNumber、TotalEditingTime,以及诸如 Pages、Words、Characters、CharactersWithSpaces、Paragraphs 和 Lines 的统计信息。由于 BuiltInDocumentProperties 派生自 DocumentPropertyCollection,它还支持通过其索引器 Contains()、IndexOf() 按名称查找,以及通过 GetEnumerator() 进行枚举。在处理纯文本输入时,同一集合在 PlainTextDocument.BuiltInDocumentProperties 上也可访问。
自定义文档属性
Document.CustomDocumentProperties 返回一个 CustomDocumentProperties 集合,用于应用程序自行定义的属性——Word 与内置属性一起存储的任意名称/值对。使用 Add(name, value) 添加属性,该方法在 CustomDocumentProperties 上被重载以适配属性可持有的值类型;通过索引器检索属性,例如 properties[name];并使用 Remove(name)、RemoveAt(index) 或 Clear() 删除条目。AddLinkToContent(name, linkSource) 创建的属性,其值链接到文档中的书签或范围,而不是作为固定值存储。
任一集合(内置或自定义)中的每个条目都是一个 DocumentProperty,它公开 Name、Value 和 Type(一个 PropertyType 值:String、Number、Double、Boolean、DateTime、StringArray、ObjectArray、ByteArray 或 Other),以及用于链接属性的 IsLinkToContent 和 LinkSource。DocumentProperty 提供转换助手,如 ToString()、ToInt()、ToDouble()、ToDateTime()、ToBool() 和 ToByteArray(),用于以所需的 .NET 类型检索底层值。
文档信息字段
三种 Field 子类将文档元数据公开为文档正文内部的字段:FieldAuthor(AUTHOR 字段,具有 AuthorName 属性),FieldComments(COMMENTS 字段,具有 Text 属性),以及 FieldDocProperty(DOCPROPERTY 字段,它将一个具名文档属性(内置或自定义)读取到文档中)。和每个 Field 一样,这三者共享基础的 Field 生命周期:GetFieldCode() 用于读取底层字段代码,Result / DisplayResult 用于读取上一次计算的值,Update() 用于重新计算值,Unlink() 用于将字段替换为其静态结果,Remove() 用于删除它。使用 DocumentBuilder.InsertField(fieldCode) 插入文档信息字段——例如字段代码为 AUTHOR 或 DOCPROPERTY "Company"——或使用 InsertField(fieldType, updateField) 重载,并提供如 FieldType 的值,例如 FieldType.FieldAuthor、FieldType.FieldComments 或 FieldType.FieldDocProperty。
因为 FieldDocProperty 会读取其绑定的任何文档属性,修改底层的 BuiltInDocumentProperties 或 CustomDocumentProperties 值后再调用 Update()——或者使用 Document.UpdateFields() 一次性刷新文档中的所有字段——即可将新值传播到字段的显示结果中。
提示与最佳实践
- 在保存之前设置内置属性,如
Title、Author和Subject——Word 以及其他使用方会从BuiltInDocumentProperties中读取这些属性,用于文档列表和搜索索引。 - 在调用特定的转换助手(
ToInt()、ToDateTime()等)之前,使用DocumentProperty.Type检查属性的PropertyType,以避免对非自己创建的属性出现转换不匹配。 AddLinkToContent()使自定义属性与文档内容(例如书签范围)保持同步,而非固定值——当属性应始终反映文档当前内容时使用它。- 在更改文档属性后调用
Document.UpdateFields(),这样文档正文中已有的FieldDocProperty、FieldAuthor或FieldComments字段即可获取新值。 BuiltInDocumentProperties和CustomDocumentProperties都可以在PlainTextDocument以及Document上使用,因此即使加载的内容是纯文本,元数据也能往返传递。
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
索引器对自定义属性返回 null | 该属性尚未添加 | 首先调用 CustomDocumentProperties.Add(name, value),或在读取前检查 Contains(name) |
更改属性后,FieldDocProperty 显示过期值 | 字段未刷新 | 对该字段调用 Update(),或使用 Document.UpdateFields() 刷新文档中的所有字段 |
DocumentProperty.ToInt() / ToDateTime() 抛出 | 属性的实际 Type 与请求的转换不匹配 | 在选择调用哪个转换帮助器之前,请检查 DocumentProperty.Type |
FAQ
内置文档属性和自定义文档属性有什么区别?
内置属性(Document.BuiltInDocumentProperties)是由 OOXML 格式定义的固定集合——Author、Title、Pages 等。自定义属性(Document.CustomDocumentProperties)是通过 Add() 添加的开放式、由应用程序定义的名称/值对集合。
如何让自定义属性跟踪文档内容而不是固定值?
使用 CustomDocumentProperties.AddLinkToContent(name, linkSource),它将属性的值链接到文档中的书签或范围,而不是存储静态值。
更新文档属性会自动更新显示该属性的字段吗?
不——在特定字段上调用 Update(),或调用 Document.UpdateFields() 以重新计算文档中的每个字段,包括 FieldDocProperty、FieldAuthor 和 FieldComments 实例。
我可以从纯文本文档读取文档属性吗?
是的。PlainTextDocument 暴露与 Document 相同的 BuiltInDocumentProperties 和 CustomDocumentProperties 属性。
API Reference 摘要
| 类 / 方法 | 描述 |
|---|---|
Document.BuiltInDocumentProperties | 标准 OOXML 元数据集合(Author、Title、Pages 等) |
Document.CustomDocumentProperties | 应用程序定义的名称/值属性集合 |
CustomDocumentProperties.Add() / 按名称的索引器 / AddLinkToContent() | 添加、检索或内容链接自定义属性 |
DocumentProperty | 单个属性条目; Value, Type,以及 ToString()/ToInt()/ToDouble()/ToDateTime()/ToBool()/ToByteArray() 转换助手 |
FieldAuthor / FieldComments / FieldDocProperty | AUTHOR, COMMENTS,和 DOCPROPERTY 字段; Update(), Result, GetFieldCode() |
DocumentBuilder.InsertField() | 通过字段代码或 FieldType 插入字段 |