2015-11-11 4 views
18

Scrivo un'applicazione quando l'utente inserisce i dati in una finestra di dialogo (titolo del documento, nome e indirizzo del mittente, ecc.) E la mia applicazione dovrebbe generare un file pdf da questi dati utente.Creazione di un documento PDF per la stampa in Qt dal modello

file PDF avrebbe dovuto definire il layout, qualcosa di simile:

enter image description here

ho provato a farlo con QPdfWriter ma hanno problemi l'allineamento del testo in pdf. Qui è il mio codice:

#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 stampato in pdf è a sinistra, ma:

  1. ho problemi con gli altri testi - come "muoversi" pittore di luoghi diversi, di stampare anche la nome del mittente, titolo del documento, e il contenuto del documento all'interno della pagina (è il metodo translate del pittore sufficiente o può essere più semplice?)
  2. Non so come gestire le interruzioni di pagina, nel caso il contenuto del documento sarà molto lungo (si diffonderà su 2 o più pagine)

Grazie

EDIT

Ho anche provato l'approccio QTextDocument, ma la sua difficile scrivere qualsiasi documento, con quasi tutti i esempio disponibili sul web. Sono arrivato solo con questo:

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); 
} 

risposta

8

Esistono diversi modi per creare un documento PDF in Qt. Ne hai già menzionato due. Propongo alcuni miglioramenti per l'approccio . Piuttosto che scrivere manualmente un QTextDocument, puoi crearlo dal testo in formato 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); 

Attenzione: QTextDocument sostenere un limited subset di HTML 4 markup.

+0

Grazie. Tre cose: 1) come sbarazzarsi dei numeri di pagina? 3) Posso spostare i numeri di pagina, ad esempio, a sinistra o al centro? 3) Vedo che il tuo approccio gestisce automaticamente le interruzioni di pagina (va alla nuova pagina quando finisce la vecchia pagina), tuttavia, sai come ottenere lo stesso usando 'QTextCursor' (il mio secondo approccio)? –

+2

@Brian Brown 1) Se il documento non è impaginato, il numero di pagina corrente viene stampato nella parte inferiore di ciascuna pagina. Il documento viene impaginato se si specificano le dimensioni della pagina. Quindi, per eliminare i numeri di pagina, è necessario impostare le dimensioni della pagina: 'document.setPageSize (printer.pageRect(). Size());'. 2) Posizione di un numero di pagina hardcoded, non è possibile modificarlo. 3) La pagina di handle 'QTextDocument' si interrompe automaticamente, indipendentemente dalla modalità di creazione del documento. – Meefte

+0

Grazie. Ho usato il tuo approccio con il metodo 'setHtml'. Tuttavia, mi piacerebbe sapere come ottenere lo stesso effetto con 'QTextCursor' e classi simili, dal momento che Qt docs è abbastanza insufficiente per questo, almeno per me. –

Problemi correlati