Search code examples
c#openxmlword-2010

How to attach a new bookmark to an existing paragraph in word 2010 using OpenXml?


In word document, I want to set bookmark to all paragraphs whose style is "Heading 1".

How do I insert a new bookmark to an existing paragraph using OpenXml?


Solution

  • To do this you have to:

    1. Find all Paragraph
    2. Check if the paragraph is a title with Heading1 (you have to check the existence of a paragraphStyleId () Inside a ParagraphProperties ( ... )
    3. If it's a paragraph with Heading1 style, insert your bookmark.

    You should be able to do this with a code like

            int bookmarkId = 0;
            // MyDocuments.Body is a WordProcessDocument.MainDocumentPart.Document.Body
            foreach(Paragraph para in MyDocuments.Body.Descendants<Paragraph>())
            {
                // if the paragraph has no properties or has properties but no pStyle, it's not a "Heading1"
                ParagraphProperties pPr = para.GetFirstChild<ParagraphProperties>();
                if (pPr == null || pPr.GetFirstChild<ParagraphStyleId>() == null) continue;
                // if the value of the pStyle is not Heading1 => skip the paragraph
                if (pPr.GetFirstChild<ParagraphStyleId>().Val != "Heading1") continue;
    
                // it's a paragraph with Heading1 style, insert the bookmark
    
                // the bookmark must have a start and an end
                // the bookmarkstart/end share the same id
                BookmarkStart bms = new BookmarkStart() { Name = "yourbookmarkname", Id = bookmarkId.ToString() };
                BookmarkEnd bme = new BookmarkEnd() { Id = bookmarkId.ToString() };
                ++bookmarkId;
    
                // Insertion of bookmarkstart after the paragraphProperties
                pPr.InsertAfterSelf(bms);
    
                // The bookmarkend can be inserted after the bookmarkstart or after the object the bookmark must surrounding
                // here we will insert it after bms. If you want to surround an object, find the object within the paragraph and insert it after
                bms.InsertAfterSelf(bme);
    

    More informations about the Bookmark classes here : https://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.bookmarkstart(v=office.14).aspx