docx-generator/README.md

134 lines
5.8 KiB
Markdown
Raw Permalink Normal View History

2026-04-29 02:15:22 +00:00
# DocxWizard — Модуль пошагового создания Word-документов
## Стек технологий
| Компонент | Инструмент | Зачем |
|--------------------|-------------------------------|---------------------------------------------|
| Язык | C++17 | Основной язык проекта |
| GUI + логика | Qt5 (Widgets) | Уже используется в проекте |
| Генерация DOCX | Qt5 (QZipWriter) или QuaZip | DOCX — это ZIP+XML; Qt умеет это нативно |
| Изображения | Qt5 QFile | Чтение и вставка бинарных данных изображений |
**Внешних зависимостей нет** (кроме Qt5, которая уже есть).
---
## Архитектура
```
main.cpp
└── MainWindow ← Главное окно; редактор строк-шаблонов
└── DocumentWizard ← Пошаговый диалог (QDialog)
├── parseTemplates() ← Читает строки шаблона → список шагов
├── showStep() ← Показывает нужный UI для шага
├── applyCurrentStep() ← Передаёт данные в DocxBuilder
└── DocxBuilder ← Генерирует .docx файл
├── addHeading()
├── addParagraph()
├── addTable()
├── addImage()
└── save() ← Записывает ZIP/XML в файл
```
---
## Формат строк шаблона
Строки шаблона «скармливаются» программе в начале работы.
Каждая строка задаёт один шаг мастера:
```
тип|Подсказка для пользователя|Вариант1;Вариант2;Вариант3
```
### Типы элементов
| Тип | Результат в документе | Примечание |
|----------|-------------------------------|--------------------------------------|
| heading1 | Заголовок 1 (18pt, жирный) | Times New Roman |
| heading2 | Заголовок 2 (15pt, жирный) | Times New Roman |
| heading3 | Заголовок 3 (13pt, жирный) | Times New Roman |
| text | Обычный абзац (12pt) | Times New Roman |
| table | Таблица с заголовками | UI для ввода строк |
| image | Встроенное изображение | PNG/JPG, размер в см |
### Пример шаблона
```
heading1|Введите название документа|Технический отчёт;Пояснительная записка
heading2|Название раздела «Введение»|1. Введение;1. Общие сведения
text|Напишите вводный абзац|Настоящий документ описывает…;В данной работе…
table|Заполните таблицу характеристик|
image|Вставьте схему архитектуры|
heading2|Заключение|4. Заключение;4. Выводы
text|Напишите заключение|В результате работы…;Таким образом…
```
---
## Сборка
```bash
cd docx_module
qmake DocxWizard.pro
make # Linux/macOS
# или
nmake # Windows (MSVC)
```
### Альтернатива QZipWriter → QuaZip
Если Qt5 собрана без приватных заголовков (`-private`):
```bash
# Ubuntu/Debian
sudo apt install libquazip5-dev
# или vcpkg
vcpkg install quazip
```
Затем в `DocxBuilder.cpp` замените:
```cpp
// Было:
#include <QtCore/private/qzipwriter_p.h>
// Стало:
#include <quazip/quazip.h>
#include <quazip/quazipfile.h>
```
И адаптируйте метод `DocxBuilder::save()` — используйте `QuaZip` + `QuaZipFile`
вместо `QZipWriter`. API очень похожи.
---
## Интеграция в существующий Qt5 проект
1. Скопируйте `DocxBuilder.h/.cpp` и `DocumentWizard.h/.cpp` в свой проект.
2. В `.pro` добавьте:
```
QT += core-private # для QZipWriter
SOURCES += DocxBuilder.cpp DocumentWizard.cpp
HEADERS += DocxBuilder.h DocumentWizard.h
```
3. Используйте из кода:
```cpp
QStringList tmpl = loadTemplateFromFile("template.txt");
DocumentWizard dlg(tmpl, this);
if (dlg.exec() == QDialog::Accepted)
qDebug() << "Сохранено:" << dlg.outputFilePath();
```
---
## Расширение функциональности
| Задача | Куда добавить |
|--------------------------------|------------------------------------------|
| Нумерованные списки | `DocxBuilder::addList()` |
| Верхний/нижний колонтитул | `DocxBuilder::buildDocumentXml()``<w:sectPr>` |
| Оглавление | XML-элемент `<w:fldChar>` с `TOC` |
| Сохранение шаблона в файл | `QSettings` или простой `.txt` |
| Предпросмотр документа | LibreOffice → конвертировать в PDF → показать |