1
votes

I'm trying to add a hyperlink that links to a heading inside the same word document.

This is my code so far:

  1. First I add the hyperlink

    Paragraph p = new Paragraph();
    Hyperlink h = new Hyperlink(){ Anchor = new StringValue("_Link") };
    Run r = new Run();
    RunProperties rp = new RunProperties(){ Val = "Hyperlink" };
    Text t = new Text("Click here");
    
    r.Append(rp);
    r.Append(t);
    p.Append(r);
    body.Append(p);
    
  2. Then I add the Heading (with the necessary Bookmark)

    Paragraph p = new Paragraph();
    Run r = new Run(new Text("My Heading"));
    ParagraphProperties pp = new ParagraphProperties();
    ParagraphStyleId psi = new ParagraphStyleId(){ Val = new StringValue("Heading1") };
    
    p.Append(r);
    p.Append(pp);
    p.Append(psi);
    p.Append(new BookmarkStart() { Name = new StringValue("_Link") };
    p.Append(new BookmarkEnd());
    body.Append(p);
    

I don't see what I'm missing. I set the anchor in the hyperlink, that should link to the Heading with a Bookmark which holds the equal name. (Anchor from hyperlink == Name from Bookmark in Heading).

Or do I need to add a HyperLinkRelationship to MainDocumentPart.HyperlinkRelationship, like I've to do when I want to add a hyperlink with an URI to a website?

3
Create a simple Word document that has the type of link you want. Open it in the Open XML SDK Productivity Tool and see how Word does it.Cindy Meister
Thanks for the hint. But that's what I did already and why I came up with my present code. I guess, I will analyse it again, maybe see this time what I missed before.tschan

3 Answers

1
votes

You are adding header as a paragraph to the body instead, you need to create the header part -

HeaderPart headerPart = mainDocumentPart.AddNewPart<HeaderPart>();

string headerPartId = mainDocumentPart.GetIdOfPart(headerPart);

GenerateHeaderPartContent(headerPart);

And the code for GenerateHeaderPartContent

 private void GeneratePartContent(HeaderPart part)
        {
            Header header1 = new Header(){ MCAttributes = new MarkupCompatibilityAttributes(){ Ignorable = "w14 w15 wp14" }  };
            header1.AddNamespaceDeclaration("wpc", "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas");
            header1.AddNamespaceDeclaration("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
            header1.AddNamespaceDeclaration("o", "urn:schemas-microsoft-com:office:office");
            header1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
            header1.AddNamespaceDeclaration("m", "http://schemas.openxmlformats.org/officeDocument/2006/math");
            header1.AddNamespaceDeclaration("v", "urn:schemas-microsoft-com:vml");
            header1.AddNamespaceDeclaration("wp14", "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing");
            header1.AddNamespaceDeclaration("wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing");
            header1.AddNamespaceDeclaration("w10", "urn:schemas-microsoft-com:office:word");
            header1.AddNamespaceDeclaration("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
            header1.AddNamespaceDeclaration("w14", "http://schemas.microsoft.com/office/word/2010/wordml");
            header1.AddNamespaceDeclaration("w15", "http://schemas.microsoft.com/office/word/2012/wordml");
            header1.AddNamespaceDeclaration("wpg", "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup");
            header1.AddNamespaceDeclaration("wpi", "http://schemas.microsoft.com/office/word/2010/wordprocessingInk");
            header1.AddNamespaceDeclaration("wne", "http://schemas.microsoft.com/office/word/2006/wordml");
            header1.AddNamespaceDeclaration("wps", "http://schemas.microsoft.com/office/word/2010/wordprocessingShape");

            Paragraph paragraph1 = new Paragraph(){ RsidParagraphAddition = "00225DC9", RsidRunAdditionDefault = "00225DC9" };

            ParagraphProperties paragraphProperties1 = new ParagraphProperties();
            ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId(){ Val = "Header" };

            paragraphProperties1.Append(paragraphStyleId1);
            BookmarkStart bookmarkStart1 = new BookmarkStart(){ Name = "HeadingBookmark", Id = "1" };

            Run run1 = new Run();
            Text text1 = new Text();
            text1.Text = "Test";

            run1.Append(text1);

            paragraph1.Append(paragraphProperties1);
            paragraph1.Append(bookmarkStart1);
            paragraph1.Append(run1);
            BookmarkEnd bookmarkEnd1 = new BookmarkEnd(){ Id = "1" };


            header1.Append(paragraph1);
            header1.Append(bookmarkEnd1);


            part.Header = header1;
        }

Once the header part is ready, add it to your documents section properties -

HeaderReference headerReference1 = new HeaderReference(){ Type = HeaderFooterValues.Default, Id = headerPartId  };

Also a good ref to check - https://msdn.microsoft.com/en-us/library/office/cc546917.aspx

1
votes

For open XML (snippet)

        // Your new paragraph with the hyperlink
        Paragraph hyperlinkParagraph = new Paragraph();

        // Run for the hyperlink
        Run hyperlinkRun = new Run();

        // Styling for the hyperlink
        RunProperties runPropertiesHyperLink = new RunProperties(
            new RunStyle { Val = "Hyperlink", },
            new Underline { Val = UnderlineValues.Single },
            new Color { ThemeColor = ThemeColorValues.Hyperlink });

        // Actual hyperlink
        Hyperlink xmlHyperLink = new Hyperlink()
        {
            Anchor = "https://stackoverflow.com",
            DocLocation = "https://stackoverflow.com"
        };
        // Text that you see to click on
        Text hyperLinkText = new Text("Click for going to StackOverflow!");

        // Apply the styling in this order to the run
        hyperlinkRun.Append(runPropertiesHyperLink);
        hyperlinkRun.Append(hyperLinkText);
        // Now add the run to the hyperlink
        xmlHyperLink.Append(hyperlinkRun);
        // Add the hyperlink to the paragraph
        hyperlinkParagraph.Append(xmlHyperLink);

        // Add paragraph to the body
        _mainBody.Append(hyperlinkParagraph );
-2
votes

DocIO is a .NET library that can read, write, modify and render Microsoft Word documents. Using DocIO, you can able to add Bookmarks and hyperlinks very easily. You don't have to worry about where hyperlink is present (either in header or footer or document body) and decide where to add the reference.

The whole suite of controls is available for free (commercial applications also) through the community license program if you qualify. The community license is the full product with no limitations or watermarks.

Step 1: Create a console application
Step 2: Add reference to these 3 assemblies (Syncfusion.DocIO.Base, Syncfusion.Compression.Base and Syncfusion.OfficeChart.Base). You can also able to add these references through NuGet
Step 3: Copy & paste the below code snippet which open an existing Word document, replace contents and save it back as Word document.

using Syncfusion.DocIO.DLS;
using Syncfusion.DocIO;
namespace DocIO_HyperlinkinkToBookmark
{
   class Program
   {
       static void Main(string[] args)
       {
           using (WordDocument document = new WordDocument())
           {
               document.EnsureMinimal();
               IWSection section = document.LastSection;
               IWParagraph paragraph = document.LastParagraph;
               //add text enclosed by BookmarkStart and BookmarkEnd into a paragraph
               paragraph.AppendBookmarkStart("Title1Mark");
               paragraph.AppendText("Title paragraph");
               paragraph.AppendBookmarkEnd("Title1Mark");
               //Add few paragraph of textual data
               for (int i = 0; i < 10; i++)
                   section.AddParagraph().AppendText("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
               paragraph = section.AddParagraph();
               //Add a hyperlink with the specified display text and targets to Bookmark named "Title1Mark"
               paragraph.AppendHyperlink("Title1Mark", "Link to Title", HyperlinkType.Bookmark);
               document.Save("output.docx", FormatType.Docx);
           }
       }
    }
}

For further information about DocIO, please refer our help documentation

Note: I work for Syncfusion