已解决:我是从这篇文章中获得的adding hyperlink to a bookmark
[我已经编写了一个脚本,使用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")
已解决:我是从这篇文章中获得的adding hyperlink to a bookmark