MemoryLeak
MemoryLeak

Reputation: 525

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?

Upvotes: 2

Views: 2027

Answers (1)

Maxime Porté
Maxime Porté

Reputation: 1074

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

Upvotes: 3

Related Questions