C# 解析 Word 超链接:字段识别、屏幕提示读取
一、方案概述在 Word 文档中超链接以字段Field的形式存储。每个超链接字段包含两个核心部分显示文本Anchor Text用户在文档中看到的可点击文字URL 地址超链接指向的目标地址读取超链接的基本思路是 1.加载 Word 文档 2. 遍历文档的所有节Section和段落Paragraph 3. 检查每个子对象是否为Field类型 4. 再进一步判断其Type是否为FieldType.FieldHyperlink5. 最后提取链接地址、显示文本二、环境准备1. 组件引入通过 NuGet 包管理器安装FreeSpire.Doc包或在程序包管理器控制台执行Install-Package FreeSpire.Doc说明该免费版本存在页面数量限制适合小规模文档处理场景2. 命名空间引用using Spire.Doc; using Spire.Doc.Documents; using Spire.Doc.Fields; using System.Collections.Generic; using System.IO; using System.Text;三、完整代码示例以下代码演示了如何读取 Word 文档中的所有超链接提取其显示文本和 URL并将结果保存到文本文件using Spire.Doc; using Spire.Doc.Documents; using Spire.Doc.Fields; using System.Collections.Generic; using System.IO; using System.Text; namespace ExtractHyperlinks { class Program { static void Main(string[] args) { // 1. 创建 Document 实例并加载 Word 文档 Document doc new Document(); doc.LoadFromFile(sample.docx); // 2. 创建列表存储超链接 ListField hyperlinks new ListField(); // 3. 遍历文档的所有节 foreach (Section section in doc.Sections) { // 遍历节中的所有子对象 foreach (DocumentObject secObj in section.Body.ChildObjects) { // 判断是否为段落 if (secObj.DocumentObjectType DocumentObjectType.Paragraph) { Paragraph paragraph secObj as Paragraph; // 遍历段落中的所有子对象 foreach (DocumentObject paraObj in paragraph.ChildObjects) { // 判断是否为 Field 类型 if (paraObj.DocumentObjectType DocumentObjectType.Field) { Field field paraObj as Field; // 判断是否为超链接字段 if (field.Type FieldType.FieldHyperlink) { hyperlinks.Add(field); } } } } } } // 4. 输出超链接信息 StringBuilder sb new StringBuilder(); foreach (Field hyperlink in hyperlinks) { sb.AppendLine(显示文本 hyperlink.FieldText); sb.AppendLine(URL地址 hyperlink.Code); sb.AppendLine(); } File.WriteAllText(Hyperlinks.txt, sb.ToString()); doc.Close(); } } }四、进阶提取屏幕提示ScreenTip部分超链接还包含屏幕提示鼠标悬停时显示的文本。通过解析字段代码Field Code可以提取这一信息。字段代码的典型格式如下超链接类型字段代码示例标准超链接HYPERLINK https://www.example.com带屏幕提示的超链接HYPERLINK https://www.example.com \o ScreenTip提取屏幕提示的代码片段// 获取显示文本 string anchorText field.FieldText; // 获取完整字段代码 string fieldCode field.GetFieldCode(); // 提取 URL位于第一对引号中 string url fieldCode.Split()[1]; // 检查是否包含屏幕提示\o 参数 string screenTip string.Empty; if (fieldCode.Contains(\o)) { screenTip fieldCode.Split()[3].Trim(); }五、注意事项文档格式兼容性Free Spire.Doc for .NET 支持.doc和.docx两种格式代码无需针对不同格式做特殊处理。嵌套结构Word 文档的对象模型是层级结构Document → Section → Paragraph → 子对象遍历时需要