Combine Multiple Images Into a Single PDF
-
wrote on 30 Jun 2016, 18:29 last edited by
@geor :-)
-
@geor :-)
wrote on 20 Jul 2016, 19:53 last edited by@Wieland I keep getting qpainter::begin() reutnr false
I am even using your exact code
const QString fileName("C:/Qt"); const QImage image("C:/Users/georg/Desktop/testPdf/Untitled.jpg"); const QPoint imageCoordinates(0,0); QPdfWriter pdfWriter(fileName); pdfWriter.setPageSize(QPagedPaintDevice::A1); QPainter painter(&pdfWriter); for (int i=0; i<3; ++i) { painter.drawImage(imageCoordinates, image); pdfWriter.newPage(); qDebug()<<2; }
except for the page size becuase I am using qt 5.2.1
do you have any idea why ebcuase I cannot figure it out the debug still runs i just get the eror and it does not save
-
@Wieland I keep getting qpainter::begin() reutnr false
I am even using your exact code
const QString fileName("C:/Qt"); const QImage image("C:/Users/georg/Desktop/testPdf/Untitled.jpg"); const QPoint imageCoordinates(0,0); QPdfWriter pdfWriter(fileName); pdfWriter.setPageSize(QPagedPaintDevice::A1); QPainter painter(&pdfWriter); for (int i=0; i<3; ++i) { painter.drawImage(imageCoordinates, image); pdfWriter.newPage(); qDebug()<<2; }
except for the page size becuase I am using qt 5.2.1
do you have any idea why ebcuase I cannot figure it out the debug still runs i just get the eror and it does not save
@geor said:
const QString fileName("C:/Qt");
that is the actual filename ?
I would expect something like
const QString fileName("c:/mydoc.pdf"); -
wrote on 20 Jul 2016, 20:08 last edited by
To add to what @mrjj said, do you have write access to
C:/
? -
@geor said:
const QString fileName("C:/Qt");
that is the actual filename ?
I would expect something like
const QString fileName("c:/mydoc.pdf"); -
To add to what @mrjj said, do you have write access to
C:/
?wrote on 20 Jul 2016, 20:57 last edited byThis post is deleted! -
To add to what @mrjj said, do you have write access to
C:/
?wrote on 20 Jul 2016, 21:03 last edited by@Wieland
once again thank you for your help it worked when I switch to the drive where the build is saved .However for some reason it is 4 empty pages maybe it's becuase of the size or something I'll try another image and see but again thank you
-
@geor
I think its just a path thingvoid writePdf() { const QString fileName("e:/mydoc.pdf"); QPdfWriter pdfWriter(fileName); pdfWriter.setPageSize(QPageSize(QPageSize::A4)); QPainter painter(&pdfWriter); for (int i=0; i<3; ++i) { painter.drawPixmap(QRect(0,0,pdfWriter.logicalDpiX()*8.3,pdfWriter.logicalDpiY()*11.7), QPixmap("e:/truck.png")); pdfWriter.newPage(); } } works here. makes PDF on e:
-
@Wieland
once again thank you for your help it worked when I switch to the drive where the build is saved .However for some reason it is 4 empty pages maybe it's becuase of the size or something I'll try another image and see but again thank you
@geor
hi
You will / might need to scale the picture or its really small. -
wrote on 21 Jul 2016, 21:10 last edited by
@mrjj one more question lol
the size of my widget is too big to fit well on a A4 paper without looking deformed. So I want to break the layout of it's parent, resize my widget it and then take it's pixmap to put it in an A4 so it is not deformed (with the grab function) but the problem is I can't break the layout of the parent i can only delete (in code) and when I delete it it deletes everything in it any tips?
-
@mrjj one more question lol
the size of my widget is too big to fit well on a A4 paper without looking deformed. So I want to break the layout of it's parent, resize my widget it and then take it's pixmap to put it in an A4 so it is not deformed (with the grab function) but the problem is I can't break the layout of the parent i can only delete (in code) and when I delete it it deletes everything in it any tips?
@geor
Hi you can use the takeAt method to get your widget back from a layout.
But maybe you can just ask the widget to render directly?
it has a render function that can draw itself to anything you like.
http://doc.qt.io/qt-5/qwidget.html#render -
@geor
Hi you can use the takeAt method to get your widget back from a layout.
But maybe you can just ask the widget to render directly?
it has a render function that can draw itself to anything you like.
http://doc.qt.io/qt-5/qwidget.html#renderwrote on 22 Jul 2016, 14:44 last edited byit doesn't seem to chnage much unless I am using it wrong? here is my code 1870 and 994 is the size of my widget.making the pixmap the same as the size of my widget gives me excatly the same ouput as before so i made it smaller it's better but cuts most of the widget out
ui->page1->setBackgroundRole(QPalette::BrightText); QPixmap pixMap1(600,900); ui->page1->render(&pixMap1,QPoint(),QRegion(0,0,1870,994)); const QString fileName("D:/mydoc2.pdf"); QPdfWriter pdfWriter(fileName); pdfWriter.setPageSize(QPagedPaintDevice::A4); QPainter painter(&pdfWriter); painter.drawPixmap(QRect(0,0,pdfWriter.logicalDpiX()*8.3,pdfWriter.logicalDpiY()*11.7), pixMap1); pdfWriter.newPage();
-
it doesn't seem to chnage much unless I am using it wrong? here is my code 1870 and 994 is the size of my widget.making the pixmap the same as the size of my widget gives me excatly the same ouput as before so i made it smaller it's better but cuts most of the widget out
ui->page1->setBackgroundRole(QPalette::BrightText); QPixmap pixMap1(600,900); ui->page1->render(&pixMap1,QPoint(),QRegion(0,0,1870,994)); const QString fileName("D:/mydoc2.pdf"); QPdfWriter pdfWriter(fileName); pdfWriter.setPageSize(QPagedPaintDevice::A4); QPainter painter(&pdfWriter); painter.drawPixmap(QRect(0,0,pdfWriter.logicalDpiX()*8.3,pdfWriter.logicalDpiY()*11.7), pixMap1); pdfWriter.newPage();
@geor
hi
Sorry, didn't read the right docs.
The rect is for clipping not resize the widget.
So render will not help you to render it smaller.so yes, i guess to render it in different size, you must take widget out , call resize +render and put it back it.
Not sure how well it will work if there is other stuff in the layout.
If sole widget, it should work ok. -
@geor
hi
Sorry, didn't read the right docs.
The rect is for clipping not resize the widget.
So render will not help you to render it smaller.so yes, i guess to render it in different size, you must take widget out , call resize +render and put it back it.
Not sure how well it will work if there is other stuff in the layout.
If sole widget, it should work ok.wrote on 25 Jul 2016, 15:38 last edited by@mrjj Yeah I tried this method and It works but it's not perfect even if I resize the widget to the size of an A4 and then take it's pixmap fore some reason in the pdf it loses some quality (it looks a lot better in the user interface then in the pdf )even tho they are both the same size.I tried different functions from the painter class to draw the pixamp but the all seam the same not so good .If I draw the pixmap withouth any scaling it is very small in the pdf .. any ideas?
-
@mrjj Yeah I tried this method and It works but it's not perfect even if I resize the widget to the size of an A4 and then take it's pixmap fore some reason in the pdf it loses some quality (it looks a lot better in the user interface then in the pdf )even tho they are both the same size.I tried different functions from the painter class to draw the pixamp but the all seam the same not so good .If I draw the pixmap withouth any scaling it is very small in the pdf .. any ideas?
@geor
hi , have you tried to render it really large and then
scale down to fit A4? -
@geor
well a screen is 72/96 DPI
and a printer is 600/1200/2400 DPI
so images do get really small.As far as I remember, QPdfWriter have some setting for pdf resolution.
maybe it can produce better output. -
@geor
well a screen is 72/96 DPI
and a printer is 600/1200/2400 DPI
so images do get really small.As far as I remember, QPdfWriter have some setting for pdf resolution.
maybe it can produce better output. -
@geor
maybe you could try to scale it before
drawing it to pdf.
the scale function can be adjusted to aim for quality
http://doc.qt.io/qt-5/qpixmap.html#scaled
with Qt::SmoothTransformationnote. it returns the scaled pixmap not modify the original.
so something like
mypixmap = mypixmap.scaled(xx)