python-docx
;python-docx
;python-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()
.
Размеры и ориентацию страницы определенной секции/раздела описывают три свойства, это: 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
.
Шрифт документа и его размер по умолчанию для всего документа можно задать, изменив встроенный стиль '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
.