C# 解析 Word 超链接:字段识别、屏幕提示读取
·
一、方案概述
在 Word 文档中,超链接以字段(Field) 的形式存储。每个超链接字段包含两个核心部分:
- 显示文本(Anchor Text) :用户在文档中看到的可点击文字
- URL 地址:超链接指向的目标地址
读取超链接的基本思路是: 1.加载 Word 文档 2. 遍历文档的所有节(Section)和段落(Paragraph) 3. 检查每个子对象是否为 Field 类型 4. 再进一步判断其 Type 是否为 FieldType.FieldHyperlink 5. 最后提取链接地址、显示文本
二、环境准备
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. 创建列表存储超链接
List<Field> hyperlinks = new List<Field>();
// 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 → 子对象),遍历时需要逐层深
更多推荐
所有评论(0)