1+ import os
2+ import tempfile
3+
14from AnyQt import QtGui , QtCore , QtSvg
25from AnyQt .QtCore import QMimeData
36from AnyQt .QtWidgets import (
@@ -59,8 +62,8 @@ def write_image(cls, filename, scene):
5962 scene .render (painter , target , rect )
6063 except TypeError :
6164 scene .render (painter ) # QWidget.render() takes different params
62- cls ._save_buffer (buffer , filename )
6365 painter .end ()
66+ cls ._save_buffer (buffer , filename )
6467
6568 @classmethod
6669 def write (cls , filename , scene ):
@@ -139,6 +142,9 @@ def _get_target(scene, painter, buffer, source):
139142
140143 @staticmethod
141144 def _save_buffer (buffer , filename ):
145+ dev = buffer .outputDevice ()
146+ if dev is not None :
147+ dev .flush ()
142148 pass
143149
144150 @staticmethod
@@ -164,3 +170,38 @@ def write_image(cls, filename, scene):
164170 pass
165171
166172 super ().write_image (filename , scene )
173+
174+
175+ if hasattr (QtGui , "QPdfWriter" ):
176+ class PdfFormat (ImgFormat ):
177+ EXTENSIONS = ('.pdf' , )
178+ DESCRIPTION = 'Portable Document Format'
179+ PRIORITY = 110
180+
181+ @classmethod
182+ def write_image (cls , filename , scene ):
183+ # export via svg to temp file then print that
184+ # NOTE: can't use NamedTemporaryFile with delete = True
185+ # (see https://bugs.python.org/issue14243)
186+ fd , tmpname = tempfile .mkstemp (suffix = ".svg" )
187+ os .close (fd )
188+ try :
189+ SvgFormat .write_image (tmpname , scene )
190+ with open (tmpname , "rb" ) as f :
191+ svgcontents = f .read ()
192+ finally :
193+ os .unlink (tmpname )
194+
195+ svgrend = QtSvg .QSvgRenderer (QtCore .QByteArray (svgcontents ))
196+ vbox = svgrend .viewBox ()
197+ if not vbox .isValid ():
198+ size = svgrend .defaultSize ()
199+ else :
200+ size = vbox .size ()
201+ writer = QtGui .QPdfWriter (filename )
202+ writer .setPageSizeMM (QtCore .QSizeF (size ) * 0.282 )
203+ painter = QtGui .QPainter (writer )
204+ svgrend .render (painter )
205+ painter .end ()
206+ del svgrend
207+ del painter
0 commit comments