2015-11-11 22 views
18

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:

enter image description here

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:

  1. 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?)
  2. 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); 
} 

Odpowiedz

8

Istnieje kilka sposobów na utworzenie dokumentu PDF w Qt. Wspomniałeś już o dwóch z nich. Proponuję pewne ulepszenie dla podejścia QTextDocument. Zamiast ręcznie pisać QTextDocument, możesz utworzyć go z tekstu w formacie 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); 

Ostrzeżenie: QTextDocument wspierać limited subset HTML 4 znaczników.

+0

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)? –

+2

@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

+0

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. –