• <menu id="w2i4a"></menu>
  • logo Aspose.Words使用教程

    文檔首頁>>Aspose.Words使用教程>>Aspose.Words for .NET如何替換或修改超鏈接

    Aspose.Words for .NET如何替換或修改超鏈接


    在當(dāng)前版本,沒有在Aspose.Words嵌入功能來處理超鏈接字段。

    超鏈接在Microsoft Word文檔是字段,一個字段包含字段代碼和字段結(jié)果,在當(dāng)前版本的Aspose.Words中,沒有單一的對象代表了一個字段。

    以下這個例子展示了如何創(chuàng)建一個簡單的類,它代表一個文檔中的超鏈接。它的構(gòu)造函數(shù)接受一個FieldStart對象,這個對象必須有FieldType.FieldHyperlink類型。使用超鏈接類后,您可以獲取或設(shè)置跳轉(zhuǎn)目標(biāo)地址,名字和IsLocal屬性?,F(xiàn)在很容易在整個文檔改變超鏈接目標(biāo)和名稱。在這個例子中,所有的超鏈接都改為“http://aspose.com”。

    Example

    找到一個Word文檔所有超鏈接和改變他們的URL和顯示名稱。

    C#

    using System;
    using System.Text;
    using System.Text.RegularExpressions;
    using Aspose.Words;
    using Aspose.Words.Fields;
    
    namespace Examples
    {
    /// <summary>
    /// Shows how to replace hyperlinks in a Word document.
    /// </summary>
    public class ExReplaceHyperlinks : ExBase
    {
    /// <summary>
    /// Finds all hyperlinks in a Word document and changes their URL and display name.
    /// </summary>
    public void ReplaceHyperlinks()
    {
    // Specify your document name here.
    Document doc = new Document(MyDir + "ReplaceHyperlinks.doc");
    
    // Hyperlinks in a Word documents are fields, select all field start nodes so we can find the hyperlinks.
    NodeList fieldStarts = doc.SelectNodes("//FieldStart");
    foreach (FieldStart fieldStart in fieldStarts)
    {
    if (fieldStart.FieldType.Equals(FieldType.FieldHyperlink))
    {
    // The field is a hyperlink field, use the "facade" class to help to deal with the field.
    Hyperlink hyperlink = new Hyperlink(fieldStart);
    
    // Some hyperlinks can be local (links to bookmarks inside the document), ignore these.
    if (hyperlink.IsLocal)
    continue;
    
    // The Hyperlink class allows to set the target URL and the display name
    // of the link easily by setting the properties.
    hyperlink.Target = NewUrl;
    hyperlink.Name = NewName;
    }
    }
    
    doc.Save(MyDir + "ReplaceHyperlinks Out.doc");
    }
    
    private const string NewUrl = @"http://www.aspose.com";
    private const string NewName = "Aspose - The .NET & Java Component Publisher";
    }
    
    /// <summary>
    /// This "facade" class makes it easier to work with a hyperlink field in a Word document.
    ///
    /// A hyperlink is represented by a HYPERLINK field in a Word document. A field in Aspose.Words
    /// consists of several nodes and it might be difficult to work with all those nodes directly.
    /// Note this is a simple implementation and will work only if the hyperlink code and name
    /// each consist of one Run only.
    ///
    /// [FieldStart][Run - field code][FieldSeparator][Run - field result][FieldEnd]
    ///
    /// The field code contains a string in one of these formats:
    /// HYPERLINK "url"
    /// HYPERLINK \l "bookmark name"
    ///
    /// The field result contains text that is displayed to the user.
    /// </summary>
    internal class Hyperlink
    {
    internal Hyperlink(FieldStart fieldStart)
    {
    if (fieldStart == null)
    throw new ArgumentNullException("fieldStart");
    if (!fieldStart.FieldType.Equals(FieldType.FieldHyperlink))
    throw new ArgumentException("Field start type must be FieldHyperlink.");
    
    mFieldStart = fieldStart;
    
    // Find the field separator node.
    mFieldSeparator = fieldStart.GetField().Separator;
    if (mFieldSeparator == null)
    throw new InvalidOperationException("Cannot find field separator.");
    
    mFieldEnd = fieldStart.GetField().End;
    
    // Field code looks something like [ HYPERLINK "http:\\www.myurl.com" ], but it can consist of several runs.
    string fieldCode = fieldStart.GetField().GetFieldCode();
    Match match = gRegex.Match(fieldCode.Trim());
    mIsLocal = (match.Groups[1].Length > 0); //The link is local if \l is present in the field code.
    mTarget = match.Groups[2].Value;
    }
    
    /// <summary>
    /// Gets or sets the display name of the hyperlink.
    /// </summary>
    internal string Name
    {
    get
    {
    return GetTextSameParent(mFieldSeparator, mFieldEnd);
    }
    set
    {
    // Hyperlink display name is stored in the field result which is a Run
    // node between field separator and field end.
    Run fieldResult = (Run)mFieldSeparator.NextSibling;
    fieldResult.Text = value;
    
    // But sometimes the field result can consist of more than one run, delete these runs.
    RemoveSameParent(fieldResult.NextSibling, mFieldEnd);
    }
    }
    
    /// <summary>
    /// Gets or sets the target url or bookmark name of the hyperlink.
    /// </summary>
    internal string Target
    {
    get
    {
    string dummy = null; // This is needed to fool the C# to VB.NET converter.
    return mTarget;
    }
    set
    {
    mTarget = value;
    UpdateFieldCode();
    }
    }
    
    /// <summary>
    /// True if the hyperlink's target is a bookmark inside the document. False if the hyperlink is a url.
    /// </summary>
    internal bool IsLocal
    {
    get
    {
    return mIsLocal;
    }
    set
    {
    mIsLocal = value;
    UpdateFieldCode();
    }
    }
    
    private void UpdateFieldCode()
    {
    // Field code is stored in a Run node between field start and field separator.
    Run fieldCode = (Run)mFieldStart.NextSibling;
    fieldCode.Text = string.Format("HYPERLINK {0}\"{1}\"", ((mIsLocal) ? "\\l " : ""), mTarget);
    
    // But sometimes the field code can consist of more than one run, delete these runs.
    RemoveSameParent(fieldCode.NextSibling, mFieldSeparator);
    }
    
    /// <summary>
    /// Retrieves text from start up to but not including the end node.
    /// </summary>
    private static string GetTextSameParent(Node startNode, Node endNode)
    {
    if ((endNode != null) && (startNode.ParentNode != endNode.ParentNode))
    throw new ArgumentException("Start and end nodes are expected to have the same parent.");
    
    StringBuilder builder = new StringBuilder();
    for (Node child = startNode; !child.Equals(endNode); child = child.NextSibling)
    builder.Append(child.GetText());
    
    return builder.ToString();
    }
    
    /// <summary>
    /// Removes nodes from start up to but not including the end node.
    /// Start and end are assumed to have the same parent.
    /// </summary>
    private static void RemoveSameParent(Node startNode, Node endNode)
    {
    if ((endNode != null) && (startNode.ParentNode != endNode.ParentNode))
    throw new ArgumentException("Start and end nodes are expected to have the same parent.");
    
    Node curChild = startNode;
    while ((curChild != null) && (curChild != endNode))
    {
    Node nextChild = curChild.NextSibling;
    curChild.Remove();
    curChild = nextChild;
    }
    }
    
    private readonly Node mFieldStart;
    private readonly Node mFieldSeparator;
    private readonly Node mFieldEnd;
    private bool mIsLocal;
    private string mTarget;
    
    /// <summary>
    /// RK I am notoriously bad at regexes. It seems I don't understand their way of thinking.
    /// </summary>
    private static readonly Regex gRegex = new Regex(
    "\\S+" + // one or more non spaces HYPERLINK or other word in other languages
    "\\s+" + // one or more spaces
    "(?:\"\"\\s+)?" + // non capturing optional "" and one or more spaces, found in one of the customers files.
    "(\\\\l\\s+)?" + // optional \l flag followed by one or more spaces
    "\"" + // one apostrophe
    
    );
    }
    }

    Visual Basic

    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Text
    Imports System.Text.RegularExpressions
    Imports Aspose.Words
    Imports Aspose.Words.Fields
    
    Namespace Examples
    ''' <summary>
    ''' Shows how to replace hyperlinks in a Word document.
    ''' </summary>
    <TestFixture> _
    Public Class ExReplaceHyperlinks
    Inherits ExBase
    ''' <summary>
    ''' Finds all hyperlinks in a Word document and changes their URL and display name.
    ''' </summary>
    <Test> _
    Public Sub ReplaceHyperlinks()
    ' Specify your document name here.
    Dim doc As New Document(MyDir & "ReplaceHyperlinks.doc")
    
    ' Hyperlinks in a Word documents are fields, select all field start nodes so we can find the hyperlinks.
    Dim fieldStarts As NodeList = doc.SelectNodes("//FieldStart")
    For Each fieldStart As FieldStart In fieldStarts
    If fieldStart.FieldType.Equals(FieldType.FieldHyperlink) Then
    ' The field is a hyperlink field, use the "facade" class to help to deal with the field.
    Dim hyperlink As New Hyperlink(fieldStart)
    
    ' Some hyperlinks can be local (links to bookmarks inside the document), ignore these.
    If hyperlink.IsLocal Then
    Continue For
    End If
    
    ' The Hyperlink class allows to set the target URL and the display name
    ' of the link easily by setting the properties.
    hyperlink.Target = NewUrl
    hyperlink.Name = NewName
    End If
    Next fieldStart
    
    doc.Save(MyDir & "ReplaceHyperlinks Out.doc")
    End Sub
    
    Private Const NewUrl As String = "http://www.aspose.com"
    Private Const NewName As String = "Aspose - The .NET & Java Component Publisher"
    End Class
    
    ''' <summary>
    ''' This "facade" class makes it easier to work with a hyperlink field in a Word document.
    '''
    ''' A hyperlink is represented by a HYPERLINK field in a Word document. A field in Aspose.Words
    ''' consists of several nodes and it might be difficult to work with all those nodes directly.
    ''' Note this is a simple implementation and will work only if the hyperlink code and name
    ''' each consist of one Run only.
    '''
    ''' [FieldStart][Run - field code][FieldSeparator][Run - field result][FieldEnd]
    '''
    ''' The field code contains a string in one of these formats:
    ''' HYPERLINK "url"
    ''' HYPERLINK \l "bookmark name"
    '''
    ''' The field result contains text that is displayed to the user.
    ''' </summary>
    Friend Class Hyperlink
    Friend Sub New(ByVal fieldStart As FieldStart)
    If fieldStart Is Nothing Then
    Throw New ArgumentNullException("fieldStart")
    End If
    If (Not fieldStart.FieldType.Equals(FieldType.FieldHyperlink)) Then
    Throw New ArgumentException("Field start type must be FieldHyperlink.")
    End If
    
    mFieldStart = fieldStart
    
    ' Find the field separator node.
    mFieldSeparator = fieldStart.GetField().Separator
    If mFieldSeparator Is Nothing Then
    Throw New InvalidOperationException("Cannot find field separator.")
    End If
    
    mFieldEnd = fieldStart.GetField().End
    
    ' Field code looks something like [ HYPERLINK "http:\\www.myurl.com" ], but it can consist of several runs.
    Dim fieldCode As String = fieldStart.GetField().GetFieldCode()
    Dim match As Match = gRegex.Match(fieldCode.Trim())
    mIsLocal = (match.Groups(1).Length > 0) 'The link is local if \l is present in the field code.
    mTarget = match.Groups(2).Value
    End Sub
    
    ''' <summary>
    ''' Gets or sets the display name of the hyperlink.
    ''' </summary>
    Friend Property Name() As String
    Get
    Return GetTextSameParent(mFieldSeparator, mFieldEnd)
    End Get
    Set(ByVal value As String)
    ' Hyperlink display name is stored in the field result which is a Run
    ' node between field separator and field end.
    Dim fieldResult As Run = CType(mFieldSeparator.NextSibling, Run)
    fieldResult.Text = value
    
    ' But sometimes the field result can consist of more than one run, delete these runs.
    RemoveSameParent(fieldResult.NextSibling, mFieldEnd)
    End Set
    End Property
    
    ''' <summary>
    ''' Gets or sets the target url or bookmark name of the hyperlink.
    ''' </summary>
    Friend Property Target() As String
    Get
    Dim dummy As String = Nothing ' This is needed to fool the C# to VB.NET converter.
    Return mTarget
    End Get
    Set(ByVal value As String)
    mTarget = value
    UpdateFieldCode()
    End Set
    End Property
    
    ''' <summary>
    ''' True if the hyperlink's target is a bookmark inside the document. False if the hyperlink is a url.
    ''' </summary>
    Friend Property IsLocal() As Boolean
    Get
    Return mIsLocal
    End Get
    Set(ByVal value As Boolean)
    mIsLocal = value
    UpdateFieldCode()
    End Set
    End Property
    
    Private Sub UpdateFieldCode()
    ' Field code is stored in a Run node between field start and field separator.
    Dim fieldCode As Run = CType(mFieldStart.NextSibling, Run)
    fieldCode.Text = String.Format("HYPERLINK {0}""{1}""", (If((mIsLocal), "\l ", "")), mTarget)
    
    ' But sometimes the field code can consist of more than one run, delete these runs.
    RemoveSameParent(fieldCode.NextSibling, mFieldSeparator)
    End Sub
    
    ''' <summary>
    ''' Retrieves text from start up to but not including the end node.
    ''' </summary>
    Private Shared Function GetTextSameParent(ByVal startNode As Node, ByVal endNode As Node) As String
    If (endNode IsNot Nothing) AndAlso (startNode.ParentNode IsNot endNode.ParentNode) Then
    Throw New ArgumentException("Start and end nodes are expected to have the same parent.")
    End If
    
    Dim builder As New StringBuilder()
    Dim child As Node = startNode
    Do While Not child.Equals(endNode)
    builder.Append(child.GetText())
    child = child.NextSibling
    Loop
    
    Return builder.ToString()
    End Function
    
    ''' <summary>
    ''' Removes nodes from start up to but not including the end node.
    ''' Start and end are assumed to have the same parent.
    ''' </summary>
    Private Shared Sub RemoveSameParent(ByVal startNode As Node, ByVal endNode As Node)
    If (endNode IsNot Nothing) AndAlso (startNode.ParentNode IsNot endNode.ParentNode) Then
    Throw New ArgumentException("Start and end nodes are expected to have the same parent.")
    End If
    
    Dim curChild As Node = startNode
    Do While (curChild IsNot Nothing) AndAlso (curChild IsNot endNode)
    Dim nextChild As Node = curChild.NextSibling
    curChild.Remove()
    curChild = nextChild
    Loop
    End Sub
    
    Private ReadOnly mFieldStart As Node
    Private ReadOnly mFieldSeparator As Node
    Private ReadOnly mFieldEnd As Node
    Private mIsLocal As Boolean
    Private mTarget As String
    
    ''' <summary>
    ''' RK I am notoriously bad at regexes. It seems I don't understand their way of thinking.
    ''' </summary>
    Private Shared ReadOnly gRegex As New Regex("\S+" & "\s+" & "(?:""""\s+)?" & "(\\l\s+)?" & """" & "([^""]+)" & """" )
    End Class
    End Namespace

    下載最新版Aspose.Words

     

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();