Create a PDF from Qt Creator



  • Hi,
    i'm trying to create a PDF from Qt Creator

    i'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??


  • Moderators

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



  • @jsulm i've searhced with finder and this is the result

    0_1542370138910_Schermata 2018-11-16 alle 13.08.09.png



  • @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


  • Qt Champions 2017

    @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 ?



  • @mrjj Yes,
    with this code PDF was created



  • @TheCipo76

    when i launch pdf print in Application Output i saw this message:

    QPainter::begin(): Returned false
    QPainter::setPen: Painter not active
    QPainter::end: Painter not active, aborted

    Any suggestion to fix it??


  • Qt Champions 2017

    @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: false

    Printer seem to be OK

    now the previous message about QPainter were not showed..


  • Qt Champions 2017

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


  • @mrjj No, "PrimoPDF.pdf" wasn't created..

    the code you have posted is very similar..


  • Qt Champions 2017

    @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
    alt text

    and expected result
    alt text



  • @mrjj i've tried with no luck

    test.pdf was not created..


  • Qt Champions 2017

    @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();
    

  • Qt Champions 2017

    and you also searched for test.pdf to make sure
    its not created any where else ?




  • Qt Champions 2017

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


  • @mrjj

    0_1542387477878_Schermata 2018-11-16 alle 17.57.19.png 0_1542387485333_Schermata 2018-11-16 alle 17.57.30.png

    Finally works!!!!!! Great!!!
    I don't know why but Works!!!!

    Thank you very much!!



  • This post is deleted!

  • Qt Champions 2017

    Super :)
    So on mac it seems the file go somewhere else
    if no path. maybe a read only place.
    So when we tell the exact location , it does work :)



  • @TheCipo76 said in Create a PDF from Qt Creator:

    printer.setOutputFileName("PrimoPDF.pdf");

    When launched from QtCreator, the default working directory is set to:
    MyApp/Contents/MacOS/

    When launched from the finder, the path is usely the user directory, but actualy it is the root directory (/) and obviously nothing is written (wrong permissions)



  • @mrjj said in Create a PDF from Qt Creator:

    Super :)
    So on mac it seems the file go somewhere else if no path

    IIRC the standard path is

    /Users/yourUserName/Library/Application Support


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.