Выравнивание блоков текста по правому и левому краю
Хотел с помощью 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 шт):
Как вариант, можно поиграться с табуляцией:
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')
То же с отображением непечатаемых символов
Я предлагаю решить вопрос иначе и использовать код втрое короче. Я делал так, и не раз, работая с 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')