115 lines
4.5 KiB
Python
115 lines
4.5 KiB
Python
import pypandoc
|
|
from docx import Document
|
|
from docx.shared import Pt, Cm
|
|
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
|
from docx.enum.style import WD_STYLE_TYPE
|
|
|
|
|
|
|
|
def apply_custom_formatting(doc):
|
|
"""Применяет дополнительное форматирование, которое не может быть обработано Pandoc."""
|
|
|
|
# Нумерация страниц (простой пример)
|
|
# Более сложные колонтитулы лучше настроить в reference.docx
|
|
for section in doc.sections:
|
|
section.footer.paragraphs[0].text = "\t" # Чтобы номер был по центру или справа, настройте табуляцию
|
|
|
|
# Добавление рамок к листингам кода, если они не были применены стилем
|
|
for paragraph in doc.paragraphs:
|
|
if 'листинг' in paragraph.text.lower() or 'listing' in paragraph.text.lower():
|
|
# Здесь можно применить стиль, который вы создали, например 'CodeListing'
|
|
# paragraph.style = 'CodeListing'
|
|
pass # Логика для добавления границ, если нужно
|
|
|
|
|
|
def markdown_to_docx(md_file, docx_file, reference_doc):
|
|
"""
|
|
Основная функция для конвертации Markdown в DOCX.
|
|
"""
|
|
# Шаг 1: Используем Pandoc для основной конвертации
|
|
pypandoc.convert_file(
|
|
md_file,
|
|
'docx',
|
|
outputfile=docx_file,
|
|
extra_args=[f'--reference-doc={reference_doc}', '--toc'] # --toc для создания оглавления
|
|
)
|
|
|
|
# Шаг 2: Открываем созданный документ с помощью python-docx для дальнейшей обработки
|
|
doc = Document(docx_file)
|
|
|
|
# Шаг 3: Вставляем титульный лист в начало документа
|
|
# Создаем новый пустой документ для титульного листа
|
|
title_doc = Document()
|
|
# Добавляем содержимое основного документа после титульного листа
|
|
for element in doc.element.body:
|
|
title_doc.element.body.append(element)
|
|
|
|
doc = title_doc
|
|
|
|
# Шаг 4: Применяем дополнительное форматирование
|
|
apply_custom_formatting(doc)
|
|
|
|
# Шаг 5: Сохраняем финальный документ
|
|
doc.save(docx_file)
|
|
print(f"Документ '{docx_file}' успешно создан.")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# --- НАСТРОЙКИ ---
|
|
markdown_input = 'my_report.md' # Имя вашего входного Markdown файла
|
|
docx_output = 'my_report.docx' # Имя выходного DOCX файла
|
|
reference_docx = 'samost1.docx' # Имя вашего эталонного документа
|
|
|
|
|
|
# Создаем пример Markdown файла для демонстрации
|
|
markdown_content = """
|
|
# Введение
|
|
|
|
Это введение в мою курсовую работу. Текст должен быть отформатирован с использованием стиля "Обычный".
|
|
|
|
# 1. Структура учебной работы
|
|
|
|
Здесь описывается структура работы.
|
|
|
|
## 1.1 Титульный лист
|
|
|
|
Титульный лист - это первая страница работы.
|
|
|
|
## 1.2 Содержание
|
|
|
|
Содержание включает в себя перечень всех разделов.
|
|
|
|
# 2. Оформление текста документа
|
|
|
|
Здесь описываются правила оформления текста.
|
|
|
|
- Первое правило
|
|
- Второе правило
|
|
- Третье правило
|
|
|
|
1. Нумерованный список 1
|
|
2. Нумерованный список 2
|
|
|
|
Листинг 1.1 – Пример кода
|
|
|
|
` ` `python
|
|
def hello_world():
|
|
print("Hello, World!")
|
|
` ` `
|
|
|
|
Таблица 1.1 - Пример таблицы
|
|
|
|
| Заголовок 1 | Заголовок 2 |
|
|
|-------------|-------------|
|
|
| Ячейка 1 | Ячейка 2 |
|
|
| Ячейка 3 | Ячейка 4 |
|
|
|
|
# Заключение
|
|
|
|
Это заключение.
|
|
"""
|
|
with open(markdown_input, 'w', encoding='utf-8') as f:
|
|
f.write(markdown_content)
|
|
|
|
# --- ЗАПУСК КОНВЕРТЕРА ---
|
|
markdown_to_docx(markdown_input, docx_output, reference_docx) |