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

5.8 KiB
Raw Permalink Blame History

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|Напишите заключение|В результате работы…;Таким образом…

Сборка

cd docx_module
qmake DocxWizard.pro
make          # Linux/macOS
# или
nmake         # Windows (MSVC)

Альтернатива QZipWriter → QuaZip

Если Qt5 собрана без приватных заголовков (-private):

# Ubuntu/Debian
sudo apt install libquazip5-dev

# или vcpkg
vcpkg install quazip

Затем в DocxBuilder.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. Используйте из кода:
    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 → показать