def exportPDF(self, view, file_name, width, height): pdf = QPrinter() pdf.setOutputFormat(QPrinter.PdfFormat) pdf.setPrintRange(QPrinter.AllPages) pdf.setOrientation(QPrinter.Portrait) pdf.setResolution(QPrinter.HighResolution) pdf.setPaperSize(QSizeF(width, height), QPrinter.Point) pdf.setFullPage(True) pdf.setOutputFileName(file_name) view.mainFrame().print_(pdf) QApplication.restoreOverrideCursor()
def print_to_pdf(self, path, paper_size = (8.5, 11.0), paper_margins = (0, 0, 0, 0), paper_units = QPrinter.Inch, zoom_factor = 1.0, ): """Saves page as a pdf file. See qt4 QPrinter documentation for more detailed explanations of options. :param path: The destination path. :param paper_size: A 2-tuple indicating size of page to print to. :param paper_margins: A 4-tuple indicating size of each margin. :param paper_units: Units for pager_size, pager_margins. :param zoom_factor: Scale the output content. """ assert len(paper_size) == 2 assert len(paper_margins) == 4 printer = QPrinter(mode = QPrinter.ScreenResolution) printer.setOutputFormat(QPrinter.PdfFormat) printer.setPaperSize(QtCore.QSizeF(*paper_size), paper_units) printer.setPageMargins(*(paper_margins + (paper_units,))) printer.setFullPage(True) printer.setOutputFileName(path) if self.webview is None: self.webview = QtWebKit.QWebView() self.webview.setPage(self.page) self.webview.setZoomFactor(zoom_factor) self.webview.print_(printer)
def __createPdf(self, savePath): """ Diese Funktion druckt den Charakter in ein PDF-Dokument. """ # Wenn Unterverzeichnis nicht existiert, erstelle es dirname = os.path.dirname(savePath) if not os.path.exists(dirname): os.makedirs(dirname) printer = QPrinter(QPrinter.PrinterResolution) #printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setPaperSize(QPrinter.A4) printer.setFullPage(True) printer.setOutputFileName(savePath) drawSheet = RenderSheet(self.__storage, self.__character, printer, self) try: drawSheet.createSheets() except ErrSpeciesNotExisting as e: MessageBox.exception(self, e.message, e.description)
def print_pdf(self): if self.deck is not None: #Setting the printer printer = QPrinter(QPrinter.HighResolution) printer.setOutputFormat(QPrinter.PdfFormat) printer.setOrientation(getattr(QPrinter, "Portrait")) printer.setOutputFileName(self.path) printer.setPaperSize(getattr(QPrinter, self.paper)) printer.setFullPage(True) guide = self.max_cards() printer.setOrientation(getattr(QPrinter, guide["orientation"])) print guide, self.card_size #Start printing with QPainter(printer) as paint: ind = 0 resol = printer.resolution() for c in self.deck: c.resize(self.card_size[0], self.card_size[1]) if ind == guide["max"]: printer.newPage() ind = 0 col = ind % guide["horizontal"] fil = ind // guide["horizontal"] print ind, fil, col target = QRectF((col)*self.card_size[0]*resol, (fil)*self.card_size[1]*resol, self.card_size[0]*resol, self.card_size[1]*resol) self.preview_card(c) self.scene.render(paint, target=target, source=QRectF(0,0,c.width(),c.height())) ind += 1
def print_to_pdf( self, path, paper_size=(8.5, 11.0), paper_margins=(0, 0, 0, 0), paper_units=QPrinter.Inch, zoom_factor=1.0, ): """Saves page as a pdf file. See qt4 QPrinter documentation for more detailed explanations of options. :param path: The destination path. :param paper_size: A 2-tuple indicating size of page to print to. :param paper_margins: A 4-tuple indicating size of each margin. :param paper_units: Units for pager_size, pager_margins. :param zoom_factor: Scale the output content. """ assert len(paper_size) == 2 assert len(paper_margins) == 4 printer = QPrinter(mode=QPrinter.ScreenResolution) printer.setOutputFormat(QPrinter.PdfFormat) printer.setPaperSize(QtCore.QSizeF(*paper_size), paper_units) printer.setPageMargins(*(paper_margins + (paper_units, ))) printer.setFullPage(True) printer.setOutputFileName(path) if self.webview is None: self.webview = QtWebKit.QWebView() self.webview.setPage(self.page) self.webview.setZoomFactor(zoom_factor) self.webview.print_(printer)
def plotPDF(self, width, height, output_file, units = "pixels", _plotting_object = None): """Plots the data specified in the current input file as a page in a PDF file with the given width and height, writing the output to the specified output file. The optional units argument specifies the units used to measure the plot size; by default, pixels are used, but "cm", "mm" and "in" are also acceptable. Returns the QPrinter object used to write the file.""" pdf = QPrinter() pdf.setOutputFormat(QPrinter.PdfFormat) pdf.setOutputFileName(output_file) if units == "in": width = pdf.logicalDpiX() * width height = pdf.logicalDpiY() * height elif units == "cm": width = pdf.logicalDpiX() * (width / 2.54) height = pdf.logicalDpiY() * (height / 2.54) elif units == "mm": width = pdf.logicalDpiX() * (width / 25.4) height = pdf.logicalDpiY() * (height / 25.4) elif units != "pixels": raise BDianaError, "Unknown units specified to plotPDF: %s" % units pdf.setPaperSize(QSizeF(width, height), QPrinter.DevicePixel) pdf.setFullPage(True) return self._plot(width, height, pdf, _plotting_object)[0]
def printWindow(self, printer=None): if not printer: printer = QPrinter() printer.setFullPage(True) printer.setPageSize(QPrinter.A4) dialog = QPrintDialog(printer, self) dialog.setWindowTitle(QCoreApplication.translate('QwtPlot', 'Print Document')) if dialog.exec_() != QDialog.Accepted: return self.plot.print_(printer, QwtPlotPrintFilter())
def __saveAsPDF( self, fileName ): " Saves the flowchart as an PDF file " printer = QPrinter() printer.setOutputFormat( QPrinter.PdfFormat ) printer.setPaperSize( QSizeF( self.scene.width(), self.scene.height() ), QPrinter.Point ) printer.setFullPage( True ) printer.setOutputFileName( fileName ) painter = QPainter( printer ) self.scene.render( painter ) painter.end() return
def __saveAsPDF(self, fileName): " Saves the flowchart as an PDF file " printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setPaperSize(QSizeF(self.scene.width(), self.scene.height()), QPrinter.Point) printer.setFullPage(True) printer.setOutputFileName(fileName) painter = QPainter(printer) self.scene.render(painter) painter.end() return
class WebKitPDF ( QObject ): def __init__ ( self, url, dest ): QObject.__init__ ( self ) self.dest = dest self.page = QtWebKit.QWebPage ( self ) self.mainFrame = self.page.mainFrame() self.mainFrame.load ( QUrl ( url ) ) # Settings # Disable the scrollbars self.mainFrame.setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff) self.mainFrame.setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff) self.connect ( self.page, SIGNAL ( "loadProgress(int)" ), self.loadProgress ) self.connect ( self.page, SIGNAL ( "loadFinished(bool)" ), self.renderPDF ) def loadProgress ( self, progress ): print "Progress: ", progress def renderPDF ( self, status ): print "Load finished with status: ", status print "Rendering PDF ..." contentsSize = self.mainFrame.contentsSize() contentsSize.setWidth(1280) self.page.setViewportSize ( contentsSize ) self.printer = QPrinter ( QPrinter.PrinterResolution ) #self.printer = QPrinter ( QPrinter.ScreenResolution ) self.printer.setOutputFormat ( QPrinter.PdfFormat ) #self.printer.setPaperSize ( QPrinter.A4 ) self.printer.setFullPage( True ) self.printer.setPaperSize ( QSizeF( contentsSize ), QPrinter.DevicePixel ) self.printer.setOrientation ( QPrinter.Portrait ) self.printer.setOutputFileName ( self.dest ) self.painter = QPainter ( self.printer ) self.painter.setRenderHint ( QPainter.Antialiasing ) self.mainFrame.render ( self.painter ) self.painter.end() app = QtGui.QApplication.instance() app.exit ( 0 )
def printWindow(self, printer=None): if not printer: printer = QPrinter() printer.setFullPage(True) printer.setPageSize(QPrinter.A4) dialog = QPrintDialog(printer, self) dialog.setWindowTitle(QCoreApplication.translate('Graphics', 'Print Document')) if dialog.exec_() != QDialog.Accepted: return # FIXME: on windows the resolutions seems to be very low, why? #printer.setResolution(600) painter = QPainter(printer) painter.setRenderHint(QPainter.Antialiasing) self.graphicsView.scene().render(painter)
def _exportCompositionAsPDF(self,composition,filePath): """ Render the composition as a PDF file. """ printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName(filePath) printer.setPaperSize(QSizeF(composition.paperWidth(),composition.paperHeight()),QPrinter.Millimeter) printer.setFullPage(True) printer.setColorMode(QPrinter.Color) printer.setResolution(composition.printResolution()) #Use painter to send output to printer pdfPainter = QPainter(printer) paperRectMM = printer.pageRect(QPrinter.Millimeter) paperRectPixel = printer.pageRect(QPrinter.DevicePixel) composition.render(pdfPainter,paperRectPixel,paperRectMM) pdfPainter.end()
def _exportCompositionAsPDF(self, composition, filePath): """ Render the composition as a PDF file. """ printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName(filePath) printer.setPaperSize( QSizeF(composition.paperWidth(), composition.paperHeight()), QPrinter.Millimeter) printer.setFullPage(True) printer.setColorMode(QPrinter.Color) printer.setResolution(composition.printResolution()) #Use painter to send output to printer pdfPainter = QPainter(printer) paperRectMM = printer.pageRect(QPrinter.Millimeter) paperRectPixel = printer.pageRect(QPrinter.DevicePixel) composition.render(pdfPainter, paperRectPixel, paperRectMM) pdfPainter.end()
class WebKitPDF(QObject): def __init__(self, url, dest): QObject.__init__(self) self.dest = dest self.page = QtWebKit.QWebPage(self) self.mainFrame = self.page.mainFrame() self.mainFrame.load(QUrl(url)) self.connect(self.page, SIGNAL("loadProgress(int)"), self.loadProgress) self.connect(self.page, SIGNAL("loadFinished(bool)"), self.renderPDF) def loadProgress(self, progress): print "Progress: ", progress def renderPDF(self, status): print "Load finished with status: ", status print "Rendering PDF ..." contentsSize = self.mainFrame.contentsSize() self.page.setViewportSize(contentsSize) self.printer = QPrinter(QPrinter.PrinterResolution) #self.printer = QPrinter ( QPrinter.ScreenResolution ) self.printer.setOutputFormat(QPrinter.PdfFormat) #self.printer.setPaperSize ( QPrinter.A4 ) self.printer.setFullPage(True) self.printer.setPaperSize(QSizeF(contentsSize), QPrinter.DevicePixel) self.printer.setOrientation(QPrinter.Portrait) self.printer.setOutputFileName(self.dest) self.painter = QPainter(self.printer) self.painter.setRenderHint(QPainter.Antialiasing) self.mainFrame.render(self.painter) self.painter.end() app = QtGui.QApplication.instance() app.exit(0)
def __createPdf(self, savePath): """ Diese Funktion druckt den Charakter in ein PDF-Dokument. """ # Wenn Unterverzeichnis nicht existiert, erstelle es dirname = os.path.dirname(savePath) if not os.path.exists(dirname): os.makedirs(dirname) printer = QPrinter(QPrinter.PrinterResolution) #printer = QPrinter() printer.setOutputFormat( QPrinter.PdfFormat ) printer.setPaperSize( QPrinter.A4 ) printer.setFullPage( True ) printer.setOutputFileName( savePath ) drawSheet = RenderSheet( self.__storage, self.__character, printer, self ) try: drawSheet.createSheets() except ErrSpeciesNotExisting as e: MessageBox.exception( self, e.message, e.description )
class BatchPlottingDialog(QDialog): """ Class for batch plotting dialog """ def __init__(self, iface, batch_plotting): """ Initialize dialog data and event handlers """ super(BatchPlottingDialog, self).__init__() self.ui = Ui_BatchPlottingDialog() self.ui.setupUi(self) self.iface = iface self.ui.OutputTab.setCurrentIndex(2) # if batch_plotting is True -> plotting by selected polygons # False -> plot map canvas self.batch_plotting = batch_plotting if not self.batch_plotting: self.setWindowTitle(tr("Plot by Template")) self.ui.OutputTab.setTabEnabled(0, False) self.ui.OutputTab.setTabEnabled(1, False) # event handlers self.ui.PlotButton.clicked.connect(self.onPlotButton) self.ui.TempDirButton.clicked.connect(self.onTempDirButton) self.ui.CloseButton.clicked.connect(self.onCloseButton) self.ui.TemplateList.setSortingEnabled(True) # set paths self.pdfpath = "" if self.batch_plotting: self.ui.OutputPDFEdit.setText( QgsAtlasComposition(None).filenamePattern()) self.ui.SingleFileCheckbox.stateChanged.connect( self.changedSingleFileCheckbox) else: # set scale to map canvas scale self.ui.ScaleCombo.insertItem( 0, "%d" % round(self.iface.mapCanvas().scale())) self.ui.ScaleCombo.insertItem(0, "<extent>") self.ui.ScaleCombo.setCurrentIndex(0) self.printer = None def showEvent(self, event): """ Reset dialog when receives a show event. """ self.templatepath = QSettings().value( "SurveyingCalculation/template_dir", config.template_dir) self.fillLayersCombo() self.fillTemplateList() def fillLayersCombo(self): """ Fill the polygon layers combobox. """ oldSelectedLayer = self.ui.LayersComboBox.itemText( self.ui.LayersComboBox.currentIndex()) self.ui.LayersComboBox.clear() # if batch plotting is false only map canvas will be in the list if not self.batch_plotting: self.ui.LayersComboBox.addItem(tr("<Map view>")) self.ui.LayersComboBox.setCurrentIndex(0) return # if batch plotting is true fill layers combo polygon_layers = get_vector_layers_by_type(QGis.Polygon) if polygon_layers is None: return for layer in polygon_layers: self.ui.LayersComboBox.addItem(layer.name(), layer) # get current layer name try: actlayer_name = self.iface.activeLayer().name() except (AttributeError): actlayer_name = "" if self.ui.LayersComboBox.findText(oldSelectedLayer) == -1: self.ui.LayersComboBox.setCurrentIndex( self.ui.LayersComboBox.findText(actlayer_name)) else: self.ui.LayersComboBox.setCurrentIndex( self.ui.LayersComboBox.findText(oldSelectedLayer)) def fillTemplateList(self): """ Fill the listbox of composer template files. """ if self.ui.TemplateList.currentItem() is not None: oldSelectedTemplate = self.ui.TemplateList.currentItem().text() else: oldSelectedTemplate = "" self.ui.TemplateList.clear() tempdir = QDir(self.templatepath) if tempdir.exists(): fileinfolist = tempdir.entryInfoList( ["*.qpt"], QDir.Files | QDir.NoDotAndDotDot | QDir.NoSymLinks, QDir.NoSort) for fi in fileinfolist: item = QListWidgetItem(fi.fileName()) self.ui.TemplateList.addItem(item) if fi.fileName() == oldSelectedTemplate: self.ui.TemplateList.setCurrentItem(item) def onTempDirButton(self): """ Change the directory that contains print composer templates. """ templatepath = QFileDialog.getExistingDirectory( self, tr("Select Directory"), self.templatepath, QFileDialog.ShowDirsOnly) if templatepath != "": self.templatepath = templatepath QSettings().setValue("SurveyingCalculation/template_dir", templatepath) QSettings().sync() self.fillTemplateList() def changedSingleFileCheckbox(self, state): self.ui.OutputPDFEdit.setEnabled(not state) def onPlotButton(self): """ Batch plots selected geometry items using the selected template and scale. """ # check if one layer is selected if self.ui.LayersComboBox.currentIndex() == -1: QMessageBox.warning(self, tr("Warning"), tr("Select a layer!")) self.ui.LayersComboBox.setFocus() return # check if one composition template is selected if self.ui.TemplateList.selectedItems() == []: QMessageBox.warning(self, tr("Warning"), tr("Select a composer template!")) self.ui.TemplateList.setFocus() return template_filename = QDir(self.templatepath).absoluteFilePath( self.ui.TemplateList.currentItem().text()) # get the scale if self.ui.ScaleCombo.currentText() == "<extent>": scale = -1 else: try: scale = int(self.ui.ScaleCombo.currentText()) except (ValueError): QMessageBox.warning( self, tr("Warning"), tr("Scale must be a positive integer value!")) self.ui.ScaleCombo.setFocus() return if scale <= 0: QMessageBox.warning( self, tr("Warning"), tr("Scale must be a positive integer value!")) self.ui.ScaleCombo.setFocus() return # get composer name composer_name = self.ui.ComposerEdit.text() #check if there are selected items on polygon layers if self.batch_plotting: selected_layer = self.ui.LayersComboBox.itemData( self.ui.LayersComboBox.currentIndex()) selected_polygons = get_features(selected_layer.name(), QGis.Polygon, True) if selected_polygons is None: QMessageBox.warning( self, tr("Warning"), tr("Select at least one polygon on layer '%s'!" % selected_layer.name())) return # check output setting if self.ui.OutputTab.currentIndex() == 0: # to PDF if not self.ui.SingleFileCheckbox.checkState(): if len(self.ui.OutputPDFEdit.text()) == 0: res = QMessageBox.warning( self, tr("Warning"), tr("The filename pattern is empty. A default one will be used." ), QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Ok) if res == QMessageBox.Cancel: return self.ui.OutputPDFEdit.setText( QgsAtlasComposition(None).filenamePattern()) elif self.ui.OutputTab.currentIndex() == 1: # to Printer # no need for checking pass elif self.ui.OutputTab.currentIndex() == 2: # to Composer View # no need for checking yet pass # get map renderer of map canvas renderer = self.iface.mapCanvas().mapRenderer() self.composition = QgsComposition(renderer) # if plot to Composer View the composition must be set # before loading the template # otherwise composer's item properties doesn't appear if self.ui.OutputTab.currentIndex() == 2: # to Composer View if len(composer_name) == 0: composer = self.iface.createNewComposer() else: composer = self.iface.createNewComposer(composer_name) composer.setComposition(self.composition) # read template file and add to composition template_file = QFile(template_filename) template_file.open(QIODevice.ReadOnly | QIODevice.Text) template_content = template_file.readAll() template_file.close() document = QDomDocument() document.setContent(template_content) self.composition.loadFromTemplate(document) # if batch_plotting is True create an atlas composition if self.batch_plotting: # get composer map item and set new scale and the grid cmap = self.composition.getComposerMapById(0) cmap.setNewScale(scale) cmap.setGridIntervalX(scale / 10) cmap.setGridIntervalY(scale / 10) cmap.setAtlasDriven(True) cmap.setAtlasScalingMode(QgsComposerMap.Fixed) # set atlas composition parameters atlas = self.composition.atlasComposition() atlas.setEnabled(True) atlas.setCoverageLayer(selected_layer) atlas.setHideCoverage(False) atlas.setFilenamePattern(self.ui.OutputPDFEdit.text()) atlas.setSingleFile(self.ui.SingleFileCheckbox.checkState()) atlas.setSortFeatures(False) atlas.setFilterFeatures(True) selected_ids = [f.id() for f in selected_layer.selectedFeatures()] filter_id_string = ','.join([str(sid) for sid in selected_ids]) atlas.setFeatureFilter("$id in (" + filter_id_string + ")") # print the complete atlas composition if self.ui.OutputTab.currentIndex() == 0: # to PDF self.composition.setAtlasMode(QgsComposition.ExportAtlas) if self.pdfpath == "": self.pdfpath = QgsProject.instance().homePath().encode( sys.getfilesystemencoding()) if self.ui.SingleFileCheckbox.checkState(): #print to single pdf (multi-page) outputFileName = QDir( self.pdfpath).absoluteFilePath("qgis.pdf") outputFileName = QFileDialog.getSaveFileName( self, tr("Choose a file name to save the map as"), outputFileName, tr("PDF Format") + " (*.pdf *.PDF)") if not outputFileName: return if not outputFileName.lower().endswith(".pdf"): outputFileName += ".pdf" self.pdfpath = QDir(outputFileName).absolutePath() else: #print to more pdf outputDir = QFileDialog.getExistingDirectory( self, tr("Directory where to save PDF files"), self.pdfpath, QFileDialog.ShowDirsOnly) if not outputDir: return # test directory (if it exists and is writable) if not QDir(outputDir).exists() or not QFileInfo( outputDir).isWritable(): QMessageBox.warning( self, tr("Unable to write into the directory"), tr("The given output directory is not writable. Cancelling." )) return self.pdfpath = outputDir printer = QPrinter() painter = QPainter() if not len(atlas.featureFilterErrorString()) == 0: QMessageBox.warning( self, tr("Atlas processing error"), tr("Feature filter parser error: %s" % atlas.featureFilterErrorString())) return atlas.beginRender() if self.ui.SingleFileCheckbox.checkState(): #prepare for first feature, so that we know paper size to begin with atlas.prepareForFeature(0) self.composition.beginPrintAsPDF(printer, outputFileName) # set the correct resolution self.composition.beginPrint(printer) printReady = painter.begin(printer) if not printReady: QMessageBox.warning( self, tr("Atlas processing error"), tr("Error creating %s." % outputFileName)) return progress = QProgressDialog(tr("Rendering maps..."), tr("Abort"), 0, atlas.numFeatures(), self) QApplication.setOverrideCursor(Qt.BusyCursor) for featureI in range(0, atlas.numFeatures()): progress.setValue(featureI + 1) # process input events in order to allow aborting QCoreApplication.processEvents() if progress.wasCanceled(): atlas.endRender() break if not atlas.prepareForFeature(featureI): QMessageBox.warning(self, tr("Atlas processing error"), tr("Atlas processing error")) progress.cancel() QApplication.restoreOverrideCursor() return if not self.ui.SingleFileCheckbox.checkState(): multiFilePrinter = QPrinter() outputFileName = QDir(outputDir).filePath( atlas.currentFilename()) + ".pdf" self.composition.beginPrintAsPDF( multiFilePrinter, outputFileName) # set the correct resolution self.composition.beginPrint(multiFilePrinter) printReady = painter.begin(multiFilePrinter) if not printReady: QMessageBox.warning( self, tr("Atlas processing error"), tr("Error creating %s." % outputFileName)) progress.cancel() QApplication.restoreOverrideCursor() return self.composition.doPrint(multiFilePrinter, painter) painter.end() else: # start print on a new page if we're not on the first feature if featureI > 0: printer.newPage() self.composition.doPrint(printer, painter) atlas.endRender() if self.ui.SingleFileCheckbox.checkState(): painter.end() QApplication.restoreOverrideCursor() elif self.ui.OutputTab.currentIndex() == 1: # to Printer # if To Printer is selected set the printer # setting up printer if self.printer is None: self.printer = QPrinter() self.printer.setFullPage(True) self.printer.setColorMode(QPrinter.Color) # open printer setting dialog pdlg = QPrintDialog(self.printer, self) pdlg.setModal(True) pdlg.setOptions(QAbstractPrintDialog.None) if not pdlg.exec_() == QDialog.Accepted: return QApplication.setOverrideCursor(Qt.BusyCursor) #prepare for first feature, so that we know paper size to begin with self.composition.setAtlasMode(QgsComposition.ExportAtlas) atlas.prepareForFeature(0) # set orientation if self.composition.paperWidth( ) > self.composition.paperHeight(): self.printer.setOrientation(QPrinter.Landscape) self.printer.setPaperSize( QSizeF(self.composition.paperHeight(), self.composition.paperWidth()), QPrinter.Millimeter) else: self.printer.setOrientation(QPrinter.Portrait) self.printer.setPaperSize( QSizeF(self.composition.paperWidth(), self.composition.paperHeight()), QPrinter.Millimeter) self.printer.setResolution(self.composition.printResolution()) self.composition.beginPrint(self.printer) painter = QPainter(self.printer) if not len(atlas.featureFilterErrorString()) == 0: QMessageBox.warning( self, tr("Atlas processing error"), tr("Feature filter parser error: %s" % atlas.featureFilterErrorString())) QApplication.restoreOverrideCursor() return atlas.beginRender() progress = QProgressDialog(tr("Rendering maps..."), tr("Abort"), 0, atlas.numFeatures(), self) for featureI in range(0, atlas.numFeatures()): progress.setValue(featureI + 1) # process input events in order to allow cancelling QCoreApplication.processEvents() if progress.wasCanceled(): atlas.endRender() break if not atlas.prepareForFeature(featureI): QMessageBox.warning(self, tr("Atlas processing error"), tr("Atlas processing error")) progress.cancel() QApplication.restoreOverrideCursor() return # start print on a new page if we're not on the first feature if featureI > 0: self.printer.newPage() self.composition.doPrint(self.printer, painter) atlas.endRender() painter.end() QApplication.restoreOverrideCursor() elif self.ui.OutputTab.currentIndex() == 2: # to Composer View # create new composer self.composition.setAtlasMode(QgsComposition.PreviewAtlas) composer.composerWindow().on_mActionAtlasPreview_triggered( True) atlas.parameterChanged.emit() # Increase the reference count of the composer object # for not being garbage collected. # If not doing this composer would lost reference and qgis would crash # when referring to this composer object or at quit. ctypes.c_long.from_address(id(composer)).value += 1 else: # if batch_plotting is False open a QgsComposerView with current map canvas cmap = self.composition.getComposerMapById(0) # set the new extent of composer map item newextent = self.iface.mapCanvas().mapRenderer().extent() currentextent = cmap.extent() canvas_ratio = newextent.width() / newextent.height() map_ratio = currentextent.width() / currentextent.height() if map_ratio < canvas_ratio: dh = newextent.width() / map_ratio - newextent.height() newextent.setYMinimum(newextent.yMinimum() - dh / 2) newextent.setYMaximum(newextent.yMaximum() + dh / 2) else: dw = map_ratio * newextent.height() - newextent.width() newextent.setXMinimum(newextent.xMinimum() - dw / 2) newextent.setXMaximum(newextent.xMaximum() + dw / 2) cmap.setNewExtent(newextent) # set the new scale of composer map item if scale > 0: cmap.setNewScale(scale) sc = cmap.scale() # set the grid interval according to the scale cmap.setGridIntervalX(sc / 10) cmap.setGridIntervalY(sc / 10) # Increase the reference count of the composer object # for not being garbage collected. # If not doing this composer would lost reference and qgis would crash # when referring to this composer object or at quit. ctypes.c_long.from_address(id(composer)).value += 1 self.accept() def onCloseButton(self): """ Close the dialog when the Close button pushed. """ self.reject()
def _get_composer_pdf_image(self, width, height, dpi): pdfpath = getTempfilePath('pdf') temp_size = os.path.getsize(pdfpath) p = QPrinter() p.setOutputFormat(QPrinter.PdfFormat) p.setOutputFileName(pdfpath) p.setPaperSize(QSizeF(self._c.paperWidth(), self._c.paperHeight()), QPrinter.Millimeter) p.setFullPage(True) p.setColorMode(QPrinter.Color) p.setResolution(self._c.printResolution()) pdf_p = QPainter(p) # page_mm = p.pageRect(QPrinter.Millimeter) # page_px = p.pageRect(QPrinter.DevicePixel) # self._c.render(pdf_p, page_px, page_mm) self._c.renderPage(pdf_p, 0) pdf_p.end() if temp_size == os.path.getsize(pdfpath): return False, '' filepath = getTempfilePath('png') # Poppler (pdftocairo or pdftoppm): # PDFUTIL -png -singlefile -r 72 -x 0 -y 0 -W 420 -H 280 in.pdf pngbase # muPDF (mudraw): # PDFUTIL -c rgb[a] -r 72 -w 420 -h 280 -o out.png in.pdf if PDFUTIL.strip().endswith('pdftocairo'): filebase = os.path.join( os.path.dirname(filepath), os.path.splitext(os.path.basename(filepath))[0]) call = [ PDFUTIL, '-png', '-singlefile', '-r', str(dpi), '-x', '0', '-y', '0', '-W', str(width), '-H', str(height), pdfpath, filebase ] elif PDFUTIL.strip().endswith('mudraw'): call = [ PDFUTIL, '-c', 'rgba', '-r', str(dpi), '-w', str(width), '-h', str(height), # '-b', '8', '-o', filepath, pdfpath ] else: return False, '' qDebug("_get_composer_pdf_image call: {0}".format(' '.join(call))) res = False try: subprocess.check_call(call) res = True except subprocess.CalledProcessError as e: qDebug("_get_composer_pdf_image failed!\n" "cmd: {0}\n" "returncode: {1}\n" "message: {2}".format(e.cmd, e.returncode, e.message)) if not res: os.unlink(filepath) filepath = '' return res, filepath
compmap.setPreviewMode(QgsComposerMap.Render) #compmap.updateItem() #emit compmap.itemChanged(); #compmap.extentChanged(); #compmap.toggleAtlasPreview() #compmap.setNewScale(compmap.scale()+1) #c.setPrintResolution(150) #print c.printResolution() c.setPrintAsRaster(False) printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName(pdf_out) printer.setPaperSize(QSizeF(c.paperWidth(), c.paperHeight()), QPrinter.Millimeter) printer.setFullPage(True) printer.setColorMode(QPrinter.Color) printer.setResolution(c.printResolution()) pdfPainter = QPainter(printer) paperRectMM = printer.pageRect(QPrinter.Millimeter) paperRectPixel = printer.pageRect(QPrinter.DevicePixel) QgsPaintEngineHack.fixEngineFlags(printer.paintEngine()) #c.renderPage(pdfPainter, 0) c.doPrint(printer, pdfPainter) pdfPainter.end() subprocess.call(('xdg-open', pdf_out))
class BatchPlottingDialog(QDialog): """ Class for batch plotting dialog """ def __init__(self, iface, batch_plotting): """ Initialize dialog data and event handlers """ super(BatchPlottingDialog, self).__init__() self.ui = Ui_BatchPlottingDialog() self.ui.setupUi(self) self.iface = iface self.ui.OutputTab.setCurrentIndex(2) # if batch_plotting is True -> plotting by selected polygons # False -> plot map canvas self.batch_plotting = batch_plotting if not self.batch_plotting: self.setWindowTitle(tr("Plot by Template")) self.ui.OutputTab.setTabEnabled(0,False) self.ui.OutputTab.setTabEnabled(1,False) # event handlers self.ui.PlotButton.clicked.connect(self.onPlotButton) self.ui.TempDirButton.clicked.connect(self.onTempDirButton) self.ui.CloseButton.clicked.connect(self.onCloseButton) self.ui.TemplateList.setSortingEnabled(True) # set paths self.pdfpath = "" if self.batch_plotting: self.ui.OutputPDFEdit.setText( QgsAtlasComposition(None).filenamePattern() ) self.ui.SingleFileCheckbox.stateChanged.connect(self.changedSingleFileCheckbox) else: # set scale to map canvas scale self.ui.ScaleCombo.insertItem(0,"%d"%round(self.iface.mapCanvas().scale())) self.ui.ScaleCombo.insertItem(0,"<extent>") self.ui.ScaleCombo.setCurrentIndex(0) self.printer = None def showEvent(self, event): """ Reset dialog when receives a show event. """ self.templatepath = QSettings().value("SurveyingCalculation/template_dir",config.template_dir) self.fillLayersCombo() self.fillTemplateList() def fillLayersCombo(self): """ Fill the polygon layers combobox. """ oldSelectedLayer = self.ui.LayersComboBox.itemText( self.ui.LayersComboBox.currentIndex() ) self.ui.LayersComboBox.clear() # if batch plotting is false only map canvas will be in the list if not self.batch_plotting: self.ui.LayersComboBox.addItem(tr("<Map view>")) self.ui.LayersComboBox.setCurrentIndex(0) return # if batch plotting is true fill layers combo polygon_layers = get_vector_layers_by_type(QGis.Polygon) if polygon_layers is None: return for layer in polygon_layers: self.ui.LayersComboBox.addItem(layer.name(),layer) # get current layer name try: actlayer_name = self.iface.activeLayer().name() except (AttributeError): actlayer_name = "" if self.ui.LayersComboBox.findText(oldSelectedLayer) == -1: self.ui.LayersComboBox.setCurrentIndex( self.ui.LayersComboBox.findText(actlayer_name) ) else: self.ui.LayersComboBox.setCurrentIndex( self.ui.LayersComboBox.findText(oldSelectedLayer) ) def fillTemplateList(self): """ Fill the listbox of composer template files. """ if self.ui.TemplateList.currentItem() is not None: oldSelectedTemplate = self.ui.TemplateList.currentItem().text() else: oldSelectedTemplate = "" self.ui.TemplateList.clear() tempdir = QDir(self.templatepath) if tempdir.exists(): fileinfolist = tempdir.entryInfoList(["*.qpt"], QDir.Files | QDir.NoDotAndDotDot | QDir.NoSymLinks, QDir.NoSort) for fi in fileinfolist: item = QListWidgetItem(fi.fileName()) self.ui.TemplateList.addItem(item) if fi.fileName() == oldSelectedTemplate: self.ui.TemplateList.setCurrentItem( item ) def onTempDirButton(self): """ Change the directory that contains print composer templates. """ templatepath = QFileDialog.getExistingDirectory(self, tr("Select Directory"), self.templatepath, QFileDialog.ShowDirsOnly) if templatepath!="": self.templatepath = templatepath QSettings().setValue("SurveyingCalculation/template_dir",templatepath) QSettings().sync() self.fillTemplateList() def changedSingleFileCheckbox(self, state): self.ui.OutputPDFEdit.setEnabled(not state) def onPlotButton(self): """ Batch plots selected geometry items using the selected template and scale. """ # check if one layer is selected if self.ui.LayersComboBox.currentIndex() == -1: QMessageBox.warning(self, tr("Warning"), tr("Select a layer!")) self.ui.LayersComboBox.setFocus() return # check if one composition template is selected if self.ui.TemplateList.selectedItems() == []: QMessageBox.warning(self, tr("Warning"), tr("Select a composer template!")) self.ui.TemplateList.setFocus() return template_filename = QDir(self.templatepath).absoluteFilePath( self.ui.TemplateList.currentItem().text()) # get the scale if self.ui.ScaleCombo.currentText()=="<extent>": scale = -1 else: try: scale = int(self.ui.ScaleCombo.currentText()) except (ValueError): QMessageBox.warning(self, tr("Warning"), tr("Scale must be a positive integer value!")) self.ui.ScaleCombo.setFocus() return if scale<=0: QMessageBox.warning(self, tr("Warning"), tr("Scale must be a positive integer value!")) self.ui.ScaleCombo.setFocus() return # get composer name composer_name = self.ui.ComposerEdit.text() #check if there are selected items on polygon layers if self.batch_plotting: selected_layer = self.ui.LayersComboBox.itemData(self.ui.LayersComboBox.currentIndex()) selected_polygons = get_features(selected_layer.name(),QGis.Polygon,True) if selected_polygons is None: QMessageBox.warning(self, tr("Warning"), tr("Select at least one polygon on layer '%s'!"%selected_layer.name())) return # check output setting if self.ui.OutputTab.currentIndex() == 0: # to PDF if not self.ui.SingleFileCheckbox.checkState(): if len( self.ui.OutputPDFEdit.text() ) == 0: res = QMessageBox.warning(self, tr("Warning"), tr("The filename pattern is empty. A default one will be used."), QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Ok) if res == QMessageBox.Cancel: return self.ui.OutputPDFEdit.setText( QgsAtlasComposition(None).filenamePattern() ) elif self.ui.OutputTab.currentIndex() == 1: # to Printer # no need for checking pass elif self.ui.OutputTab.currentIndex() == 2: # to Composer View # no need for checking yet pass # get map renderer of map canvas renderer = self.iface.mapCanvas().mapRenderer() self.composition = QgsComposition(renderer) # if plot to Composer View the composition must be set # before loading the template # otherwise composer's item properties doesn't appear if self.ui.OutputTab.currentIndex() == 2: # to Composer View if len(composer_name)==0: composer = self.iface.createNewComposer() else: composer = self.iface.createNewComposer(composer_name) composer.setComposition(self.composition) # read template file and add to composition template_file = QFile( template_filename ) template_file.open(QIODevice.ReadOnly | QIODevice.Text) template_content = template_file.readAll() template_file.close() document = QDomDocument() document.setContent(template_content) self.composition.loadFromTemplate(document) # if batch_plotting is True create an atlas composition if self.batch_plotting: # get composer map item and set new scale and the grid cmap = self.composition.getComposerMapById(0) cmap.setNewScale(scale) cmap.setGridIntervalX(scale/10) cmap.setGridIntervalY(scale/10) cmap.setAtlasDriven(True) cmap.setAtlasScalingMode( QgsComposerMap.Fixed ) # set atlas composition parameters atlas = self.composition.atlasComposition() atlas.setEnabled(True) atlas.setCoverageLayer( selected_layer ) atlas.setHideCoverage(False) atlas.setFilenamePattern( self.ui.OutputPDFEdit.text() ) atlas.setSingleFile( self.ui.SingleFileCheckbox.checkState() ) atlas.setSortFeatures(False) atlas.setFilterFeatures(True) selected_ids = [f.id() for f in selected_layer.selectedFeatures()] filter_id_string = ','.join([str(sid) for sid in selected_ids]) atlas.setFeatureFilter("$id in (" + filter_id_string + ")") # print the complete atlas composition if self.ui.OutputTab.currentIndex() == 0: # to PDF self.composition.setAtlasMode( QgsComposition.ExportAtlas ) if self.pdfpath=="": self.pdfpath = QgsProject.instance().homePath().encode(sys.getfilesystemencoding()) if self.ui.SingleFileCheckbox.checkState(): #print to single pdf (multi-page) outputFileName = QDir(self.pdfpath).absoluteFilePath("qgis.pdf") outputFileName = QFileDialog.getSaveFileName(self, tr( "Choose a file name to save the map as" ), outputFileName, tr( "PDF Format" ) + " (*.pdf *.PDF)" ) if not outputFileName: return if not outputFileName.lower().endswith(".pdf"): outputFileName += ".pdf" self.pdfpath = QDir(outputFileName).absolutePath() else: #print to more pdf outputDir = QFileDialog.getExistingDirectory( self, tr( "Directory where to save PDF files" ), self.pdfpath, QFileDialog.ShowDirsOnly ) if not outputDir: return # test directory (if it exists and is writable) if not QDir(outputDir).exists() or not QFileInfo(outputDir).isWritable(): QMessageBox.warning( self, tr( "Unable to write into the directory" ), tr( "The given output directory is not writable. Cancelling." ) ) return self.pdfpath = outputDir printer = QPrinter() painter = QPainter() if not len(atlas.featureFilterErrorString()) == 0: QMessageBox.warning( self, tr( "Atlas processing error" ), tr( "Feature filter parser error: %s" % atlas.featureFilterErrorString() ) ) return atlas.beginRender() if self.ui.SingleFileCheckbox.checkState(): #prepare for first feature, so that we know paper size to begin with atlas.prepareForFeature(0) self.composition.beginPrintAsPDF(printer, outputFileName) # set the correct resolution self.composition.beginPrint(printer) printReady = painter.begin(printer) if not printReady: QMessageBox.warning( self, tr( "Atlas processing error" ), tr( "Error creating %s." % outputFileName ) ) return progress = QProgressDialog( tr( "Rendering maps..." ), tr( "Abort" ), 0, atlas.numFeatures(), self ) QApplication.setOverrideCursor( Qt.BusyCursor ) for featureI in range(0, atlas.numFeatures()): progress.setValue( featureI+1 ) # process input events in order to allow aborting QCoreApplication.processEvents() if progress.wasCanceled(): atlas.endRender() break if not atlas.prepareForFeature( featureI ): QMessageBox.warning( self, tr( "Atlas processing error" ), tr( "Atlas processing error" ) ) progress.cancel() QApplication.restoreOverrideCursor() return if not self.ui.SingleFileCheckbox.checkState(): multiFilePrinter = QPrinter() outputFileName = QDir( outputDir ).filePath( atlas.currentFilename() ) + ".pdf" self.composition.beginPrintAsPDF( multiFilePrinter, outputFileName ) # set the correct resolution self.composition.beginPrint( multiFilePrinter ) printReady = painter.begin( multiFilePrinter ) if not printReady: QMessageBox.warning( self, tr( "Atlas processing error" ), tr( "Error creating %s." % outputFileName ) ) progress.cancel() QApplication.restoreOverrideCursor() return self.composition.doPrint( multiFilePrinter, painter ) painter.end() else: # start print on a new page if we're not on the first feature if featureI > 0: printer.newPage() self.composition.doPrint( printer, painter ) atlas.endRender() if self.ui.SingleFileCheckbox.checkState(): painter.end() QApplication.restoreOverrideCursor() elif self.ui.OutputTab.currentIndex() == 1: # to Printer # if To Printer is selected set the printer # setting up printer if self.printer is None: self.printer = QPrinter() self.printer.setFullPage(True) self.printer.setColorMode(QPrinter.Color) # open printer setting dialog pdlg = QPrintDialog(self.printer,self) pdlg.setModal(True) pdlg.setOptions(QAbstractPrintDialog.None) if not pdlg.exec_() == QDialog.Accepted: return QApplication.setOverrideCursor(Qt.BusyCursor) #prepare for first feature, so that we know paper size to begin with self.composition.setAtlasMode( QgsComposition.ExportAtlas ) atlas.prepareForFeature(0) # set orientation if self.composition.paperWidth() > self.composition.paperHeight(): self.printer.setOrientation(QPrinter.Landscape) self.printer.setPaperSize( QSizeF(self.composition.paperHeight(), self.composition.paperWidth()), QPrinter.Millimeter) else: self.printer.setOrientation(QPrinter.Portrait) self.printer.setPaperSize( QSizeF(self.composition.paperWidth(), self.composition.paperHeight()), QPrinter.Millimeter) self.printer.setResolution(self.composition.printResolution()) self.composition.beginPrint( self.printer ) painter = QPainter(self.printer) if not len(atlas.featureFilterErrorString()) == 0: QMessageBox.warning( self, tr( "Atlas processing error" ), tr( "Feature filter parser error: %s" % atlas.featureFilterErrorString() ) ) QApplication.restoreOverrideCursor() return atlas.beginRender() progress = QProgressDialog( tr( "Rendering maps..." ), tr( "Abort" ), 0, atlas.numFeatures(), self ) for featureI in range(0, atlas.numFeatures()): progress.setValue( featureI+1 ) # process input events in order to allow cancelling QCoreApplication.processEvents() if progress.wasCanceled(): atlas.endRender() break if not atlas.prepareForFeature( featureI ): QMessageBox.warning( self, tr( "Atlas processing error" ), tr( "Atlas processing error" ) ) progress.cancel() QApplication.restoreOverrideCursor() return # start print on a new page if we're not on the first feature if featureI > 0: self.printer.newPage() self.composition.doPrint( self.printer, painter ) atlas.endRender() painter.end() QApplication.restoreOverrideCursor() elif self.ui.OutputTab.currentIndex() == 2: # to Composer View # create new composer self.composition.setAtlasMode( QgsComposition.PreviewAtlas ) composer.composerWindow().on_mActionAtlasPreview_triggered(True) atlas.parameterChanged.emit() # Increase the reference count of the composer object # for not being garbage collected. # If not doing this composer would lost reference and qgis would crash # when referring to this composer object or at quit. ctypes.c_long.from_address( id(composer) ).value += 1 else: # if batch_plotting is False open a QgsComposerView with current map canvas cmap = self.composition.getComposerMapById(0) # set the new extent of composer map item newextent = self.iface.mapCanvas().mapRenderer().extent() currentextent = cmap.extent() canvas_ratio = newextent.width()/newextent.height() map_ratio = currentextent.width()/currentextent.height() if map_ratio < canvas_ratio: dh = newextent.width() / map_ratio - newextent.height() newextent.setYMinimum( newextent.yMinimum() - dh / 2 ) newextent.setYMaximum( newextent.yMaximum() + dh / 2 ) else: dw = map_ratio * newextent.height() - newextent.width() newextent.setXMinimum( newextent.xMinimum() - dw / 2 ) newextent.setXMaximum( newextent.xMaximum() + dw / 2 ) cmap.setNewExtent(newextent) # set the new scale of composer map item if scale>0: cmap.setNewScale(scale) sc = cmap.scale() # set the grid interval according to the scale cmap.setGridIntervalX(sc/10) cmap.setGridIntervalY(sc/10) # Increase the reference count of the composer object # for not being garbage collected. # If not doing this composer would lost reference and qgis would crash # when referring to this composer object or at quit. ctypes.c_long.from_address( id(composer) ).value += 1 self.accept() def onCloseButton(self): """ Close the dialog when the Close button pushed. """ self.reject()
def save(self, imgName, w=None, h=None, header=None, \ dpi=150, take_region=False): ext = imgName.split(".")[-1].upper() root = self.startNode #aspect_ratio = root.fullRegion.height() / root.fullRegion.width() aspect_ratio = self.i_height / self.i_width # auto adjust size if w is None and h is None and (ext == "PDF" or ext == "PS"): w = dpi * 6.4 h = w * aspect_ratio if h>dpi * 11: h = dpi * 11 w = h / aspect_ratio elif w is None and h is None: w = self.i_width h = self.i_height elif h is None : h = w * aspect_ratio elif w is None: w = h / aspect_ratio if ext == "SVG": svg = QtSvg.QSvgGenerator() svg.setFileName(imgName) svg.setSize(QtCore.QSize(w, h)) svg.setViewBox(QtCore.QRect(0, 0, w, h)) #svg.setTitle("SVG Generator Example Drawing") #svg.setDescription("An SVG drawing created by the SVG Generator") pp = QtGui.QPainter() pp.begin(svg) targetRect = QtCore.QRectF(0, 0, w, h) self.render(pp, targetRect, self.sceneRect()) pp.end() elif ext == "PDF" or ext == "PS": format = QPrinter.PostScriptFormat if ext == "PS" else QPrinter.PdfFormat printer = QPrinter(QPrinter.HighResolution) printer.setResolution(dpi) printer.setOutputFormat(format) printer.setPageSize(QPrinter.A4) pageTopLeft = printer.pageRect().topLeft() paperTopLeft = printer.paperRect().topLeft() # For PS -> problems with margins # print paperTopLeft.x(), paperTopLeft.y() # print pageTopLeft.x(), pageTopLeft.y() # print printer.paperRect().height(), printer.pageRect().height() topleft = pageTopLeft - paperTopLeft printer.setFullPage(True); printer.setOutputFileName(imgName); pp = QtGui.QPainter(printer) if header: pp.setFont(QtGui.QFont("Verdana",12)) pp.drawText(topleft.x(),20, header) targetRect = QtCore.QRectF(topleft.x(), 20 + (topleft.y()*2), w, h) else: targetRect = QtCore.QRectF(topleft.x(), topleft.y()*2, w, h) if take_region: self.selector.setVisible(False) self.render(pp, targetRect, self.selector.rect()) self.selector.setVisible(True) else: self.render(pp, targetRect, self.sceneRect()) pp.end() return else: targetRect = QtCore.QRectF(0, 0, w, h) ii= QtGui.QImage(w, \ h, \ QtGui.QImage.Format_ARGB32) pp = QtGui.QPainter(ii) pp.setRenderHint(QtGui.QPainter.Antialiasing ) pp.setRenderHint(QtGui.QPainter.TextAntialiasing) pp.setRenderHint(QtGui.QPainter.SmoothPixmapTransform) if take_region: self.selector.setVisible(False) self.render(pp, targetRect, self.selector.rect()) self.selector.setVisible(True) else: self.render(pp, targetRect, self.sceneRect()) pp.end() ii.save(imgName)
def export_all_features(self): pdf_painter = None """Export map to pdf atlas style (one page per feature)""" if VRP_DEBUG is True: QgsMessageLog.logMessage(u'exporting map', DLG_CAPTION) try: result = self.__delete_pdf() if not result is None: return result ids = [] exp = QgsExpression(self.feature_filter) if exp.hasParserError(): raise Exception(exp.parserErrorString()) exp.prepare(self.coverage_layer.pendingFields()) for feature in self.coverage_layer.getFeatures(): value = exp.evaluate(feature) if exp.hasEvalError(): raise ValueError(exp.evalErrorString()) if bool(value): if VRP_DEBUG is True: QgsMessageLog.logMessage(u'export map, feature id:{0}'.format(feature.id()), DLG_CAPTION) ids.append(feature.id()) self.coverage_layer.select(ids) bbox = self.coverage_layer.boundingBoxOfSelected() self.canvas.zoomToSelected(self.coverage_layer) if VRP_DEBUG is True: QgsMessageLog.logMessage(u'bbox:{0}'.format(bbox.toString()), DLG_CAPTION) #self.map_renderer.setExtent(bbox) #self.map_renderer.updateScale() #read plotlayout composition = QgsComposition(self.map_renderer) self.composition = composition composition.setPlotStyle(QgsComposition.Print) error, xml_doc = self.__read_template() if not error is None: return error if composition.loadFromTemplate(xml_doc) is False: return u'Konnte Template nicht laden!\n{0}'.format(self.template_qpt) #read textinfo layout self.comp_textinfo = QgsComposition(self.map_renderer) self.comp_textinfo.setPlotStyle(QgsComposition.Print) error, xml_doc = self.__read_template(True) if not error is None: return error if self.comp_textinfo.loadFromTemplate(xml_doc) is False: return u'Konnte Template nicht laden!\n{0}'.format(self.settings.textinfo_layout()) new_ext = bbox if QGis.QGIS_VERSION_INT > 20200: compmaps = self.__get_items(QgsComposerMap) if len(compmaps) < 1: return u'Kein Kartenfenster im Layout vorhanden!' compmap = compmaps[0] else: if len(composition.composerMapItems()) < 1: return u'Kein Kartenfenster im Layout vorhanden!' compmap = composition.composerMapItems()[0] self.composermap = compmap #self.composermap.setPreviewMode(QgsComposerMap.Render) #self.composermap.setPreviewMode(QgsComposerMap.Rectangle) #taken from QgsComposerMap::setNewAtlasFeatureExtent (not yet available in QGIS 2.0) #http://www.qgis.org/api/qgscomposermap_8cpp_source.html#l00610 old_ratio = compmap.rect().width() / compmap.rect().height() new_ratio = new_ext.width() / new_ext.height() if old_ratio < new_ratio: new_height = new_ext.width() / old_ratio delta_height = new_height - new_ext.height() new_ext.setYMinimum( bbox.yMinimum() - delta_height / 2) new_ext.setYMaximum(bbox.yMaximum() + delta_height / 2) else: new_width = old_ratio * new_ext.height() delta_width = new_width - new_ext.width() new_ext.setXMinimum(bbox.xMinimum() - delta_width / 2) new_ext.setXMaximum(bbox.xMaximum() + delta_width / 2) if VRP_DEBUG is True: QgsMessageLog.logMessage(u'bbox old:{0}'.format(compmap.extent().toString()), DLG_CAPTION) compmap.setNewExtent(new_ext) if VRP_DEBUG is True: QgsMessageLog.logMessage(u'bbox new:{0}'.format(compmap.extent().toString()), DLG_CAPTION) #round up to next 1000 compmap.setNewScale(math.ceil((compmap.scale()/1000.0)) * 1000.0) if VRP_DEBUG is True: QgsMessageLog.logMessage(u'bbox new (after scale):{0}'.format(compmap.extent().toString()), DLG_CAPTION) #add ORTHO after new extent -> performance if not self.ortho is None: self.ortho_lyr = self.__add_raster_layer(self.ortho, self.lyrname_ortho) self.__reorder_layers() self.comp_leg = self.__get_items(QgsComposerLegend) self.comp_lbl = self.__get_items(QgsComposerLabel) self.__update_composer_items(self.settings.dkm_gemeinde(self.gem_name)['lyrnamegstk']) if VRP_DEBUG is True: QgsMessageLog.logMessage(u'paperWidth:{0} paperHeight:{1}'.format(composition.paperWidth(), composition.paperHeight()), DLG_CAPTION) printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName(self.pdf_map) printer.setPaperSize(QSizeF(composition.paperWidth(), composition.paperHeight()), QPrinter.Millimeter) printer.setFullPage(True) printer.setColorMode(QPrinter.Color) printer.setResolution(composition.printResolution()) pdf_painter = QPainter(printer) paper_rect_pixel = printer.pageRect(QPrinter.DevicePixel) paper_rect_mm = printer.pageRect(QPrinter.Millimeter) QgsPaintEngineHack.fixEngineFlags(printer.paintEngine()) #DKM only if len(self.themen) < 1: composition.render(pdf_painter, paper_rect_pixel, paper_rect_mm) else: self.statistics = OrderedDict() try: pass #lyr = QgsVectorLayer('/home/bergw/VoGIS-Raumplanung-Daten/Geodaten/Raumplanung/Flaechenwidmung/Dornbirn/Flaechenwidmungsplan/fwp_flaeche.shp', 'flaeiw', 'ogr') #lyr.loadNamedStyle('/home/bergw/VoGIS-Raumplanung-Daten/Geodaten/Raumplanung/Flaechenwidmung/Vorarlberg/Flaechenwidmungsplan/fwp_flaeche.qml') #QgsMapLayerRegistry.instance().addMapLayer(lyr) except: QgsMessageLog.logMessage('new lyr:{0}'.format(sys.exc_info()[0]), DLG_CAPTION) #QgsMapLayerRegistry.instance().addMapLayer(lyr) cntr = 0 for thema, sub_themen in self.themen.iteritems(): if VRP_DEBUG is True: QgsMessageLog.logMessage('drucke Thema:{0}'.format(thema.name), DLG_CAPTION) if sub_themen is None: layers = self.__add_layers(thema) self.__calculate_statistics(thema, thema, layers) #no qml -> not visible -> means no map if self.__at_least_one_visible(layers) is True: if cntr > 0: printer.newPage() self.__reorder_layers() self.__update_composer_items(thema.name, layers=layers) composition.renderPage(pdf_painter, 0) QgsMapLayerRegistry.instance().removeMapLayers([lyr.id() for lyr in layers]) cntr += 1 else: QgsMapLayerRegistry.instance().removeMapLayers([lyr.id() for lyr in layers]) if not sub_themen is None: for sub_thema in sub_themen: if VRP_DEBUG is True: QgsMessageLog.logMessage(u'drucke SubThema:{0}'.format(sub_thema.name), DLG_CAPTION) layers = self.__add_layers(sub_thema) self.__calculate_statistics(thema, sub_thema, layers) #no qml -> not visible -> means no map if self.__at_least_one_visible(layers) is True: if cntr > 0: printer.newPage() self.__reorder_layers() self.__update_composer_items(thema.name, subthema=sub_thema.name, layers=layers) composition.renderPage(pdf_painter, 0) QgsMapLayerRegistry.instance().removeMapLayers([lyr.id() for lyr in layers]) cntr += 1 else: QgsMapLayerRegistry.instance().removeMapLayers([lyr.id() for lyr in layers]) #output statistics if len(self.statistics) > 0: printer.setPaperSize(QSizeF(210, 297), QPrinter.Millimeter) tabelle = self.__get_item_byid(self.comp_textinfo, 'TABELLE') if tabelle is None: self.iface.messageBar().pushMessage(u'Layout (Textinfo): Kein Textelement mit ID "TABELLE" vorhanden.', QgsMessageBar.CRITICAL) else: try: str_flaechen = '' idx = 0 for gnr, stats in self.statistics.iteritems(): comma = ', ' if idx > 0 else '' str_flaechen += u'{0}{1} ({2:.2f}m²)'.format(comma, gnr, stats[0].flaeche) idx += 1 lbls = self.__get_items(QgsComposerLabel, self.comp_textinfo) self.__update_composer_items('', labels=lbls, gnrflaeche=str_flaechen) html = tabelle.text() html += u'<table>' #gnrcnt = 0 for gnr, stats in self.statistics.iteritems(): #if gnrcnt > 0: # html += u'<tr class="abstand"><td> </td><td> </td><td> </td></tr>' html += u'<tr><th class="gnr"></th><th class="gnr">{0}</th><th class="gnr"></th></tr>'.format(gnr) #html += u'<tr class="abstand"><td> </td><td> </td><td> </td></tr>' curr_thema = '' for stat in stats: if stat.thema != curr_thema: html += u'<tr><th class="thema"></th><th class="thema">{0}</th><th class="thema"></th></tr>'.format(stat.thema) curr_thema = stat.thema for thema, subthema in stat.subthemen.iteritems(): for quelle in subthema: html += u'<tr><td class="col1">{0}</td>'.format(quelle.name) attr_val = '' attr_area = '' for text, area in quelle.txt_area.iteritems(): attr_val += u'{0}<br />'.format(text) attr_area += u'{0:.2f}m² <br />'.format(area) html += u'<td class="col2">{0}</td><td class="col3">{1}</td></tr>'.format(attr_val, attr_area) #gnrcnt += 1 html += u'</table>' tabelle.setText(html) printer.newPage() self.comp_textinfo.renderPage(pdf_painter, 0) except: msg = 'Statistikausgabe:\n\n{0}'.format(traceback.format_exc()) QgsMessageLog.logMessage(msg, DLG_CAPTION) self.iface.messageBar().pushMessage(msg, QgsMessageBar.CRITICAL) except: msg = 'export pdf (catch all):\n\n{0}'.format(traceback.format_exc()) QgsMessageLog.logMessage(msg, DLG_CAPTION) self.iface.messageBar().pushMessage(msg.replace(u'\n', u''), QgsMessageBar.CRITICAL) return msg finally: #end pdf if not pdf_painter is None: pdf_painter.end() return None
def _get_composer_pdf_image(self, width, height, dpi): pdfpath = getTempfilePath('pdf') temp_size = os.path.getsize(pdfpath) p = QPrinter() p.setOutputFormat(QPrinter.PdfFormat) p.setOutputFileName(pdfpath) p.setPaperSize(QSizeF(self._c.paperWidth(), self._c.paperHeight()), QPrinter.Millimeter) p.setFullPage(True) p.setColorMode(QPrinter.Color) p.setResolution(self._c.printResolution()) pdf_p = QPainter(p) # page_mm = p.pageRect(QPrinter.Millimeter) # page_px = p.pageRect(QPrinter.DevicePixel) # self._c.render(pdf_p, page_px, page_mm) self._c.renderPage(pdf_p, 0) pdf_p.end() if temp_size == os.path.getsize(pdfpath): return False, '' filepath = getTempfilePath('png') # Poppler (pdftocairo or pdftoppm): # PDFUTIL -png -singlefile -r 72 -x 0 -y 0 -W 420 -H 280 in.pdf pngbase # muPDF (mudraw): # PDFUTIL -c rgb[a] -r 72 -w 420 -h 280 -o out.png in.pdf if PDFUTIL.strip().endswith('pdftocairo'): filebase = os.path.join( os.path.dirname(filepath), os.path.splitext(os.path.basename(filepath))[0] ) call = [ PDFUTIL, '-png', '-singlefile', '-r', str(dpi), '-x', '0', '-y', '0', '-W', str(width), '-H', str(height), pdfpath, filebase ] elif PDFUTIL.strip().endswith('mudraw'): call = [ PDFUTIL, '-c', 'rgba', '-r', str(dpi), '-w', str(width), '-h', str(height), # '-b', '8', '-o', filepath, pdfpath ] else: return False, '' qDebug("_get_composer_pdf_image call: {0}".format(' '.join(call))) res = False try: subprocess.check_call(call) res = True except subprocess.CalledProcessError as e: qDebug("_get_composer_pdf_image failed!\n" "cmd: {0}\n" "returncode: {1}\n" "message: {2}".format(e.cmd, e.returncode, e.message)) if not res: os.unlink(filepath) filepath = '' return res, filepath
c.setPlotStyle(QgsComposition.Print) compmap.setPreviewMode(QgsComposerMap.Render) #compmap.updateItem() #emit compmap.itemChanged(); #compmap.extentChanged(); #compmap.toggleAtlasPreview() #compmap.setNewScale(compmap.scale()+1) #c.setPrintResolution(150) #print c.printResolution() c.setPrintAsRaster(False) printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName(pdf_out) printer.setPaperSize(QSizeF(c.paperWidth(), c.paperHeight()), QPrinter.Millimeter) printer.setFullPage(True) printer.setColorMode(QPrinter.Color) printer.setResolution(c.printResolution()) pdfPainter = QPainter(printer) paperRectMM = printer.pageRect(QPrinter.Millimeter) paperRectPixel = printer.pageRect(QPrinter.DevicePixel) QgsPaintEngineHack.fixEngineFlags(printer.paintEngine()) #c.renderPage(pdfPainter, 0) c.doPrint(printer,pdfPainter) pdfPainter.end() subprocess.call(('xdg-open', pdf_out))
def save(self, imgName, w=None, h=None, header=None, \ dpi=150, take_region=False): ext = imgName.split(".")[-1].upper() root = self.startNode #aspect_ratio = root.fullRegion.height() / root.fullRegion.width() aspect_ratio = self.i_height / self.i_width # auto adjust size if w is None and h is None and (ext == "PDF" or ext == "PS"): w = dpi * 6.4 h = w * aspect_ratio if h > dpi * 11: h = dpi * 11 w = h / aspect_ratio elif w is None and h is None: w = self.i_width h = self.i_height elif h is None: h = w * aspect_ratio elif w is None: w = h / aspect_ratio if ext == "SVG": svg = QtSvg.QSvgGenerator() svg.setFileName(imgName) svg.setSize(QtCore.QSize(w, h)) svg.setViewBox(QtCore.QRect(0, 0, w, h)) #svg.setTitle("SVG Generator Example Drawing") #svg.setDescription("An SVG drawing created by the SVG Generator") pp = QtGui.QPainter() pp.begin(svg) targetRect = QtCore.QRectF(0, 0, w, h) self.render(pp, targetRect, self.sceneRect()) pp.end() elif ext == "PDF" or ext == "PS": format = QPrinter.PostScriptFormat if ext == "PS" else QPrinter.PdfFormat printer = QPrinter(QPrinter.HighResolution) printer.setResolution(dpi) printer.setOutputFormat(format) printer.setPageSize(QPrinter.A4) pageTopLeft = printer.pageRect().topLeft() paperTopLeft = printer.paperRect().topLeft() # For PS -> problems with margins # print paperTopLeft.x(), paperTopLeft.y() # print pageTopLeft.x(), pageTopLeft.y() # print printer.paperRect().height(), printer.pageRect().height() topleft = pageTopLeft - paperTopLeft printer.setFullPage(True) printer.setOutputFileName(imgName) pp = QtGui.QPainter(printer) if header: pp.setFont(QtGui.QFont("Verdana", 12)) pp.drawText(topleft.x(), 20, header) targetRect = QtCore.QRectF(topleft.x(), 20 + (topleft.y() * 2), w, h) else: targetRect = QtCore.QRectF(topleft.x(), topleft.y() * 2, w, h) if take_region: self.selector.setVisible(False) self.render(pp, targetRect, self.selector.rect()) self.selector.setVisible(True) else: self.render(pp, targetRect, self.sceneRect()) pp.end() return else: targetRect = QtCore.QRectF(0, 0, w, h) ii= QtGui.QImage(w, \ h, \ QtGui.QImage.Format_ARGB32) pp = QtGui.QPainter(ii) pp.setRenderHint(QtGui.QPainter.Antialiasing) pp.setRenderHint(QtGui.QPainter.TextAntialiasing) pp.setRenderHint(QtGui.QPainter.SmoothPixmapTransform) if take_region: self.selector.setVisible(False) self.render(pp, targetRect, self.selector.rect()) self.selector.setVisible(True) else: self.render(pp, targetRect, self.sceneRect()) pp.end() ii.save(imgName)
class GanttPrintHandler(PrintHandler): def __init__(self, ganttWidget): super(GanttPrintHandler, self).__init__() self._printer = None self.ganttWidget = ganttWidget self._pri = Namespace() def printer(self): if self._printer is None: self._printer = QPrinter(QPrinter.HighResolution) self._printer.setOrientation(QtGui.QPrinter.Landscape) self._printer.setFullPage(True) #self.translate(-15, -15) self._printer.setDocName(self.ganttWidget.ganttModel.name) return self._printer def createPreviewDialog(self, printer): return MyPrintPreviewDialog(self.ganttWidget, printer) @property def horizontalPageCount(self): return settings.print.HORIZONTAL_PAGE_COUNT def pageCount(self): self.preparePrint(self.printer()) return len(self._pageInfo) def preparePrint(self, printer): """druckenの前準備。派生クラスでオーバライド""" #drucken用のWidgetを用意する self._widget = GanttWidget() self._widget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self._widget.ganttModel = self.ganttWidget.ganttModel self._pri = self.getPrintRectInfo(printer) self._widget.setGeometry(QRect(0, 0, self._pri.log.headerWidth + self._pri.log.bodyWidth, self._pri.log.headerHeight + self._pri.log.bodyHeight)) #各ページの表示範囲を算出する self._pageInfo = [] bh = self._pri.log.bodyHeight top = 0 while bh > 0: if bh < self._pri.log.bodyHeightPerPage: height = bh else: height = self._pri.log.bodyHeightPerPage #---- bw = self._pri.log.bodyWidth left = 0 while bw > 0: if bw < self._pri.log.bodyWidthPerPage: width = bw else: width = self._pri.log.bodyWidthPerPage self._pageInfo.append(QRect(left, top, width, height)) left += width bw -= width #---- top += height bh -= height print("self._pageInfo:", self._pageInfo) def getPrintRectInfo(self, printer): bodyHeight = 0 it = QtGui.QTreeWidgetItemIterator(self._widget, QtGui.QTreeWidgetItemIterator.NotHidden) while it.value(): #rect = self.visualRect(self.indexFromItem(it.value())) #rowHeight = self.rowHeight(self.indexFromItem(it.value())) #print(rect, rowHeight) #visualRect, rowHeightで取得できる高さが実際の行高さよりも小さいので #定数値を足し込んでおくことにする bodyHeight += ROW_HEIGHT it += 1 obj = Namespace() obj.dev = Namespace() obj.log = Namespace() obj.scl = Namespace() print("settings.columnWidth", settings.columnWidth) obj.log.headerWidth = settings.getHeaderWidth() obj.log.headerHeight = HEADER_HEIGHT obj.log.bodyWidth = self._widget.preferableWidth() obj.log.bodyHeight = bodyHeight obj.log.bodyWidthPerPage = obj.log.bodyWidth / self.horizontalPageCount obj.log.bodyHeightPerPage = ROW_HEIGHT * settings.print.ROWS_PER_PAGE obj.log.pageWidth = obj.log.headerWidth + obj.log.bodyWidthPerPage obj.log.pageHeight = obj.log.headerHeight + obj.log.bodyHeightPerPage pageRect = printer.pageRect() obj.dev.pageWidth = pageRect.width() obj.dev.pageHeight = pageRect.height() obj.dev.headerWidth = obj.dev.pageWidth * settings.print.HEADER_WIDTH_RATIO obj.dev.headerHeight = obj.dev.pageHeight * settings.print.HEADER_HEIGHT_RATIO obj.dev.bodyWidth = obj.dev.pageWidth - obj.dev.headerWidth obj.dev.bodyHeight = obj.dev.pageHeight - obj.dev.headerHeight obj.scl.headerWidth = obj.dev.headerWidth / obj.log.headerWidth obj.scl.headerHeight = obj.dev.headerHeight / obj.log.headerHeight obj.scl.bodyWidth = obj.dev.bodyWidth / obj.log.bodyWidthPerPage obj.scl.bodyHeight = obj.dev.bodyHeight / obj.log.bodyHeightPerPage #obj.header print(obj) return obj def printPage(self, painter, pageNo, pageCount): print("paintRect:", painter.device().pageRect(), painter.device().paperRect()) painter.save() #----------------------------------------------------------------------- deviceRect = painter.device().pageRect() painter.translate(deviceRect.top(), deviceRect.left()) #print(deviceRect) bodyRect = self._pageInfo[pageNo-1] #print(bodyRect) #データ部ヘッダ rect1 = self.renderDataHeader(painter, bodyRect) #データ部本体 self.renderDataBody(painter, bodyRect) #chart部ヘッダ self.renderChartHeader(painter, bodyRect) #chart部本体 self.renderChartBody(painter, bodyRect) #ページのframe painter.setPen(self._widget.pen4chartBoundary) log = self._pri.dev painter.drawRect(0,0,log.headerWidth,log.headerHeight) painter.drawRect(log.headerWidth,0,log.bodyWidth,log.headerHeight) painter.drawRect(0,log.headerHeight,log.headerWidth,log.bodyHeight) painter.drawRect( log.headerWidth,log.headerHeight,log.bodyWidth,log.bodyHeight) #----------------------------------------------------------------------- painter.restore() def renderDataHeader(self, painter, bodyRect): """データ部ヘッダ""" painter.save() #painter.translate(0, 0) painter.scale(self._pri.scl.headerWidth, self._pri.scl.headerHeight) rect = QRect(0,0,self._pri.log.headerWidth, self._pri.log.headerHeight) self._widget.render(painter, sourceRegion=QRegion(rect)) painter.restore() def renderDataBody(self, painter, bodyRect): """データ部本体""" painter.save() painter.translate(0, self._pri.dev.headerHeight) painter.scale(self._pri.scl.headerWidth, self._pri.scl.bodyHeight) self._widget.render(painter, sourceRegion=QtGui.QRegion( 0, self._pri.log.headerHeight + bodyRect.top(), self._pri.log.headerWidth, bodyRect.height())) painter.restore() def renderChartHeader(self, painter, bodyRect): """chart部ヘッダ""" painter.save() painter.translate(self._pri.dev.headerWidth, 0) painter.scale(self._pri.scl.bodyWidth, self._pri.scl.headerHeight) self._widget.render(painter, sourceRegion=QtGui.QRegion( self._pri.log.headerWidth + bodyRect.left(), 0, bodyRect.width(), self._pri.log.headerHeight)) painter.restore() def renderChartBody(self, painter, bodyRect): """chart部本体""" painter.save() painter.translate(self._pri.dev.headerWidth, self._pri.dev.headerHeight) painter.scale(self._pri.scl.bodyWidth, self._pri.scl.bodyHeight) self._widget.render(painter, sourceRegion=QtGui.QRegion( self._pri.log.headerWidth + bodyRect.left(), self._pri.log.headerHeight + bodyRect.top(), bodyRect.width(), bodyRect.height())) painter.restore()
class Web_Page( QWebPage ): # ======================================================================= def __init__(self, parent, parentMain, UID): # ------------------------------------------------------------------- QWebPage.__init__(self, parent); # ------------------------------------------------------------------- self.PARENT = parentMain; self.UID = UID; self.PARENT_TAB = parent; self.DEBUG = False; self.LOG_TAG = str(self.__class__.__name__).upper(); # ------------------------------------------------------------------- self.L_BTN_CLICK = False; self.M_BTN_CLICK = False; self.R_BTN_CLICK = False; # ------------------------------------------------------------------- self.PROGRESS_BAR = None; self.PROGRESS_BAR_PR = float( self.PARENT.WIDTH / 100); self.PROGRESS_BAR_W = 0; # ------------------------------------------------------------------- # SEARCH_INPUT self.SEARCH_INPUT = QLineEdit("", self.PARENT); self.SEARCH_INPUT.setGeometry(0, 615, 400, 30); self.SEARCH_INPUT.setStyleSheet("QLineEdit{ background-color: rgba(0,0,0, 180); font-size: 12px; font-family: monospace; color: #fff; padding-left: 10px; border-style: none;}"); self.connect( self.SEARCH_INPUT, SIGNAL('textChanged(const QString)') , self.FIND_ON_PAGE ); self.connect( self.SEARCH_INPUT, SIGNAL('returnPressed()') , self.FIND_ON_PAGE ); #self.SEARCH_INPUT.setReadOnly( True ); self.SEARCH_INPUT_IS_OPEN = False; self.SEARCH_INPUT.hide(); # ------------------------------------------------------------------- self.AGENTS = [ # Chrome 41.0.2228.0 "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", # Chrome 41.0.2227.1 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36", # Chrome 41.0.2227.0 "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", # Chrome 41.0.2226.0 "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36", # Chrome 41.0.2225.0 "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36", # Chrome 41.0.2224.3 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36", # Chrome 40.0.2214.93 "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36", # Chrome 37.0.2062.124 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36", # Chrome 37.0.2049.0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36", "Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36", # Chrome 36.0.1985.67 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36", # Chrome 36.0.1985.125 "Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36", # Chrome 36.0.1944.0 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36", # Chrome 35.0.3319.102 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36", # Chrome 35.0.2309.372 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36", # Chrome 35.0.2117.157 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36", # Chrome 35.0.1916.47 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36", # Chrome 34.0.1866.237 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36", # Chrome 34.0.1847.137 "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F", # Chrome 34.0.1847.116 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36", "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10", ]; # ------------------------------------------------------------------- self.USER_AGENT = self.AGENTS[0]; self.HEADERS = { "User-Agent" : "[USER-AGENT]", "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", #"Accept-Language" : "en-US,en;q=0.5", #"Referer" : "https://btc-e.com/", #"Connection" : "keep-alive", #"Cache-Control" : "max-age=0", #"Cookie" : "" } # ------------------------------------------------------------------- #self.setContentEditable( True ); self.setLinkDelegationPolicy( QWebPage.DelegateAllLinks ); self.setForwardUnsupportedContent( True ); self.setNetworkAccessManager( self.PARENT.NET_MANAGER ); self.linkClicked.connect( self.ON_LINK_CLICKED ); self.linkHovered.connect( self.ON_LINK_HOVERED ); self.loadProgress.connect( self.ON_PAGE_LOAD_PROGRESS ); self.downloadRequested.connect( self.PARENT.DOWNLOAD_MANAGER.REQUEST ); self.unsupportedContent.connect( self.PARENT.DOWNLOAD_MANAGER.REQUEST ); # ------------------------------------------------------------------- self.PRINT_ACTION = QAction( self ); self.PRINT_ACTION.setShortcuts( QKeySequence.Print ); self.PRINT_ACTION.triggered.connect( self.PRINT ); self.PARENT.addAction( self.PRINT_ACTION ); # ------------------------------------------------------------------- # SETTINGS self.SETTINGS = self.settings(); self.SETTINGS.setDefaultTextEncoding("utf-8"); # <= [TO-CONFIG.FILE] + ALL FROM BELOW #self.SETTINGS.clearIconDatabase(); #self.SETTINGS.clearMemoryCaches(); self.SETTINGS.setAttribute( QWebSettings.AutoLoadImages, True ); self.SETTINGS.setAttribute( QWebSettings.DnsPrefetchEnabled, True ); self.SETTINGS.setAttribute( QWebSettings.JavascriptEnabled, True ); self.SETTINGS.setAttribute( QWebSettings.JavaEnabled, False ); self.SETTINGS.setAttribute( QWebSettings.PluginsEnabled, True ); self.SETTINGS.setAttribute( QWebSettings.PrivateBrowsingEnabled, False ); self.SETTINGS.setAttribute( QWebSettings.JavascriptCanOpenWindows, True ); # self.SETTINGS.setAttribute( QWebSettings.JavascriptCanCloseWindows, False ); # self.SETTINGS.setAttribute( QWebSettings.JavascriptCanAccessClipboard, True ); # self.SETTINGS.setAttribute( QWebSettings.DeveloperExtrasEnabled, True ); # self.SETTINGS.setAttribute( QWebSettings.SpatialNavigationEnabled, False ); self.SETTINGS.setAttribute( QWebSettings.LinksIncludedInFocusChain, True ); self.SETTINGS.setAttribute( QWebSettings.ZoomTextOnly, False ); self.SETTINGS.setAttribute( QWebSettings.PrintElementBackgrounds, False ); self.SETTINGS.setAttribute( QWebSettings.OfflineStorageDatabaseEnabled, True ); self.SETTINGS.setAttribute( QWebSettings.OfflineWebApplicationCacheEnabled, True ); self.SETTINGS.setAttribute( QWebSettings.LocalStorageEnabled, True ); self.SETTINGS.setAttribute( QWebSettings.LocalStorageDatabaseEnabled, True ); self.SETTINGS.setAttribute( QWebSettings.LocalContentCanAccessRemoteUrls, True ); self.SETTINGS.setAttribute( QWebSettings.LocalContentCanAccessFileUrls, True ); self.SETTINGS.setAttribute( QWebSettings.XSSAuditingEnabled, True ); self.SETTINGS.setAttribute( QWebSettings.AcceleratedCompositingEnabled, True ); self.SETTINGS.setAttribute( QWebSettings.TiledBackingStoreEnabled, False ); self.SETTINGS.setAttribute( QWebSettings.FrameFlatteningEnabled, False ); self.SETTINGS.setAttribute( QWebSettings.SiteSpecificQuirksEnabled, True ); # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< self.SETTINGS.enablePersistentStorage( self.PARENT.STORAGE_ROOT ); self.SETTINGS.setLocalStoragePath( self.PARENT.STORAGE_ROOT+"local_storage/" ); self.SETTINGS.setIconDatabasePath ( self.PARENT.STORAGE_ROOT+"icons_path/" ) self.SETTINGS.setMaximumPagesInCache ( 10 ); # FIXME: Create settings config file [TO-CONFIG.FILE] self.SETTINGS.setOfflineWebApplicationCachePath( self.PARENT.STORAGE_ROOT+"/cache/" ); self.SETTINGS.setOfflineWebApplicationCacheQuota ( 25 * 1024 *1024 ); self.SETTINGS.setOfflineStoragePath( self.PARENT.STORAGE_ROOT ); self.SETTINGS.setOfflineStorageDefaultQuota ( 25 * 1024 *1024 ); #self.SETTINGS.setObjectCacheCapacities (int cacheMinDeadCapacity, int cacheMaxDead, int totalCapacity) # ------------------------------------------------------------------- self.INSPECTOR = QWebInspector( None ); """ __init__ (self, QWidget parent = None) closeEvent (self, QCloseEvent event) bool event (self, QEvent) hideEvent (self, QHideEvent event) QWebPage page (self) resizeEvent (self, QResizeEvent event) setPage (self, QWebPage page) showEvent (self, QShowEvent event) QSize sizeHint (self) """ # ------------------------------------------------------------------- self.INIT(); # ------------------------------------------------------------------- # ======================================================================= def INIT( self ): # ------------------------------------------------------------------- self.HEADERS["User-Agent"] = self.USER_AGENT; # ------------------------------------------------------------------- # ======================================================================= def POST_INIT( self ): # ------------------------------------------------------------------- self.PROGRESS_BAR = QFrame( self.PARENT.WEB_VIEWS[ self.UID ]["WEB_VIEW"] ); self.PROGRESS_BAR.setStyleSheet( "QFrame{ background-color: #F00; }" ); self.PROGRESS_BAR.setGeometry( 0, 0, 0, 5 ); # ------------------------------------------------------------------- # ======================================================================= def EXEC_JS( self, _JS ): # ------------------------------------------------------------------- #frame = self.PARENT.WEB_VIEW.page().mainFrame(); #frame = self.mainFrame(); #frame.evaluateJavaScript( _JS ); self.mainFrame().evaluateJavaScript( _JS.encode("utf-8") ); # ------------------------------------------------------------------- # ======================================================================= def GET_EXTENTIONS( self ): # ------------------------------------------------------------------- #supportsExtension(); pass; # ------------------------------------------------------------------- # ======================================================================= def GET_META_DATA( self ): # ------------------------------------------------------------------- print( "GET_META_DATA:" ); frame = self.mainFrame(); meta_data =frame.metaData(); #dict-of-QString-list-of-QString metaData for meta in meta_data: print(meta); # ------------------------------------------------------------------- # ======================================================================= def GET_PAGE_HTML( self ): # ------------------------------------------------------------------- frame = self.mainFrame(); return unicode(frame.toHtml()).encode('utf-8'); # ------------------------------------------------------------------- # ======================================================================= def GET_PAGE_TITLE( self ): # ------------------------------------------------------------------- return str(self.mainFrame().title()); # ------------------------------------------------------------------- # ======================================================================= def CMD( self, _CMD ): # ------------------------------------------------------------------- #__exec:page:exec:js:function_name # ------------------------------------------------------------------- try: # ----------------------------------------------- if _CMD[0] == "exec": if _CMD[1] == "js": self.EXEC_JS( "".join(_CMD[2:]) ); self.LOCAL_INFO_LOG( str(_CMD) ); return True; # ----------------------------------------------- elif _CMD[0] == "set": if _CMD[1] == "user-agent": self.USER_AGENT = "".join(_CMD[2:]).replace('\"', '\\"').replace("\'", "\\'"); self.EXEC_JS( "alert('set:user-agent:"+self.USER_AGENT+"');" ); self.LOCAL_INFO_LOG( str(_CMD) ); return True; # ----------------------------------------------- elif _CMD[0] == "get": if _CMD[1] == "user-agent": self.EXEC_JS( "alert('get:user-agent:"+self.USER_AGENT+"');" ); self.LOCAL_INFO_LOG( str(_CMD) ); return True; # ----------------------------------------------- self.LOCAL_ERROR_LOG( "UNKNOWN: "+str(_CMD)+" CMD" ); return False; # ----------------------------------------------- except Exception as _err: self.LOCAL_ERROR_LOG( str(_CMD)+": "+str(_err) ); return False; # ------------------------------------------------------------------- # ======================================================================= def AAA_user_BBB_AgentForUrl( self, _url ): # ------------------------------------------------------------------- # Chrome Win/NT 32 Doc-Browser'); #print("-------------------------------------------------------------") #_ByteArray = QUrl.toPercentEncoding( _url.toString(), "{}", " "); #encoded_url = str( _url.encodedQuery() ) #print( encoded_url ); """ print( "authority(): "+str( _url.authority() ) ); print( "encodedHost(): "+str( _url.encodedHost() ) ); print( "encodedPath(): "+str( _url.encodedPath() ) ); print( "encodedQuery(): "+str( _url.encodedQuery() ) ); print( "encodedUserName(): "+str( _url.encodedUserName() ) ); print( "host(): "+str( _url.host() ) ); print( "isLocalFile(): "+str( _url.isLocalFile() ) ); print( "path(): "+str( _url.path() ) ); print( "port(): "+str( _url.port() ) ); print( "userInfo(): "+str( _url.userInfo() ) ); print( "userName(): "+str( _url.userName() ) ); print( "topLevelDomain(): "+str( _url.topLevelDomain() ) ); print( "toString(): "+str( _url.toString() ) ); """ #print("-------------------------------------------------------------") return self.USER_AGENT; # ------------------------------------------------------------------- # ======================================================================= def REPAINT_REQUESTED ( self, _QRect ): #repaintRequested (const QRect&) # ------------------------------------------------------------------- print("NOT-IMPLEMENTED: repaintRequested (const QRect&):"); # ------------------------------------------------------------------- # ======================================================================= def SHOW_INSPECTOR( self ): # ------------------------------------------------------------------- self.INSPECTOR.setPage( self ); self.INSPECTOR.setGeometry( 0,0, 800, 450 ); self.INSPECTOR.show( ); #self.INSPECTOR.showMaximized( ); toolbar_items = [ ".elements", ".resources", ".network", ".scripts", ".timeline", ".profiles", ".audits", ".console" ]; self.mainFrame().evaluateJavaScript(""" document.addEventListener('DOMContentLoaded',function(){ setTimeout(function(){ document.querySelector('.toolbar-item.network').click() }, 2000); }); """); # ------------------------------------------------------------------- # ======================================================================= def ON_LINK_HOVERED(self, _url_A, _url_B, _url_C ): # (const QString&,const QString&,const QString&) # ------------------------------------------------------------------- #print( "ON_LINK_HOVERED: "+self.UID+": ["+str(_url_A)+"]" ); self.PARENT.STATUS_BAR.setText( unicode(str(_url_A)) ); # ------------------------------------------------------------------- # ======================================================================= def ON_LINK_CLICKED(self, _url): # ------------------------------------------------------------------- _url = unicode( str(_url.toString()).replace("file://", "") ); # ------------------------------------------------------------------- #print("ON_LINK_CLICKED: "+self.UID ); if self.M_BTN_CLICK: self.PARENT.CREATE_TAB( _url ); self.PARENT.URL_BAR.SET_TEXT( _url ); else: self.PARENT.URL_BAR.SET_TEXT( _url ); self.PARENT.GO_TO_URL(); self.PARENT.HISTORY_HANDLER.hide(); # ------------------------------------------------------------------- #toAscii(); #toUtf8(); #toLatin1(); #toLocal8Bit(); self.L_BTN_CLICK = False; self.M_BTN_CLICK = False; self.R_BTN_CLICK = False; # ------------------------------------------------------------------- # ======================================================================= def ON_PAGE_LOAD_PROGRESS(self, _int_pr): # ------------------------------------------------------------------- if _int_pr >= 100: if self.PARENT.CURRENT_TAB_BAR_UID == self.UID: self.PARENT.LOADING_BAR.setText( "Loading: Done." ); self.PROGRESS_BAR_W = 0; else: if self.PARENT.CURRENT_TAB_BAR_UID == self.UID: self.PARENT.LOADING_BAR.setText( "Loading: ["+str(_int_pr)+"]" ); self.PROGRESS_BAR_W = self.PROGRESS_BAR_PR * _int_pr; self.PROGRESS_BAR.setGeometry( 0, 0, self.PROGRESS_BAR_W, 5 ); # ------------------------------------------------------------------- # ======================================================================= def SEARCH_INPUT_CTRL( self, _action ): # ------------------------------------------------------------------- if _action == "show": self.SEARCH_INPUT_IS_OPEN = True; self.SEARCH_INPUT.setFocus(); self.SEARCH_INPUT.show(); else: self.SEARCH_INPUT_IS_OPEN = False; self.SEARCH_INPUT.clearFocus(); self.SEARCH_INPUT.hide(); # ------------------------------------------------------------------- # ======================================================================= def FIND_ON_PAGE(self): # ------------------------------------------------------------------- #print("FIND_ON_PAGE: "+self.UID ); try: self.SEARCH_INPUT.setFocus(); self.SEARCH_INPUT_CTRL("show"); _value = unicode( str(self.SEARCH_INPUT.text()).strip() ); #findText (self, QString subString, FindFlags options = 0) self.findText (_value, QWebPage.FindWrapsAroundDocument); # QWebPage.HighlightAllOccurrences except Exception as _err: self.LOCAL_ERROR_LOG( str(_err) ); # ------------------------------------------------------------------- # ======================================================================= def PRINT( self ): # ------------------------------------------------------------------- try: pdf_name = self.GET_PAGE_TITLE()+"_"+str(self.PARENT.GET_TIME(True))+"_"; pdf_name = pdf_name.replace( " ", "-" ).replace( ":", "-" )+".pdf"; self.PRINTER = QPrinter( QPrinter.ScreenResolution ); self.PRINTER.setFontEmbeddingEnabled( False ); self.PRINTER.setFullPage( True ); #self.PRINTER.setPrinterName ("name of printer"); #self.PRINTER.setPrintProgram ( "print program"); self.PRINTER.setOutputFileName ( self.PARENT.DOWNLOAD_DIR+pdf_name ); # ------ > #self.PRINTER.setOutputFormat( QPrinter.NativeFormat ); # <= IMAGE self.PRINTER.setOutputFormat( QPrinter.PdfFormat ); # <= TEXT #self.PRINTER.setOutputFormat( QPrinter.PostScriptFormat ); # ??? #QPrinter will print output using a method defined by the platform it is running on. # This mode is the default when printing directly to a printer. #QPrinter.NativeFormat [0] #QPrinter will generate its output as a searchable PDF file. This mode is the default when printing to a file. #QPrinter.PdfFormat [1] #QPrinter will generate its output as in the PostScript format. (This feature was introduced in Qt 4.2.) #QPrinter.PostScriptFormat [2] self.mainFrame().print_( self.PRINTER ); self.LOCAL_INFO_LOG( "PDF: Saved ["+str(self.PARENT.DOWNLOAD_DIR+pdf_name)+"]" ); except Exception as _err: self.LOCAL_ERROR_LOG( str(_err) ); # ------------------------------------------------------------------- # ======================================================================= def SEND_ESC( self ): # ------------------------------------------------------------------- #print("SEND_ESC: START"); js = ''' try{ var e = document.createEvent('KeyboardEvent'); e.initKeyboardEvent("keyup", true, true, window, 0,0,0,0,0, 27,0 ); document.dispatchEvent(e); var e = document.createEvent('KeyboardEvent'); e.initKeyboardEvent("keydown", true, true, window, 0,0,0,0,0, 27,0 ); document.dispatchEvent(e); var e = document.createEvent('KeyboardEvent'); e.initKeyboardEvent("keypress", true, true, window, 0,0,0,0,0, 27,0 ); document.dispatchEvent(e); }catch(e){ alert(e); } ''' # ------------------------------------------------------------------- self.mainFrame().evaluateJavaScript( js ); #print("SEND_ESC: DONE"); # ------------------------------------------------------------------- # ======================================================================= def event( self, _evt ): # ------------------------------------------------------------------- #self.L_BTN_CLICK = False; #self.M_BTN_CLICK = False; #self.R_BTN_CLICK = False; # ------------------------------------------------------------------- # http://pyqt.sourceforge.net/Docs/PyQt4/qevent.html#Type-enum #print( _evt.type() ); # ------------------------------------------------------------------- #if _evt.type() == QEvent.FocusOut: # (QFocusEvent) == 9 == focus OUT BY CLICK #elif _evt.type() == QEvent.FocusIn: # (QFocusEvent) == 8 == focus IN BY CLICK # ------------------------------------------------------------------- #if _evt.type() == QEvent.ContextMenu: # (QContextMenuEvent) == 82 # ------------------------------------------------------------------- #QEvent.MouseButtonDblClick 4 Mouse press again (QMouseEvent). #QEvent.MouseButtonRelease 3 Mouse release (QMouseEvent). #QPoint _evt.globalPos(); | int _evt.global[X|Y](); | QPoint _evt.pos(); | QPointF _evt.posF(); | int _evt.[x|y]() #_evt.button() == ( Qt.LeftButton | Qt.RightButton | Qt.MidButton ) if _evt.type() == QEvent.MouseButtonPress: # 2 Mouse press (QMouseEvent). #print( "WEB_PAGE["+str(self.UID)+"].event:" ); if _evt.button() == Qt.LeftButton: #print("Qt.LeftButton: "+str(Qt.LeftButton)) self.L_BTN_CLICK = True; elif _evt.button() == Qt.MidButton: #print("Qt.MidButton: "+str(Qt.MidButton)) self.M_BTN_CLICK = True; elif _evt.button() == Qt.RightButton: #print("Qt.RightButton: "+str(Qt.RightButton)) self.R_BTN_CLICK = True; # ------------------------------------------------------------------- """ #QEvent.KeyPress 6 Key press (QKeyEvent). #QEvent.KeyRelease 7 Key release (QKeyEvent). if _evt.type() == QEvent.KeyRelease: print("KeyRelease: ["+str(_evt.text())+", "+str(_evt.nativeScanCode())+", "+str(_evt.key())+"]"); int count (self) bool isAutoRepeat (self) int key (self) bool matches (self, QKeySequence.StandardKey key) Qt.KeyboardModifiers modifiers (self) int nativeModifiers (self) int nativeScanCode (self) int nativeVirtualKey (self) QString text (self) """ # ------------------------------------------------------------------- """ if _evt.type() == QEvent.Enter: # 10 self.setStyleSheet( self.STL["hovered"] ); self.HAS_FOCUS = True; elif _evt.type() == QEvent.Leave: # 11 self.setStyleSheet( self.STL["default"] ); self.HAS_FOCUS = False; """ # ------------------------------------------------------------------- return QWebPage.event(self, _evt); # ------------------------------------------------------------------- # ======================================================================= def LOCAL_INFO_LOG( self, _msg, METHOD=None ): # ------------------------------------------------------------------- if METHOD is None: self.PARENT.LOCAL_INFO_LOG( "['"+self.LOG_TAG+"']: ["+_msg+"]" ); else: self.PARENT.LOCAL_INFO_LOG( "['"+self.LOG_TAG+"."+METHOD+"']: ["+_msg+"]" ); # ------------------------------------------------------------------- # ======================================================================= def LOCAL_ERROR_LOG( self, _msg, METHOD=None ): # ------------------------------------------------------------------- if self.DEBUG or self.PARENT.DEBUG_GLOBAL: self.PARENT.DEBUGGER.DEBUG(); # ------------------------------------------------------------------- if METHOD is None: self.PARENT.LOCAL_ERROR_LOG( "['"+self.LOG_TAG+"']: ["+_msg+"]" ); else: self.PARENT.LOCAL_ERROR_LOG( "['"+self.LOG_TAG+"."+METHOD+"']: ["+_msg+"]" ); # ------------------------------------------------------------------- # ======================================================================= def LOCAL_WARNING_LOG( self, _msg, METHOD=None ): # ------------------------------------------------------------------- if METHOD is None: self.PARENT.LOCAL_WARNING_LOG( "['"+self.LOG_TAG+"']: ["+_msg+"]" ); else: self.PARENT.LOCAL_WARNING_LOG( "['"+self.LOG_TAG+"."+METHOD+"']: ["+_msg+"]" );