Как удалить новую строку в заголовке Word с помощью python-docx при добавлении текста абзаца?

Я успешно добавил текст и изображение в таблицу с двумя ячейками в заголовке 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

введите описание изображения здесь

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

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


person Matija Lukic    schedule 10.06.2019    source источник


Ответы (1)


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

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

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

Этот процесс описан в документации здесь:
https://python-docx.readthedocs.io/en/latest/user/hdrftr.html#adding-zoned-header-content

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

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()
person scanny    schedule 10.06.2019
comment
Использование вкладок кажется лучшим решением. Но вы можете сказать мне, что это за переменная раздела. Как попасть в раздел? Вы имели в виду, что это раздел на самом деле section = document.sections [0] .header? А что значит стиль? Кроме того, вы имели в виду, что переменная tab_stops должна быть определена как tab_stops = paragraph.style.paragraph_format.tab_stops? - person Matija Lukic; 11.06.2019
comment
section - это та же самая переменная, которая появляется в вашем коде выше как document.sections[0] или любой другой раздел, имеющий заголовок, который вы хотите установить. style должно быть paragraph, извинения, исправлено. - person scanny; 11.06.2019