Как удалить новую строку в заголовке Word, используя python-docx при добавлении текста абзаца? - PullRequest
2 голосов
/ 10 июня 2019

Я успешно добавил текст и изображение в таблицу из двух ячеек в заголовке Word.

section = document.sections[0]
header = section.header

htable = header.add_table(1, 2, Inches(6))

htab_cells = htable.rows[0].cells

ht0 = htab_cells[0]
ht1 = htab_cells[1]

ht0.paragraphs[0].text = 'Test project'
run = ht1.paragraphs[0].add_run()
run.add_picture('app/static/images/logo.png', width=Inches(1))
ht1.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.RIGHT

enter image description here

Но проблема в том, что python-docx поместил мой текст в левый столбец новой строки?

Как избавиться от этой первой добавленной строки абзаца?

1 Ответ

2 голосов
/ 10 июня 2019

Пустой (вновь созданный) раздел содержит пустой абзац. Этот тип Word (называемый «историей») должен всегда содержать хотя бы один абзац, в противном случае он недопустим и вызовет ошибку восстановления при загрузке.

Таким образом, вопрос в том, как избежать появления таблицы после этого абзаца.

Первый ответ, который мне нравится больше всего, состоит в том, чтобы вообще избегать использования таблицы. Вы, кажется, используете его только для выравнивания, и использование вкладок делает это лучше по нескольким причинам, одна из которых состоит в том, чтобы избежать небольших смещений из-за внутреннего поля ячейки таблицы.

Этот процесс описан в документации здесь:
https://python -docx.readthedocs.io / о / последняя / пользователя / hdrftr.html # добавление-зональный-заголовок-контент

По сути, вы добавляете вкладки в один существующий абзац и используете символы табуляции для отделения вашего логотипа от заголовка. Если вы используете выровненную по правому краю вкладку, логотип будет хорошо совмещен с правым полем.

from docx.enum.text import WD_TAB_ALIGNMENT

paragraph = section.paragraphs[0]
tab_stops = paragraph.paragraph_format.tab_stops
tab_stops.add_tab_stop(Inches(6.5), WD_TAB_ALIGNMENT.RIGHT)

paragraph.text = "My Header Title\t"  # ---note trailing tab char---
run = paragraph.add_run()
run.add_picture("my-logo")

Если вы действительно должны использовать таблицу, вам нужно удалить пустой абзац перед добавлением таблицы, а затем добавить его обратно:

paragraph = header.paragraphs[0]
p = paragraph._p  # ---this is the paragraph XML element---
p.getparent().remove(p)
header.add_table(...)
...
header.add_paragraph()
...