[Qgis-developer] Printing multi-page PDFs from QgsComposition object

fegyi001 fegyi001 at gmail.com
Tue Apr 2 03:59:00 PDT 2013


Dear Developers!

I'm writing a new module, in which I try to implement some codes to export
PDF files. The output looks like a simple Word document: only text, no maps.
For that, I created a QgsComposition object, and added everything to it (as
QgsComposerLabel objects) just like in case of map compositions. The export
to PDF works fine, except that I have no idea how to tell the module to
print multiple pages. I use the default A4 paper size, and sometimes the
text does not fit on a single page.

I defined a variable called "position" which starts from 0 and increases
every time a new line is added to the page. Since it is in millimeters, I
can always tell when a new page should be loaded.

Here is an excerpt of my code:

def savePDF(self):
    self.mapRenderer = qgis.utils.iface.mapCanvas().mapRenderer()
    self.c = QgsComposition(self.mapRenderer)
    self.c.setPaperSize(210.0, 297.0)

    #here I add all the text labels to the page

    self.savePDFFileName = QtGui.QFileDialog.getSaveFileName(self.dlg,
u'save as PDF', '.', 'PDF files (*.pdf)')
    self.printer = QPrinter()
    self.printer.setOrientation(QPrinter.Portrait)
    self.printer.setOutputFormat(QPrinter.PdfFormat)
    self.printer.setOutputFileName(self.savePDFFileName)
    self.printer.setPaperSize(QSizeF(self.c.paperWidth(),
self.c.paperHeight()), QPrinter.Millimeter)
    self.printer.setFullPage(True)
    self.printer.setPrintRange(0) #this is for printing all pages
    self.printer.setColorMode(QPrinter.Color)
    self.printer.setResolution(150)

    self.pdfPainter = QPainter(self.printer)
    self.paperRectMM = self.printer.pageRect(QPrinter.Millimeter)
    self.paperRectPixel = self.printer.pageRect(QPrinter.DevicePixel)
    self.c.render(self.pdfPainter, self.paperRectPixel, self.paperRectMM)
    self.pdfPainter.end()


I already spent a lot of time trying to figure it out. For example, at the
QgsComposition class reference page (
http://www.qgis.org/api/classQgsComposition.html ) I found some hints:
::setNumPages() and ::addPaperItem(), but when I try to invoke them they
don't work (error message says: 'QgsComposition' object has no attribute
'addPaperItem') which means that they are not implemented yet. Is it
possible that this can only be solved when a future QGIS release comes out?
For example, the .setNumPages says: "Note: added in version 1.9."

I also tried to go through the QPrinter class reference here:
http://qt-project.org/doc/qt-4.8/qprinter.html 
According to it, the QPrinter object has a .newPage() method ("Tells the
printer to eject the current page and to continue printing on a new page.
Returns true if this was successful; otherwise returns false"), but at this
point it didn't solve my problem.

Any advices are highly acknowledged! I'm a python newbie...

Thanks in advance,
              Gergely Padányi-Gulyás



--
View this message in context: http://osgeo-org.1560.n6.nabble.com/Printing-multi-page-PDFs-from-QgsComposition-object-tp5044041.html
Sent from the Quantum GIS - Developer mailing list archive at Nabble.com.


More information about the Qgis-developer mailing list