Есть ли способ связать одну часть документа с другой частью того же документа с помощью python -docx? - PullRequest
0 голосов
/ 14 июля 2020

Моя цель - перечислить различное содержание документа в табличном формате, а затем связать текст с местами, на которые они ссылаются. Она похожа на панель навигации MS Word, в которой можно увидеть различные заголовки и можно переходить из одного места в другое, используя ссылки.

Есть ли способ связать одну часть документа к другому, так что когда вы щелкаете ссылку, вы переходите к месту?

Я пытаюсь кодировать в этом формате.

head = document.add_heading('aaa', level=1)
add_to_table(document, head)

Передайте этот заголовок другой функции, которая добавит к заголовок к таблице.

def add_to_table(document, heading):
    table = document.tables[0]
    cells = table.add_row().cells
    cells[0].text = heading.text
    add_hyperlink(cells[0], heading)

Я не уверен, есть ли такая функция, как add_hyperlink, как я написал выше. Можно ли как-нибудь этого добиться?

1 Ответ

0 голосов
/ 27 августа 2020

Это можно решить с помощью полей Microsoft или поля гиперссылки , если быть более точным:

Синтаксис: { HYPERLINK "Filename" [Switches ] }

Переключатели \l Указывает место в файле, например закладку, куда будет переходить эта гиперссылка. ...

Как в HTML, где у вас есть идентификатор элемента и внутренние ссылки, относящиеся к элементу как #id, здесь вместо идентификаторов мы используем закладки.

Поскольку python -docx по-прежнему не поддерживает добавление настраиваемых полей, я сделал свое собственное для нашей вилки здесь: https://github.com/python-openxml/python-docx/commit/a7f9f874886c8e2166489ee3cf07311c483989ac

Итак, допустим, у нас есть документ где-то в документе есть закладка bookmark_num_1, а затем добавление абзаца в этом случае будет выглядеть примерно так:

    doc = docx.Document()
    bkm_name = "bookmark_num_1"
    p = doc.add_paragraph()
    r = p.add_run()
    r.add_fldChar('begin')
    r.add_instrText(rf'HYPERLINK \l "{bkm_name}"')
    r.add_fldChar('separate')
    r = p.add_run('hyperlink text towards bookmark_num_1. ctrl+click to go there.')
    r.add_fldChar('end')

Следующее предположение, что вы хотите добавлять закладки динамически, есть два открытые PR, которые могут оказаться полезными: https://github.com/python-openxml/python-docx/pull/539, https://github.com/python-openxml/python-docx/pull/445

Обратите внимание, что в этом направлении также есть некоторая работа, которая может оказаться полезной https://github.com/python-openxml/python-docx/pull/278

...