Create a PDF from Qt Creator
-
Hi,
i'm trying to create a PDF from Qt Creatori've tried with this code (Declarated QPainter and QPrinter):
printer.setOutputFormat(QPrinter::PdfFormat); printer.setOutputFileName("AAA.pdf"); QPainter painter; if (! painter.begin(&printer)) { // failed to open file qWarning("failed to open file, is it writable?"); return 1; } else { msg.setText("Printer Begin"); msg.exec(); } painter.drawText(10, 10, "Primo PDF Creato!"); painter.drawText(10, 30, "Test 1"); if (! printer.newPage()) { qWarning("failed in flushing page to disk, disk full?"); return 1; } else { msg.setText("Printer New Page"); msg.exec(); } painter.drawText(10, 10, "Test 2"); painter.end();
i had no errors but no PDF was created..
i've also tried with this other code (Declarated QPdfWriter and QPainter):
QFile f("AAA.pdf"); f.open(QIODevice::WriteOnly); QPdfWriter* writer = new QPdfWriter(&f); writer->setPageSize(QPagedPaintDevice::A4); QPainter* p = new QPainter(writer); p->drawText(QRect(100, 100, 2000, 200), "test"); writer->newPage(); p->drawText(QRect(100, 100, 2000, 200), "test"); delete p; delete writer; f.close();
No errors but..
No way.. PDF was not created!Anyone can tell me where i fail??
-
@TheCipo76 Are you sure the PDF file was not created? You're using a relative path, that means the file will be created in current working directory.
-
@TheCipo76 said in Create a PDF from Qt Creator:
setOutputFileName
Interesting. I use the QPrinter way, and the only difference to my code I spotted was that I explicitly set the page margins and resolution. Also, I assume that you open the file for writing in your first code just as you do it in the second one, right?
But try out the Text Edit example (in widgets\richtext) - it contains a PDF export.
-
@Asperamanca
No, i've followed a Video Tutorial and copy the same code
(https://www.youtube.com/watch?v=lA5D8b_QPxo)the only differences is that i've done it in a Dialog and not in MainWindows
i've already tried to create a new project and do it in MainWindows but the result is the same..
No PDf was Created
-
@TheCipo76
Hi
Code does look fine.
Could you try this sample ?
https://wiki.qt.io/Exporting_a_document_to_PDF
and see if you get pdf from that ? -
@TheCipo76
Hi
My guess would be that printer object goes out of scope ? -
@mrjj i've tried with this code:
qreal top=20, left=15, right=15, bottom=20; QPrinter printer(QPrinter::PrinterResolution); QPrintDialog dialog(&printer, this); if(dialog.exec() == QDialog::Accepted){ QPrinterInfo pinfo(printer); qDebug() << "Printer valid: " << printer.isValid(); qDebug() << "Printer Name: " << printer.printerName(); qDebug() << "Printer program: " << printer.printProgram(); qDebug() << "Is printer null: " << pinfo.isNull(); qDebug() << "Printer State: " << pinfo.state(); qDebug() << "Is printer default: " << pinfo.isDefault(); qDebug() << "Is printer remote: " << pinfo.isRemote(); } printer.setPaperSize(QPrinter::A4); printer.setPageMargins(left, top, right, bottom, QPrinter::Millimeter); printer.setOutputFormat(QPrinter::PdfFormat); printer.setOutputFileName("PrimoPDF.pdf"); QPainter painter; if (! painter.begin(&printer)) { // failed to open file qWarning("failed to open file, is it writable?"); return; } painter.drawText(10, 10, "Primo PDF Creato!"); painter.drawText(10, 30, "Test 1"); if (! printer.newPage()) { qWarning("failed in flushing page to disk, disk full?"); return; } painter.drawText(10, 10, "Test 2"); painter.end();
and this is the result:
Printer valid: true
Printer Name: "Samsung_CLP_620_Series__SEC001599489B1A_"
Printer program: ""
Is printer null: false
Printer State: 0
Is printer default: true
Is printer remote: falsePrinter seem to be OK
now the previous message about QPainter were not showed..
-
@TheCipo76
That looks very ok.
But no PDF (PrimoPDF.pdf) is produced ?Have a look at this code. it prints screen shots.
Looks very similar to yours.void printv2(QPixmap& pix) { QPrinter printer(QPrinter::HighResolution); printer.setOrientation(QPrinter::Landscape); printer.setOutputFormat(QPrinter::PdfFormat); printer.setPaperSize(QPrinter::A4); printer.setOutputFileName("e:/test.pdf"); QPainter painter; painter.begin(&printer); double xscale = printer.pageRect().width() / double(pix.width()); double yscale = printer.pageRect().height() / double(pix.height()); double scale = qMin(xscale, yscale); painter.translate(printer.paperRect().x() + printer.pageRect().width() / 2, printer.paperRect().y() + printer.pageRect().height() / 2); painter.scale(scale, scale); painter.translate(-pix.width() / 2, -pix.height() / 2); painter.drawPixmap(0, 0, pix); painter.end(); } void MainWindow::on_pushButton_released() { QPixmap pix = QPixmap::grabWindow(QApplication::desktop()->winId()); printv2(pix); }
-
@TheCipo76
Yep and i get a e:/test.pdf so not really sure why you dont get any.
does it try to print to real printer ?Can you try
void printv3() { QPrinter printer(QPrinter::HighResolution); printer.setOrientation(QPrinter::Landscape); printer.setOutputFormat(QPrinter::PdfFormat); printer.setPaperSize(QPrinter::A4); printer.setOutputFileName("test.pdf"); QPainter painter; painter.begin(&printer); painter.drawText( 200,200, "HELLO" ); painter.end(); }
That give me a test.pdf in the build folder
and expected result
-
@TheCipo76
Really odd. I cant guess sorry. Sample works here.
You use the code directly as is ? -
@mrjj Yes, copied and pasted
QPrinter printer(QPrinter::HighResolution); printer.setOrientation(QPrinter::Landscape); printer.setOutputFormat(QPrinter::PdfFormat); printer.setPaperSize(QPrinter::A4); printer.setOutputFileName("test.pdf"); QPainter painter; painter.begin(&printer); painter.drawText( 200,200, "HELLO" ); painter.end();
-
and you also searched for test.pdf to make sure
its not created any where else ? -
@TheCipo76
Very odd.
Can you try this code. it let u select save location
if that dont work. something up with your Qt.void printv4() { QPrinter printer(QPrinter::HighResolution); printer.setOrientation(QPrinter::Landscape); printer.setOutputFormat(QPrinter::PdfFormat); printer.setPaperSize(QPrinter::A4); QString fileName = QFileDialog::getSaveFileName(0,"file", "c:\\", "pdf (*.pdf)"); printer.setOutputFileName(fileName); QPainter painter; painter.begin(&printer); painter.drawText( 200,200, "HELLO" ); painter.end(); }