317 lines
14 KiB
Python
317 lines
14 KiB
Python
from docx import Document
|
|
from docx.shared import Pt, Cm, RGBColor
|
|
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
|
|
from docx.enum.style import WD_STYLE_TYPE
|
|
from docx.oxml.ns import qn
|
|
from docx.oxml import OxmlElement
|
|
|
|
|
|
def create_gost_document(title="Документ", author="Автор"):
|
|
"""
|
|
Создает новый документ Word с оформлением по ГОСТ
|
|
|
|
Args:
|
|
title (str): Заголовок документа
|
|
author (str): Автор документа
|
|
|
|
Returns:
|
|
Document: Объект документа с настроенными стилями ГОСТ
|
|
"""
|
|
doc = Document()
|
|
|
|
# Настройка полей страницы согласно ГОСТ
|
|
sections = doc.sections
|
|
for section in sections:
|
|
section.top_margin = Cm(2) # Верхнее поле 2 см
|
|
section.bottom_margin = Cm(2) # Нижнее поле 2 см
|
|
section.left_margin = Cm(3) # Левое поле 3 см
|
|
section.right_margin = Cm(1.5) # Правое поле 1.5 см
|
|
|
|
# Установка стандартного стиля для всего документа
|
|
style = doc.styles['Normal']
|
|
font = style.font
|
|
font.name = 'Times New Roman'
|
|
font.size = Pt(14)
|
|
# Установка кириллического шрифта для документов на русском языке
|
|
font.element.rPr.rFonts.set(qn('w:eastAsia'), 'Times New Roman')
|
|
|
|
# Настройка формата абзаца
|
|
paragraph_format = style.paragraph_format
|
|
paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE # Полуторный интервал
|
|
paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY # Выравнивание по ширине
|
|
paragraph_format.first_line_indent = Cm(1.25) # Красная строка 1.25 см
|
|
|
|
# Создаем заголовок документа
|
|
title_paragraph = doc.add_heading(level=0)
|
|
title_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
title_run = title_paragraph.add_run(title)
|
|
title_run.font.size = Pt(16)
|
|
title_run.font.bold = True
|
|
title_run.font.name = 'Times New Roman'
|
|
|
|
# Добавляем имя автора
|
|
author_paragraph = doc.add_paragraph()
|
|
author_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
author_run = author_paragraph.add_run(f"\n{author}")
|
|
author_run.font.size = Pt(14)
|
|
author_run.font.name = 'Times New Roman'
|
|
|
|
# Добавляем отступ после заголовка
|
|
doc.add_paragraph()
|
|
|
|
# Создаем стили заголовков в соответствии с ГОСТ
|
|
create_gost_heading_styles(doc)
|
|
|
|
return doc
|
|
|
|
|
|
def create_gost_heading_styles(doc):
|
|
"""
|
|
Создает стили заголовков в соответствии с требованиями ГОСТ
|
|
|
|
Args:
|
|
doc (Document): Объект документа
|
|
"""
|
|
# Заголовок 1 уровня
|
|
h1_style = doc.styles.add_style('Heading 1 GOST', WD_STYLE_TYPE.PARAGRAPH)
|
|
h1_style.base_style = doc.styles['Heading 1']
|
|
h1_style.font.name = 'Times New Roman'
|
|
h1_style.font.size = Pt(16)
|
|
h1_style.font.bold = True
|
|
h1_style.font.all_caps = True # В ГОСТ заголовки часто пишутся прописными
|
|
h1_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
h1_style.paragraph_format.space_before = Pt(24) # Отступ перед заголовком
|
|
h1_style.paragraph_format.space_after = Pt(12) # Отступ после заголовка
|
|
h1_style.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
|
|
|
|
# Заголовок 2 уровня
|
|
h2_style = doc.styles.add_style('Heading 2 GOST', WD_STYLE_TYPE.PARAGRAPH)
|
|
h2_style.base_style = doc.styles['Heading 2']
|
|
h2_style.font.name = 'Times New Roman'
|
|
h2_style.font.size = Pt(14)
|
|
h2_style.font.bold = True
|
|
h2_style.paragraph_format.space_before = Pt(24)
|
|
h2_style.paragraph_format.space_after = Pt(6)
|
|
h2_style.paragraph_format.first_line_indent = Cm(0) # Без красной строки
|
|
h2_style.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
|
|
|
|
# Заголовок 3 уровня
|
|
h3_style = doc.styles.add_style('Heading 3 GOST', WD_STYLE_TYPE.PARAGRAPH)
|
|
h3_style.base_style = doc.styles['Heading 3']
|
|
h3_style.font.name = 'Times New Roman'
|
|
h3_style.font.size = Pt(14)
|
|
h3_style.font.bold = True
|
|
h3_style.font.italic = True
|
|
h3_style.paragraph_format.space_before = Pt(18)
|
|
h3_style.paragraph_format.space_after = Pt(6)
|
|
h3_style.paragraph_format.first_line_indent = Cm(0)
|
|
h3_style.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
|
|
|
|
# Стиль для списка
|
|
list_style = doc.styles.add_style('List GOST', WD_STYLE_TYPE.PARAGRAPH)
|
|
list_style.base_style = doc.styles['List']
|
|
list_style.font.name = 'Times New Roman'
|
|
list_style.font.size = Pt(14)
|
|
list_style.paragraph_format.left_indent = Cm(1.25)
|
|
list_style.paragraph_format.space_before = Pt(0)
|
|
list_style.paragraph_format.space_after = Pt(6)
|
|
list_style.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
|
|
|
|
# Стиль для подпись таблиц и рисунков
|
|
caption_style = doc.styles.add_style('Caption GOST', WD_STYLE_TYPE.PARAGRAPH)
|
|
caption_style.base_style = doc.styles['Caption']
|
|
caption_style.font.name = 'Times New Roman'
|
|
caption_style.font.size = Pt(12)
|
|
caption_style.font.italic = True
|
|
caption_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
caption_style.paragraph_format.space_before = Pt(6)
|
|
caption_style.paragraph_format.space_after = Pt(12)
|
|
|
|
|
|
def add_gost_heading(doc, text, level=1):
|
|
"""
|
|
Добавляет заголовок с оформлением по ГОСТ
|
|
|
|
Args:
|
|
doc (Document): Объект документа
|
|
text (str): Текст заголовка
|
|
level (int): Уровень заголовка (1, 2 или 3)
|
|
|
|
Returns:
|
|
Paragraph: Объект параграфа с заголовком
|
|
"""
|
|
if level == 1:
|
|
style_name = 'Heading 1 GOST'
|
|
elif level == 2:
|
|
style_name = 'Heading 2 GOST'
|
|
elif level == 3:
|
|
style_name = 'Heading 3 GOST'
|
|
else:
|
|
raise ValueError("Уровень заголовка должен быть 1, 2 или 3")
|
|
|
|
# Проверяем, существует ли стиль, если нет - создаем стили ГОСТ
|
|
if style_name not in doc.styles:
|
|
create_gost_heading_styles(doc)
|
|
|
|
heading = doc.add_heading(text, level=0)
|
|
heading.style = style_name
|
|
return heading
|
|
|
|
|
|
def add_gost_paragraph(doc, text, style=None):
|
|
"""
|
|
Добавляет абзац с оформлением по ГОСТ
|
|
|
|
Args:
|
|
doc (Document): Объект документа
|
|
text (str): Текст абзаца
|
|
style (str, optional): Название стиля
|
|
|
|
Returns:
|
|
Paragraph: Объект параграфа
|
|
"""
|
|
p = doc.add_paragraph()
|
|
|
|
if style and style in doc.styles:
|
|
p.style = style
|
|
|
|
# Основной текст по ГОСТ
|
|
p.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
|
|
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
|
|
p.paragraph_format.first_line_indent = Cm(1.25)
|
|
|
|
# Добавляем текст
|
|
p.add_run(text)
|
|
|
|
return p
|
|
|
|
|
|
def add_gost_table(doc, data, headers=None):
|
|
"""
|
|
Создает таблицу в формате ГОСТ
|
|
|
|
Args:
|
|
doc (Document): Объект документа
|
|
data (list): Данные таблицы в виде списка списков
|
|
headers (list, optional): Заголовки таблицы
|
|
|
|
Returns:
|
|
Table: Объект таблицы
|
|
"""
|
|
# Добавляем подпись таблицы
|
|
caption = doc.add_paragraph()
|
|
caption.style = 'Caption GOST'
|
|
caption.add_run("Таблица ").bold = True
|
|
|
|
# Создаем таблицу
|
|
rows = len(data) + (1 if headers else 0)
|
|
cols = len(data[0]) if data else 0
|
|
table = doc.add_table(rows=rows, cols=cols)
|
|
|
|
# Стиль таблицы
|
|
table.style = 'Table Grid'
|
|
|
|
# Заполняем заголовки, если они есть
|
|
if headers:
|
|
hdr_cells = table.rows[0].cells
|
|
for i, header in enumerate(headers):
|
|
hdr_cells[i].text = header
|
|
for paragraph in hdr_cells[i].paragraphs:
|
|
for run in paragraph.runs:
|
|
run.font.bold = True
|
|
|
|
# Заполняем данные
|
|
start_row = 1 if headers else 0
|
|
for i, row_data in enumerate(data):
|
|
row_cells = table.rows[i + start_row].cells
|
|
for j, cell_data in enumerate(row_data):
|
|
row_cells[j].text = str(cell_data)
|
|
|
|
# Настройка шрифта для всех ячеек
|
|
for row in table.rows:
|
|
for cell in row.cells:
|
|
for paragraph in cell.paragraphs:
|
|
for run in paragraph.runs:
|
|
run.font.name = 'Times New Roman'
|
|
run.font.size = Pt(12)
|
|
|
|
return table
|
|
|
|
|
|
def save_gost_document(doc, filename):
|
|
"""
|
|
Сохраняет документ с настройками совместимости для MS Word
|
|
|
|
Args:
|
|
doc (Document): Объект документа
|
|
filename (str): Имя файла для сохранения
|
|
"""
|
|
# Добавляем настройки совместимости
|
|
doc.settings.element.xpath('./w:compat')[0].clear()
|
|
|
|
# Сохраняем документ
|
|
doc.save(filename)
|
|
|
|
|
|
# Пример использования
|
|
if __name__ == "__main__":
|
|
# Создаем документ по ГОСТ
|
|
document = create_gost_document("Отчет о научно-исследовательской работе", "Иванов И.И.")
|
|
|
|
# Добавляем раздел с заголовком 1 уровня
|
|
add_gost_heading(document, "ВВЕДЕНИЕ", level=1)
|
|
|
|
# Добавляем текст введение
|
|
intro_text = ("Настоящий отчет посвящен исследованию актуальных проблем в области "
|
|
"разработки программного обеспечения. Цель работы - анализ и разработка "
|
|
"методов оптимизации процесса создания программных продуктов. В ходе "
|
|
"исследования были применены методы системного анализа, математического "
|
|
"моделирования и экспериментальные методы.")
|
|
add_gost_paragraph(document, intro_text)
|
|
|
|
# Добавляем раздел с заголовком 2 уровня
|
|
add_gost_heading(document, "1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ", level=2)
|
|
|
|
# Добавляем текст раздела
|
|
analysis_text = ("В данном разделе представлен анализ современных подходов к разработке "
|
|
"программного обеспечения. Проведенный анализ показал, что основными "
|
|
"проблемами являются недостаточная модульность архитектуры и слабая "
|
|
"документация проектов.")
|
|
add_gost_paragraph(document, analysis_text)
|
|
|
|
# Добавляем подраздел с заголовком 3 уровня
|
|
add_gost_heading(document, "1.1. Методы исследования", level=3)
|
|
|
|
# Добавляем нумерованный список
|
|
methods = [
|
|
"Анализ существующих решений в предметной области",
|
|
"Моделирование архитектуры программной системы",
|
|
"Экспериментальная проверка предложенных методов"
|
|
]
|
|
|
|
for method in methods:
|
|
p = document.add_paragraph(method, style='List GOST')
|
|
p.style = 'List GOST'
|
|
p.paragraph_format.left_indent = Cm(1.25)
|
|
p.paragraph_format.first_line_indent = Cm(-0.63) # Отрицательный отступ для номера
|
|
|
|
# Добавляем таблицу
|
|
headers = ["Метод", "Достоинства", "Недостатки"]
|
|
data = [
|
|
["Метод 1", "Высокая точность", "Сложность реализации"],
|
|
["Метод 2", "Простота", "Низкая точность"],
|
|
["Метод 3", "Универсальность", "Высокие требования к ресурсам"]
|
|
]
|
|
add_gost_table(document, data, headers)
|
|
|
|
# Добавляем заключение
|
|
add_gost_heading(document, "ЗАКЛЮЧЕНИЕ", level=1)
|
|
conclusion_text = ("В результате проведенного исследования были выявлены основные проблемы "
|
|
"в области разработки программного обеспечения. Предложенные методы "
|
|
"позволяют повысить качество создаваемых программных продуктов и сократить "
|
|
"время на их разработку.")
|
|
add_gost_paragraph(document, conclusion_text)
|
|
|
|
# Сохраняем документ
|
|
save_gost_document(document, "otchet_po_GOST.docx")
|
|
print("Документ успешно создан и сохранен как 'otchet_po_GOST.docx'") |