Word 文書を扱う際、ハイパーリンクを一括抽出することは実用的な用途が多くあります。技術文書や製品マニュアルから手動で URL を抽出するのは非効率であり、抜けや誤りが発生しやすいです。これを解決するため、本記事では C# を使用し、文書要素を解析することでハイパーリンクのアンカーテキスト、対応する URL、およびヒントを正確に抽出する自動化ソリューションを紹介します。抽出したハイパーリンクデータは、データ分析、SEO 最適化などの用途に活用できます。
以下のセクションでは、Spire.Doc for .NET を使用して C# で Word 文書からハイパーリンクを抽出する方法を解説します。
Spire.Doc for .NET をインストールします
まず、Spire.Doc for .NET パッケージに含まれている DLL ファイルを .NET プロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。
PM> Install-Package Spire.Doc
C# で Word 文書内のすべてのハイパーリンクを抽出する
Word 文書では、ハイパーリンクはフィールドとして格納されています。これを抽出するには、まずすべてのフィールドオブジェクトを特定し、それぞれのオブジェクトが Field クラスのインスタンスであるかを確認します。その後、Field オブジェクトの Type プロパティが FieldType.FieldHyperlink に等しいかをチェックすることで、ハイパーリンクフィールドを抽出できます。
ハイパーリンクを特定した後、Field.FieldText プロパティを使用してハイパーリンクのアンカーテキストを取得し、Field.GetFieldCode() メソッドを使用して以下の形式のフィールドコードを取得できます。
ハイパーリンクの種類 | フィールドコードの例 |
標準ハイパーリンク | HYPERLINK "https://www.example.com/example" |
ヒント付きハイパーリンク | HYPERLINK "https://www.example.com/example" \o "ScreenTip" |
フィールドコードを解析することで、ハイパーリンクの URL とヒントのテキストを取得でき、完全なハイパーリンク情報を抽出できます。
C# を使用して Word 文書からすべてのハイパーリンクを抽出する手順
- Document オブジェクトを作成し、Document.LoadFromFile() メソッドを使用して対象の Word 文書を読み込みます。
- foreach (Section section in doc.Sections) を使用して、文書内のすべてのセクションを反復処理し、各 Section オブジェクトを取得します。
- 各セクションの子オブジェクトを foreach (DocumentObject secObj in section.Body.ChildObjects) で反復処理し、個々の要素にアクセスします。
- 子オブジェクトが Paragraph 型の場合:
- 段落内の子オブジェクトを foreach (DocumentObject paraObj in paragraph.ChildObjects) で反復処理します。
- 段落の子オブジェクトが Field 型であり、その Field.Type プロパティの値が FieldType.FieldHyperlink に等しい場合、Field オブジェクトを処理します。
- 各 Field オブジェクトに対して:
- Field.FieldText プロパティを使用してアンカーテキストを抽出します。
- Field.GetFieldCode() メソッドを使用してフィールドコード文字列を取得します。
- フィールドコード文字列を解析します:
- "HYPERLINK" の後にある二重引用符内の URL を抽出します。
- フィールドコードに \o パラメータが含まれているかを確認し、存在する場合は二重引用符内のヒントテキストを抽出します。
- 抽出したハイパーリンクを保存し、出力ファイルに書き込みます。
- C#
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
namespace ExtractWordHyperlink
{
class Program
{
static void Main(string[] args)
{
// ドキュメントのインスタンスを作成
Document doc = new Document();
// Word ドキュメントを読み込む
doc.LoadFromFile("Sample.docx");
// ハイパーリンク情報を格納するための文字列リストを作成
List<string> hyperlinkInfoList = new List<string>();
// ドキュメント内のセクションを反復処理
foreach (Section section in doc.Sections)
{
// セクション内の子オブジェクトを反復処理
foreach (DocumentObject secObj in section.Body.ChildObjects)
{
// 現在のドキュメントオブジェクトが段落インスタンスか確認
if (secObj is Paragraph paragraph)
{
// 段落内の子オブジェクトを反復処理
foreach (DocumentObject paraObj in paragraph.ChildObjects)
{
// 現在の子オブジェクトがフィールドか確認
if (paraObj is Field field && field.Type == FieldType.FieldHyperlink)
{
string hyperlinkInfo = "";
// アンカーテキストを取得
string anchorText = field.FieldText;
// フィールドコードを取得
string fieldCode = field.GetFieldCode();
// フィールドコードからURLを取得
string url = fieldCode.Split('"')[1];
// ScreenTip があるか確認
if (fieldCode.Contains("\\o"))
{
// ヒント テキストを取得
string screenTip = fieldCode.Split("\"")[3].Trim();
// 情報を統合
hyperlinkInfo += $"アンカーテキスト: {anchorText}\nURL: {url}\nヒント: {screenTip}";
}
else
{
hyperlinkInfo += $"アンカーテキスト: {anchorText}\nURL: {url}";
}
hyperlinkInfo += "\n";
// ハイパーリンク情報をリストに追加
hyperlinkInfoList.Add(hyperlinkInfo);
}
}
}
}
}
// 抽出したハイパーリンク情報をテキストファイルに書き込む
File.WriteAllLines("output/抽出したハイパーリンク.txt", hyperlinkInfoList);
doc.Close();
}
}
}
一時ライセンスを申請する
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。