Подтвердить что ты не робот

Создание PDF-документа для печати в Qt из шаблона

Я пишу приложение, когда пользователь вставляет данные в диалоговое окно (название документа, имя и адрес отправителя и т.д.), а затем мое приложение должно генерировать PDF файл из этих пользовательских данных.

PDF файл должен иметь определенный макет, что-то вроде этого:

введите описание изображения здесь

Я попытался сделать это с помощью QPdfWriter, но проблемы с выравниванием текста в pdf. Здесь мой код:

#include <QApplication>
#include <QtCore>
#include <QPrinter>
#include <QPdfWriter>
#include <QPainter>

QString currDate()
{
    QDate date = QDate::currentDate();
    return date.toString("dd.MM.yyyy");
}

void pdf(QString filename)
{
    QPdfWriter writer(filename);
    writer.setPageSize(QPagedPaintDevice::A4);
    writer.setPageMargins(QMargins(30, 30, 30, 30));

    QPainter painter(&writer);
    painter.setPen(Qt::black);
    painter.setFont(QFont("Times", 10));

    QRect r = painter.viewport();

    QString citydate = "City, ";
    citydate += currDate();

    painter.drawText(r, Qt::AlignRight, citydate);


QString sender = "COMPANY XYZ\n";
sender += "Random Street 12/314A\n";
sender += "123-1232 City\n";

painter.drawText(r, Qt::AlignLeft, sender);
    painter.end();
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    pdf("example1.pdf");

    return a.exec();
}

Дата, напечатанная в формате pdf, находится слева, но:

  • У меня есть проблемы с дальнейшим текстом - как "переместить" художника в разных местах, чтобы печатать также имя отправителя, название документа, и содержимое документа внутри страницы (это метод translate для художника, или это можно сделать проще?)
  • Я не знаю, как обрабатывать разрывы страниц, в случае, если содержимое документа будет очень длинным (будет распространяться на 2 и более страницах).

Спасибо

ИЗМЕНИТЬ

Я также пробовал подход QTextDocument, но его трудно было записать на любой документ, причем почти любой пример доступен в Интернете. Я пришел только с этим:

void pdf(QString filename)
{
    QPrinter printer(QPrinter::PrinterResolution);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setPaperSize(QPrinter::A4);
    printer.setOutputFileName(filename);
    printer.setPageMargins(QMarginsF(30, 30, 30, 30));

    QFont headerFont("Times New Roman", 8);
    QFont titleFont("Times New Roman", 14, QFont::Bold);

    QTextCharFormat txtformat = QTextCharFormat();


    QTextDocument doc;
    doc.setPageSize(printer.pageRect().size());

    QTextCursor* cursor = new QTextCursor(&doc);

    txtformat.setFont(headerFont);
    cursor->insertText("Company XYZ", txtformat);

    cursor->movePosition(QTextCursor::Right && QTextCursor::EndOfLine, QTextCursor::KeepAnchor, 1000);
    cursor->insertText(currDate(), txtformat);

    doc.print(&printer);
}
4b9b3361

Ответ 1

Существует несколько способов создания PDF-документа в Qt. Вы уже упомянули о двух из них. Я предлагаю некоторые улучшения для подхода QTextDocument. Вместо того, чтобы вручную писать QTextDocument, вы можете создать его из текста в формате HTML.

QString html =
"<div align=right>"
   "City, 11/11/2015"
"</div>"
"<div align=left>"
   "Sender Name<br>"
   "street 34/56A<br>"
   "121-43 city"
"</div>"
"<h1 align=center>DOCUMENT TITLE</h1>"
"<p align=justify>"
   "document content document content document content document content document content document content document content document content document content document content "
   "document content document content document content document content document content document content document content document content document content document content "
"</p>"
"<div align=right>sincerly</div>";

QTextDocument document;
document.setHtml(html);

QPrinter printer(QPrinter::PrinterResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setPaperSize(QPrinter::A4);
printer.setOutputFileName("/tmp/test.pdf");
printer.setPageMargins(QMarginsF(15, 15, 15, 15));

document.print(&printer);

Предупреждение: QTextDocument поддерживает ограниченное подмножество разметки HTML 4.