DEV Community

Allen Yang
Allen Yang

Posted on

Managing Word Document Bookmarks with Python

Managing Word Document Bookmarks with Python

When working with lengthy Word documents, bookmarks serve as a valuable navigation and positioning tool. Bookmarks allow developers to mark specific locations or content areas within a document, enabling quick access, content replacement, and dynamic document generation.

This article demonstrates how to perform various bookmark operations in Word documents using Python and the Spire.Doc for Python library, including creating bookmarks, extracting bookmark text, replacing bookmark content, inserting images and tables at bookmark positions, and deleting bookmarks.

Environment Setup

First, install the Spire.Doc for Python library:

pip install Spire.Doc
Enter fullscreen mode Exit fullscreen mode

Once installed, you can begin using bookmark-related APIs for Word document processing.

What Are Bookmarks and Their Use Cases

Bookmarks are a marking mechanism in Word documents that allow naming specific locations or content areas. Common use cases include:

  • Document Navigation: Add bookmarks to important chapters or paragraphs for quick user navigation
  • Template Filling: Predefine bookmarks in document templates and dynamically replace them with actual content during runtime
  • Content Extraction: Quickly extract content from specifically marked areas in documents
  • Dynamic Document Generation: Insert text, images, or tables at designated positions based on business requirements

Creating Bookmarks

Creating bookmarks is the most fundamental operation. In Spire.Doc, bookmarks can be defined using the AppendBookmarkStart and AppendBookmarkEnd methods to mark the start and end positions.

The following example demonstrates how to create simple bookmarks and nested bookmarks:

from spire.doc import *
from spire.doc.common import *

def CreateBookmarkInDocument():
    # Create a Word document
    document = Document()

    # Add a new section
    section = document.AddSection()

    # Add a title paragraph
    paragraph = section.AddParagraph()
    txtRange = paragraph.AppendText("The following example demonstrates how to create bookmarks in a Word document.")
    txtRange.CharacterFormat.Italic = True

    # Add a simple bookmark
    section.AddParagraph()
    paragraph = section.AddParagraph()
    txtRange = paragraph.AppendText("Simple Bookmark Example")
    txtRange.CharacterFormat.TextColor = Color.get_CornflowerBlue()
    paragraph.ApplyStyle(BuiltinStyle.Heading2)

    section.AddParagraph()
    paragraph = section.AddParagraph()
    paragraph.AppendBookmarkStart("SimpleBookmark")
    paragraph.AppendText("This is the content of a simple bookmark.")
    paragraph.AppendBookmarkEnd("SimpleBookmark")

    # Add nested bookmarks
    section.AddParagraph()
    paragraph = section.AddParagraph()
    txtRange = paragraph.AppendText("Nested Bookmark Example")
    txtRange.CharacterFormat.TextColor = Color.get_CornflowerBlue()
    paragraph.ApplyStyle(BuiltinStyle.Heading2)

    section.AddParagraph()
    paragraph = section.AddParagraph()
    paragraph.AppendBookmarkStart("Root")
    txtRange = paragraph.AppendText(" Root level content ")
    txtRange.CharacterFormat.Italic = True

    paragraph.AppendBookmarkStart("Level1")
    txtRange = paragraph.AppendText(" First level nested content ")
    txtRange.CharacterFormat.Italic = True
    txtRange.CharacterFormat.TextColor = Color.get_DarkSlateGray()

    paragraph.AppendBookmarkStart("Level2")
    txtRange = paragraph.AppendText(" Second level nested content ")
    txtRange.CharacterFormat.Italic = True
    txtRange.CharacterFormat.TextColor = Color.get_DimGray()
    paragraph.AppendBookmarkEnd("Level2")

    paragraph.AppendBookmarkEnd("Level1")
    paragraph.AppendBookmarkEnd("Root")

    # Save the document
    document.SaveToFile("CreateBookmark.docx", FileFormat.Docx)
    document.Close()

CreateBookmarkInDocument()
Enter fullscreen mode Exit fullscreen mode

Resulting document:

2026-05-09_170238.png

In the code above, the AppendBookmarkStart and AppendBookmarkEnd methods are used in pairs, identifying the bookmark range with the same bookmark name. Nested bookmarks allow other bookmarks to be contained within one bookmark, forming a hierarchical structure.

Extracting Bookmark Text

Extracting bookmark content is a common requirement, especially when retrieving specific information from large documents. The BookmarksNavigator class can be used to locate and extract bookmark content.

from spire.doc import *
from spire.doc.common import *

def ExtractBookmarkText():
    # Load the document
    doc = Document()
    doc.LoadFromFile("CreateBookmark.docx")

    # Create a bookmark navigator instance
    navigator = BookmarksNavigator(doc)

    # Move to the specified bookmark
    navigator.MoveToBookmark("SimpleBookmark")

    # Get the bookmark content
    textBodyPart = navigator.GetBookmarkContent()

    # Iterate through bookmark content items to extract text
    text = ''
    for i in range(textBodyPart.BodyItems.Count):
        item = textBodyPart.BodyItems.get_Item(i)
        if isinstance(item, Paragraph):
            for j in range(item.ChildObjects.Count):
                childObject = item.ChildObjects.get_Item(j)
                if isinstance(childObject, TextRange):
                    text += childObject.Text

    print(f"Extracted bookmark text: {text}")

    # Write text to file
    with open("ExtractedText.txt", "w", encoding="utf-8") as f:
        f.write(text)

    doc.Close()

ExtractBookmarkText()
Enter fullscreen mode Exit fullscreen mode

The MoveToBookmark method of the BookmarksNavigator class is used to locate the bookmark with the specified name, and the GetBookmarkContent method returns the content object of the bookmark. By iterating through the child items in the content object, plain text content can be extracted.

Replacing Bookmark Content

In practical applications, it is often necessary to replace the original content at a bookmark position with new content. This is particularly useful in document template filling scenarios.

from spire.doc import *
from spire.doc.common import *

def ReplaceBookmarkContent():
    # Load the document
    doc = Document()
    doc.LoadFromFile("CreateBookmark.docx")

    # Navigate to the bookmark
    bookmarkNavigator = BookmarksNavigator(doc)
    bookmarkNavigator.MoveToBookmark("SimpleBookmark")

    # Replace bookmark content with new content
    bookmarkNavigator.ReplaceBookmarkContent("This is the new content after replacement.", False)

    # Save the document
    doc.SaveToFile("ReplaceBookmarkContent.docx", FileFormat.Docx)
    doc.Close()

ReplaceBookmarkContent()
Enter fullscreen mode Exit fullscreen mode

The first parameter of the ReplaceBookmarkContent method is the new content to replace with, and the second parameter controls whether to preserve the original formatting. Setting it to False means not preserving the original formatting and using the default formatting of the new content.

Inserting Images at Bookmark Positions

In addition to text replacement, images can also be inserted at bookmark positions, which is useful for generating documents containing charts or logos.

from spire.doc import *
from spire.doc.common import *

def InsertImageAtBookmark():
    # Load the document
    doc = Document()
    doc.LoadFromFile("CreateBookmark.docx")

    # Create a bookmark navigator instance
    bn = BookmarksNavigator(doc)

    # Find the bookmark named "SimpleBookmark"
    bn.MoveToBookmark("SimpleBookmark", True, True)

    # Add a temporary section and paragraph
    section0 = doc.AddSection()
    paragraph = section0.AddParagraph()

    # Add an image to the paragraph
    picture = paragraph.AppendPicture("./SampleImage.png")

    # Insert the paragraph at the bookmark position
    bn.InsertParagraph(paragraph)

    # Remove the temporary section
    doc.Sections.Remove(section0)

    # Save the document
    doc.SaveToFile("InsertImageAtBookmark.docx", FileFormat.Docx)
    doc.Close()

InsertImageAtBookmark()
Enter fullscreen mode Exit fullscreen mode

The core idea of this method is to first create a paragraph containing an image, then use the InsertParagraph method to insert that paragraph at the bookmark position. Finally, remove the temporarily created section to keep the document structure clean.

Inserting Tables at Bookmark Positions

Tables are commonly used elements in Word documents, and structured data can be dynamically displayed by inserting tables at bookmark positions.

from spire.doc import *
from spire.doc.common import *

def ReplaceBookmarkWithTable():
    # Load the document
    doc = Document()
    doc.LoadFromFile("CreateBookmark.docx")

    # Create a table
    table = Table(doc, True)

    # Prepare table data
    rowsCount = 4
    colsCount = 5
    data = [
        ["Name", "Capital", "Continent", "Area (km²)", "Population"],
        ["Argentina", "Buenos Aires", "South America", "2777815", "32300003"],
        ["Bolivia", "La Paz", "South America", "1098575", "7300000"],
        ["Brazil", "Brasília", "South America", "8511196", "150400000"]
    ]

    # Reset table cells
    table.ResetCells(rowsCount, colsCount)

    # Fill table data
    for i in range(rowsCount):
        for j in range(colsCount):
            table.Rows[i].Cells[j].AddParagraph().AppendText(data[i][j])

    # Navigate to the bookmark
    navigator = BookmarksNavigator(doc)
    navigator.MoveToBookmark("SimpleBookmark")

    # Create a TextBodyPart instance and add the table
    part = TextBodyPart(doc)
    part.BodyItems.Add(table)

    # Replace bookmark content with the table
    navigator.ReplaceBookmarkContent(part)

    # Save the document
    doc.SaveToFile("ReplaceWithTable.docx", FileFormat.Docx)
    doc.Close()

ReplaceBookmarkWithTable()
Enter fullscreen mode Exit fullscreen mode

In this example, a Table object is first created and populated with data, then the table is added to a TextBodyPart object, and finally the ReplaceBookmarkContent method is used to insert the table at the bookmark position. This method allows flexible insertion of various complex content.

Deleting Bookmarks

When a bookmark is no longer needed, it can be removed from the document. It should be noted that deleting a bookmark does not delete its contained content; only the bookmark marker itself is removed.

from spire.doc import *
from spire.doc.common import *

def RemoveBookmark():
    # Load the document
    document = Document()
    document.LoadFromFile("CreateBookmark.docx")

    # Get the bookmark by name
    bookmark = document.Bookmarks["SimpleBookmark"]

    # Delete the bookmark (preserve content)
    document.Bookmarks.Remove(bookmark)

    # Save the document
    document.SaveToFile("RemoveBookmark.docx", FileFormat.Docx)
    document.Close()

RemoveBookmark()
Enter fullscreen mode Exit fullscreen mode

If both the bookmark and its content need to be deleted, the content can first be cleared using the ReplaceBookmarkContent method, and then the bookmark marker can be deleted.

Practical Tips

Getting All Bookmarks in a Document

When processing documents with unknown structures, it may be necessary to first obtain a list of all bookmark names:

from spire.doc import *

def GetAllBookmarks():
    doc = Document()
    doc.LoadFromFile("CreateBookmark.docx")

    # Iterate through all bookmarks
    for bookmark in doc.Bookmarks:
        print(f"Bookmark name: {bookmark.Name}")

    doc.Close()

GetAllBookmarks()
Enter fullscreen mode Exit fullscreen mode

Checking if a Bookmark Exists

Before operating on a bookmark, it is best to check whether the bookmark exists to avoid runtime errors:

def CheckBookmarkExists(doc, bookmarkName):
    for bookmark in doc.Bookmarks:
        if bookmark.Name == bookmarkName:
            return True
    return False
Enter fullscreen mode Exit fullscreen mode

Summary

This article introduced various techniques for performing bookmark operations in Word documents using Python and the Spire.Doc for Python library, including:

  • Creating simple and nested bookmarks
  • Extracting text content from bookmarks
  • Replacing bookmark content with new text
  • Inserting images at bookmark positions
  • Inserting tables at bookmark positions
  • Deleting bookmark markers

Bookmark functionality provides powerful support for automated Word document processing, particularly suitable for scenarios such as document template filling, dynamic content generation, and information extraction. By making proper use of bookmarks, the efficiency and flexibility of document processing can be significantly improved.

In actual development, these operations can be combined according to specific requirements to build more complex document automation solutions. For example, a document template containing multiple bookmarks can be created, and then content at each bookmark position can be dynamically filled based on business data to achieve batch document generation.

Top comments (0)