docx-generator/README.md
2026-04-29 07:15:22 +05:00

134 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 показать |