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'")