如何在 .NET 中使用过渡字段
如何在 .NET 中使用过渡字段
Aspose.Words FOSS for .NET 代表一组较旧的 Word 字段类型——条码字段以及少量 pre-Open-XML 兼容字段——通过专用类在 the Aspose.Words.Fields 命名空间,非正式称为 transitional 字段在此。本指南展示了如何查找、读取和配置它们。每个过渡字段类都派生自 base Field 类型,同时还有通用的 generic Field object 由 Document.Range.Fields.
分步指南
步骤 1:在文档中查找过渡字段
遍历 Document.Range.Fields 并将每个字段的 Type(一个 FieldType 值)与相关常量——FieldBarcode、FieldDisplayBarcode、FieldMergeBarcode、FieldBidiOutline、FieldEQ、FieldFootnoteRef 或 FieldInfo——进行比较,然后将通用的 Field 强制转换为匹配的类以访问其特定属性。转换前务必检查 Type:将字段转换为错误的类会抛出 InvalidCastException。
步骤 2:配置 DISPLAYBARCODE 或 MERGEBARCODE 字段
FieldDisplayBarcode(DISPLAYBARCODE 字段)和 FieldMergeBarcode(MERGEBARCODE 字段,且实现了用于邮件合并的 IMergeFieldSurrogate)共享相同的一套条形码配置属性:BarcodeType、BarcodeValue、SymbolHeight、SymbolRotation、ScalingFactor、ForegroundColor、BackgroundColor、PosCodeStyle、CaseCodeStyle、ErrorCorrectionLevel、DisplayText、AddStartStopChar和FixCheckDigit。在字段实例上设置这些属性,然后调用 Update(),以便在保存文档之前让 Result 反映新的配置。
步骤 3:读取旧版条形码(邮政)字段数据
FieldBarcode 实现了较旧的 BARCODE 字段,该字段专门是美国邮政条形码(POSTNET)字段,而不是通用条形码——它不共享步骤 2 中的 BarcodeType/BarcodeValue 属性。相反,它公开了 PostalAddress(条形码编码的地址)、FacingIdentificationMark、IsUSPostalAddress 和 IsBookmark。在读取这些属性之前,请特别将 Field.Type 与 FieldType.FieldBarcode 对比,因为将 DISPLAYBARCODE 或 MERGEBARCODE 字段强制转换为 FieldBarcode 将不会暴露您期望的属性。
步骤 4:使用自定义生成器渲染条形码图像
此 FOSS 版携带条形码字段数据,但不包含条形码渲染引擎。BarcodeParameters 是一个直通容器,它将来自任一条形码字段系列的设置——步骤 2 中的 DISPLAYBARCODE/MERGEBARCODE 属性以及步骤 3 中的邮政属性——合并为一个交给渲染器的单一对象。实现 IBarcodeGenerator,公开 GetBarcodeImage(parameters) 和旧版的 GetOldBarcodeImage(parameters),以提供实际的图像渲染;如果未提供实现,条形码字段仅携带配置数据。
步骤 5:使用旧版兼容字段
另外还有四个类覆盖了仍然存在于旧版 .docx 文件中的旧字段代码。FieldBidiOutline 实现了用于从右到左大纲编号的 BIDIOUTLINE 字段,并且除了通用的 Field 表面外不公开任何属性。FieldEQ 实现了 EQ 方程字段,并额外公开 AsOfficeMath(),用于将其内容转换为 OfficeMath 对象——仅当字段实际编码了方程时才会成功。FieldFootnoteRef 实现了 FOOTNOTEREF 字段,该字段交叉引用脚注或尾注标记,同样除通用的 Field 表面外不公开属性。FieldInfo 实现了 INFO 字段,通过其 InfoType 和 NewValue 属性读取或写入文档摘要信息属性。
步骤 6:更新或冻结过渡字段的值
每个过渡字段类都会继承 GetFieldCode()(字段的底层代码文本)、Update()(重新计算结果)、Unlink()(将字段替换为其最后计算得到的静态文本),以及 Remove()(删除字段)。在更改任意字段的配置后调用 Update(),以使 Result 反映更改;当字段的当前值应被冻结而不再可重新计算时,使用 Unlink()。
常见问题与解决方案
InvalidCastException 在 casting a 时 Field 转换为 a transitional field class。 错误的 FieldType 被假设。检查 Field.Type 针对匹配项 FieldType 常量在转换之前。
A DISPLAYBARCODE/MERGEBARCODE 字段的属性在转换后缺失。 字段被转换为 FieldBarcode 而不是 FieldDisplayBarcode/FieldMergeBarcode (或相反) — 这些类暴露不同的属性集,尽管这三者都表示条形码数据。请确认 Field.Type 在强制转换之前。
条形码字段携带数据,但未渲染图像。 否 IBarcodeGenerator 已提供实现。请提供一个自定义生成器来实现 GetBarcodeImage(parameters) — 此版本不包含内置的条形码渲染引擎。
FieldEQ.AsOfficeMath() 返回意外的结果。 该字段不包含有效的方程指令。检查字段的 GetFieldCode() 在尝试转换之前检查输出。
FieldInfo在设置后,值未更新 NewValue. 更改后字段未刷新。Call Update() 在修改后对字段进行 NewValue.
常见问题
“transitional” 对这些字段类型意味着什么?
这不是官方的 Word 术语——它在本版的 Aspose.Words.Fields 命名空间中对字段类进行分组,这些类通过各自的强类型类实现旧的字段代码(barcode fields 和 pre-Open-XML 兼容字段),而不是仅通过通用的 Field 对象处理。
FieldBarcode 使用与 FieldDisplayBarcode 相同的属性吗?
不。FieldBarcode 实现了旧版的 BARCODE(postal/POSTNET)字段,并公开了 PostalAddress、FacingIdentificationMark、IsUSPostalAddress 和 IsBookmark。FieldDisplayBarcode 和 FieldMergeBarcode 共享一套不同的属性——BarcodeType、BarcodeValue、SymbolHeight 以及相关的渲染设置。
此版本会渲染条码图像吗?
不。FieldBarcode、FieldDisplayBarcode 和 FieldMergeBarcode 保存条码配置数据并公开 IBarcodeGenerator 接口,但此版本未随附条码渲染引擎——需要自定义的 IBarcodeGenerator 实现才能生成图像。
我可以将 EQ 字段转换为 OfficeMath 方程吗?
是的,通过 FieldEQ.AsOfficeMath(),前提是该字段的代码实际上编码了一个方程。
我如何在文档中找到所有过渡字段?
枚举 Document.Range.Fields 并将每个 Field.Type 与相应的 FieldType 常量 (FieldBarcode, FieldDisplayBarcode, FieldMergeBarcode, FieldBidiOutline, FieldEQ, FieldFootnoteRef, FieldInfo) 进行比较。