First Commit

This commit is contained in:
Igor20264
2025-09-15 07:48:37 +03:00
commit d2da20fdb2
12 changed files with 6102 additions and 0 deletions
+317
View File
@@ -0,0 +1,317 @@
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'")