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:
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:
- 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?) - 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);
}
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)? –
@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
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. –