如何在Word文档中创建书签,然后使用python创建到书签的内部超链接

问题描述 投票:0回答:1

[我已经编写了一个脚本,使用python-docx来搜索单词文档(通过搜索运行)以查找参考编号和技术关键词,然后创建一个汇总搜索结果的表格,该表格将附加到单词文档的末尾。 >

有些文档超过100页,因此,我想通过在搜索结果表中创建内部超链接来使用户更轻松,以便将您带到文档中检测到搜索结果的位置。 >

一旦找到参考运行,我不知道如何将其标记为书签或如何在结果表中创建指向该书签的超链接。

我能够使用此页中的代码创建到外部URL的书签Adding an hyperlink in MSWord by using python-docx

我也尝试过创建书签,我找到此页面:https://github.com/python-openxml/python-docx/issues/109

标题与创建书签有关,但是该代码似乎可以生成文字图形。

我觉得这两种解决方案可以放在一起,但是我对xml / word文档的理解不足,无法做到这一点。

更新:

我找到了一些将书签添加到Word文档的代码,现在需要的是一种使用Word文档中的链接进行链接的方法https://github.com/python-openxml/python-docx/issues/403
*from docx import Document

def add_bookmark(paragraph, bookmark_text, bookmark_name):
    run = paragraph.add_run()
    tag = run._r  # for reference the following also works: tag =  document.element.xpath('//w:r')[-1]
    start = docx.oxml.shared.OxmlElement('w:bookmarkStart')
    start.set(docx.oxml.ns.qn('w:id'), '0')
    start.set(docx.oxml.ns.qn('w:name'), bookmark_name)
    tag.append(start)

    text = docx.oxml.OxmlElement('w:r')
    text.text = bookmark_text
    tag.append(text)

    end = docx.oxml.shared.OxmlElement('w:bookmarkEnd')
    end.set(docx.oxml.ns.qn('w:id'), '0')
    end.set(docx.oxml.ns.qn('w:name'), bookmark_name)
    tag.append(end)


doc = Document("test_input_1.docx")

# add a bookmakr to every paragraph
for paranum, paragraph in enumerate(doc.paragraphs):
    add_bookmark(paragraph=paragraph, bookmark_text=f"temp{paranum}", bookmark_name=f"temp{paranum+1}")
doc.save("output.docx")*

[我已经使用python-docx编写了一个脚本来搜索单词文档(通过搜索运行)以查找参考编号和技术关键词,然后创建一个汇总搜索结果的表格,......]

已解决:我是从这篇文章中获得的adding hyperlink to a bookmark

这是关键行

hyperlink.set(docx.oxml.shared.qn('w:anchor'), link_to,)

作为奖励,我增加了在链接中添加工具提示的功能:

享受

这里是答案:

from docx import Document
import docx
from docx.enum.dml import MSO_THEME_COLOR_INDEX

def add_bookmark(paragraph, bookmark_text, bookmark_name):
    run = paragraph.add_run()
    tag = run._r
    start = docx.oxml.shared.OxmlElement('w:bookmarkStart')
    start.set(docx.oxml.ns.qn('w:id'), '0')
    start.set(docx.oxml.ns.qn('w:name'), bookmark_name)
    tag.append(start)

    text = docx.oxml.OxmlElement('w:r')
    text.text = bookmark_text
    tag.append(text)

    end = docx.oxml.shared.OxmlElement('w:bookmarkEnd')
    end.set(docx.oxml.ns.qn('w:id'), '0')
    end.set(docx.oxml.ns.qn('w:name'), bookmark_name)
    tag.append(end)

def add_link(paragraph, link_to, text, tool_tip=None):
    # create hyperlink node
    hyperlink = docx.oxml.shared.OxmlElement('w:hyperlink')

    # set attribute for link to bookmark
    hyperlink.set(docx.oxml.shared.qn('w:anchor'), link_to,)

    if tool_tip is not None:
        # set attribute for link to bookmark
        hyperlink.set(docx.oxml.shared.qn('w:tooltip'), tool_tip,)

    new_run = docx.oxml.shared.OxmlElement('w:r')
    rPr = docx.oxml.shared.OxmlElement('w:rPr')
    new_run.append(rPr)
    new_run.text = text
    hyperlink.append(new_run)
    r = paragraph.add_run()
    r._r.append(hyperlink)
    r.font.name = "Calibri"
    r.font.color.theme_color = MSO_THEME_COLOR_INDEX.HYPERLINK
    r.font.underline = True

# test the functions
if __name__ == "__main__":

    # input test document
    doc = Document(r"test_input_1.docx")

    # add a bookmark to every paragraph
    for paranum, paragraph in enumerate(doc.paragraphs):
        add_bookmark(paragraph=paragraph,
                     bookmark_text=f"{paranum}", bookmark_name=f"temp{paranum+1}")

    # add page to the end to put your link
    doc.add_page_break()
    paragraph = doc.add_paragraph("This is where the internal link will live")

    # add a link to the first paragraph
    add_link(paragraph=paragraph, link_to="temp0",
             text="this is a link to ", tool_tip="your message here")


    doc.save(r"output.docx")
python python-3.x python-docx
1个回答
0
投票

已解决:我是从这篇文章中获得的adding hyperlink to a bookmark

© www.soinside.com 2019 - 2024. All rights reserved.