Выравнивание блоков текста по правому и левому краю

Хотел с помощью python написать договор. Первый абзац разместил в центре, с этим проблем нет, но во втором абзаце Город Москва хотел поставить слева, а дату — справа, но не получается это сделать.

Хотелось бы это сделать именно с помощью python, а не вручную в ворде:

#cmd pip install python.docx
import docx#работа с вордом
from docx.shared import Pt#шрифт
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT#расположение абзацев

date = '27 сентября 2024'

doc=docx.Document()#Создать файл ворд

style=doc.styles['Normal']#шрифт
style.font.name = 'Times New Roman'
style.font.size=Pt(11)

paragraph1=doc.add_paragraph('ДОГОВОР №8___')#1 абзац
paragraph1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

paragraph2=doc.add_paragraph('Город Москва')#2 абзац
paragraph2.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT

par2=paragraph2.add_run(date)#дополнение 2 абзаца
par2.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT

doc.save('hui.docx')

Ответы (3 шт):

Автор решения: Amgarak

Как вариант, можно поиграться с табуляцией:

import docx
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT, WD_TAB_ALIGNMENT

date = '27 сентября 2024'

doc = docx.Document()#Создать файл ворд

style = doc.styles['Normal']#шрифт
style.font.name = 'Times New Roman'
style.font.size = Pt(11)

paragraph1 = doc.add_paragraph('ДОГОВОР №8___')#1 абзац
paragraph1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

paragraph2 = doc.add_paragraph()#2 абзац
tab_stops = paragraph2.paragraph_format.tab_stops
tab_stops.add_tab_stop(docx.shared.Inches(6), WD_TAB_ALIGNMENT.RIGHT)  # Устанавливаем правую табуляцию

paragraph2.add_run('Город Москва')
paragraph2.add_run('\t')  # Добавляем символ табуляции для выравнивания
paragraph2.add_run(date)

doc.save('hui.docx')

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

→ Ссылка
Автор решения: Алексей Р

Можно выровнять абзац по ширине, добавив "резиновый" пробел в середину. А остальные пробелы заменить на неразрывные (код 160 или \xa0). Важно: строку нужно завершить символом возврата каретки \r. Тогда левая и правая части строки автоматически выровняются по левому и правому полям.

import docx  # работа с вордом
from docx.shared import Pt  # шрифт
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT  # расположение абзацев

date = '27\xa0сентября\xa02024'

doc = docx.Document()  # Создать файл ворд

style = doc.styles['Normal']  # шрифт
style.font.name = 'Times New Roman'
style.font.size = Pt(11)

paragraph1 = doc.add_paragraph('ДОГОВОР №8___')  # 1 абзац
paragraph1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

paragraph2 = doc.add_paragraph(f'Город\xa0Москва {date}\r')  # 2 абзац
paragraph2.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
doc.save(r'c:\test\test.docx')

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

То же с отображением непечатаемых символов

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

→ Ссылка
Автор решения: Fox Fox

Я предлагаю решить вопрос иначе и использовать код втрое короче. Я делал так, и не раз, работая с Visual FoxPro. Надо создать документ в редакторе Word. Это сразу "выдует прочь" кучу мусорного глючного кода и существенно расширит возможности документа. В нём создать такие "поля", какие надо. Например: {Город}, {Дата}, {ФИО}. Затем уж использовать модуль python-docx примерно так (я не проверял лично пока, но скоро буду, это в качестве идеи, которую будете дожимать сами): заменяете {Город} на реальное значение и так для всех "полей". Приятность в том, что форматирование текста при этом прекрасно сохраняется. Если умеете делать приличные документы в Word, результат будет превосходным, а проблем 0. Я так даже адреса на конвертах печатал прямо из базы данных, не только письма клиентам банка с предложениями и прочим. Вручную с помощью Питона создать красиво сделанный, крутой документ или невозможно, или энергетически глупо. Итак, вот всё, что нужно для замены "полей" в документе на реальные значения:

from docx import Document

# Открываем документ
doc = Document('example.docx')

# Проходим по всем параграфам в документе
for para in doc.paragraphs:
    if 'старый текст' in para.text:
        para.text = para.text.replace('старый текст', 'новый текст')

# Сохраняем изменения в новый файл
doc.save('example_modified.docx')
→ Ссылка