Piszę aplikację, gdy użytkownik wstawi dane w oknie dialogowym (tytuł dokumentu, nazwa i adres nadawcy itp.), A następnie moja aplikacja powinna wygenerować plik PDF z tych danych użytkownika.Utwórz dokument PDF do drukowania w Qt z szablonu
plik PDF powinien być zdefiniowany układ, coś takiego:
Próbowałem to zrobić z QPdfWriter
ale mają problemy Wyrównywanie tekstu w formacie pdf. Oto mój kod:
#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();
}
Data drukowane do PDF jest po lewej stronie, ale:
- mam kłopoty z dalszym tekście - jak „przenieść” malarza do różnych miejsc, aby wydrukować także nazwa nadawcy, tytuł dokumentu, i zawartość dokumentu na stronie (czy metoda malarki jest wystarczająca dla
translate
, czy może być prostsza?) - Nie wiem, jak obchodzić się z podziałem stron, na wypadek gdyby treść dokumentu będzie bardzo długi (rozprzestrzeni się na 2 lub więcej stronach)
Dzięki
EDIT
Próbowałem też podejście QTextDocument
, ale jej trudno napisać dowolny dokument, z niemal każdym dostępnym w internecie np. Wpadłem tylko na to:
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);
}
Dziękuję. Trzy rzeczy: 1) jak pozbyć się numerów stron? 3) czy mogę przenieść numery stron, na przykład, po lewej lub wyśrodkować? 3) Widzę, że twoje podejście obsługuje automatyczne dzielenie strony (przechodzi do nowej strony po zakończeniu starej strony), ale czy wiesz, jak osiągnąć to samo, używając 'QTextCursor' (moje drugie podejście)? –
@Brian Brown 1) Jeśli dokument nie jest paginowany, bieżący numer strony jest drukowany u dołu każdej strony. Dokument jest paginowany, jeśli określono rozmiar strony. Aby pozbyć się numerów stron, musisz ustawić rozmiar strony: 'document.setPageSize (printer.pageRect(). Size());'. 2) Pozycja numeru strony na sztywno, nie można go zmienić. 3) Strona obsługi 'QTextDocument' łamie się automatycznie, bez względu na sposób tworzenia dokumentu. – Meefte
Dziękuję. Użyłem twojego podejścia z metodą 'setHtml'. Chciałbym jednak wiedzieć, jak osiągnąć ten sam efekt z 'QTextCursor' i podobnymi klasami, ponieważ dokumenty Qt są do tego niewystarczające, przynajmniej dla mnie. –