Сообщить об ошибке.

Изменение макета документа, модуль python-docx

Содержание:


Изменение макета листа документа DOCX.

При создании документа с расширением .docx с помощью модуля python-docx, прежде всего, необходимо создать объект документа Document(), с которым и производятся все дальнейшие манипуляции. Так вот, в момент создания экземпляра Document() открывается пустой документ, основанный на "шаблоне по умолчанию", в котором определены: размер листа, ориентация, отступы, колонтитулы и т.д.

Объект документа .docx имеет свойство Document.sections, которое представляет собой последовательность объектов раздела Section. Каждый объект секции/раздела Section предоставляет доступ к настройкам макета листа этой секции/раздела, а именно, ориентации, отступам, колонтитулам и т.д. этого раздела.

При создании экземпляра документа Document() открывается пустой документ, у которого Document.sections имеет только одну секцию. Следовательно, для изменения параметров макета листа .docx документа, после его создания, необходимо получить доступ к первой секции и изменить ее свойства. Так как .sections - это последовательность, то доступ к объекту первой секции Section будем осуществляем по индексу (.sections[0]).

Смотрим пример:

from docx import Document
# импортируем единицы измерения
from docx.shared import Mm, Cm
# импортируем необходимые перечисления
from docx.enum.text import WD_ALIGN_PARAGRAPH

# создание экземпляра документа
doc = Document()
# доступ к первой секции:
section = doc.sections[0]
# высота листа в сантиметрах
section.page_height = Cm(29.7)
# ширина листа в сантиметрах
section.page_width = Cm(21.0)
# левое поле в миллиметрах
section.left_margin = Mm(20.4)
# правое поле в миллиметрах
section.right_margin = Mm(10)
# верхнее поле в миллиметрах
section.top_margin = Mm(15)
# нижнее поле в миллиметрах
section.bottom_margin = Mm(10)
# отступ от верхнего края страницы до 
# нижнего края нижнего колонтитула
section.header_distance = Mm(10)
# отступ от нижнего края страницы до 
# нижнего края нижнего колонтитула
section.footer_distance = Mm(10)
# Добавим заголовок - это то же самое что 
# и параграф, только с определенными стилями
head = doc.add_heading('Изменение макета всех страниц первой секции.', level=1)
# выравниваем заголовок по середине
head.alignment = WD_ALIGN_PARAGRAPH.CENTER
# отступ до следующего элемента документа
head.paragraph_format.space_after = Mm(5)
# Добавим параграф
doc.add_paragraph('Доступ к свойствам раздела/секции, таким как поля и ориентация страницы.')
doc.save('test.docx')

Смотрите справочную информацию по объекту Section, что бы узнать, какие параметры макета страницы еще можно менять.

Обратите внимание, что изменения свойств секции затронут все страницы в этой секции. Для того, чтобы добавить новую страницу/лист другого размера и/или ориентации в общий документ, необходимо создать новую секцию методом Document.add_section().

Изменение ориентации листа документа DOCX.

Размеры и ориентацию страницы определенной секции/раздела описывают три свойства, это: section.orientation, section.page_width и section.page_height.

Для изменения ориентации листа секции/раздела с книжной на альбомную и наоборот необходимо задавать их все разом, т.е. недостаточно просто указать section.orientation = WD_ORIENT.LANDSCAPE.

Смотрим пример:

from docx import Document
# импортируем необходимые перечисления
from docx.enum.text import WD_ALIGN_PARAGRAPH 
from docx.enum.section import WD_SECTION, WD_ORIENT

# создание экземпляра документа
doc = Document()
# добавим заголовок 
head = doc.add_heading('Первая секция документа.', level=1)
# выравниваем заголовок по середине
head.alignment = WD_ALIGN_PARAGRAPH.CENTER
# Добавим новую секцию
doc.add_section(start_type=WD_SECTION.NEW_PAGE)
# доступ ко второй секции и задаем ориентацию
doc.sections[1].orientation = WD_ORIENT.LANDSCAPE
# задаем высоту и ширину, считывая ее 
# с первой секции и инвертируя значения
doc.sections[1].page_width = doc.sections[0].page_height
doc.sections[1].page_height = doc.sections[0].page_width
# добавим заголовок новой секции
head = doc.add_heading('Вторая секция документа.', level=1)
# выравниваем заголовок по середине
head.alignment = WD_ALIGN_PARAGRAPH.CENTER
# для возврата к прежней ориентации страницы 
# необходимо указывать все заново
doc.add_section()
doc.sections[2].orientation = WD_ORIENT.PORTRAIT
doc.sections[2].page_width = doc.sections[0].page_width
doc.sections[2].page_height = doc.sections[0].page_height
head = doc.add_heading('Конец', level=1)
doc.save('test.docx')

Использование верхнего и нижнего колонтитулов в python-docx.

Объект секции/раздела Section, также предоставляет доступ к содержимому верхнего и нижнего колонтитула документа.

Доступ осуществляется посредствам обращения к соответствующим свойствам секции:

  • Document.sections[0].header - осуществляет доступ к верхнему колонтитулу первого раздела/секции документа.
  • Document.sections[0].footer -осуществляет доступ к нижнему колонтитулу первого раздела/секции документа.

Так как колонтитулы представляют собой контейнеры с уже добавленным первым параграфом, то добавить текст можно через свойство колонтитула paragraphs[0].add_run('Какой-то текст')

Пример:

from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document() 
# доступ к верхнему колонтитулу
header = doc.sections[0].header.paragraphs[0]
# доступ к нижнему колонтитулу
footer = doc.sections[0].footer.paragraphs[0]
# добавляем верхний колонтитул
header.style.font.size = Pt(8)
header.add_run('Верхний колонтитул')
# выравниваем колонтитул по правому краю
header.alignment = WD_ALIGN_PARAGRAPH.RIGHT
# добавляем нижний колонтитул
footer.style.font.size = Pt(10)
footer.add_run('Нижний колонтитул')
# выравниваем колонтитул по правому краю
footer.alignment = WD_ALIGN_PARAGRAPH.CENTER
# Добавим параграф
doc.add_paragraph('Текст первой страницы.')
doc.add_paragraph('Доступ к верхнему и нижнему колонтитулам.')
# Добавим разрыв страницы
doc.add_page_break()
doc.add_paragraph('Текст второй страницы.')
doc.add_paragraph('Доступ к верхнему и нижнему колонтитулам.')
# теперь прочитаем колонтитулы
text_header = doc.sections[0].header.paragraphs[0].text
print(text_header)
text_footer = doc.sections[0].footer.paragraphs[0].text
print(text_footer)
doc.save("test.docx")

Что бы узнать, что еще можно сделать с параграфом, смотрите справочную информацию по объекту Paragraph.

Изменение шрифта по умолчанию и его размера для документа DOCX.

Шрифт документа и его размер по умолчанию для всего документа можно задать, изменив встроенный стиль 'Normal' следующим образом:

from docx import Document
from docx.shared import Mm, Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH 

doc = Document()
# изменяем стиль текста по умолчанию
style = doc.styles['Normal']
# название шрифта по умолчанию
style.font.name = 'Arial'
# размер шрифта по умолчанию
style.font.size = Pt(12)
head = doc.add_heading('Изменение шрифта по умолчанию.', level=1)
# выравниваем заголовок по середине
head.alignment = WD_ALIGN_PARAGRAPH.CENTER
head.style.font.size = Pt(18)
# отступ до следующего элемента документа
head.paragraph_format.space_after = Mm(5)
# Добавим параграф
doc.add_paragraph('Текст параграфа документа.')
doc.save('test.docx')

Что бы узнать, какие еще параметры можно поменять у шрифта, смотрите справочную информацию по объекту Font.