def readData(self, data): """Restore saved settings from a dictionary. Arguments: data -- a dictionary of stored non-default settings """ self.setDefaults() # necessary for undo/redo self.drawLines = data.get('printlines', True) self.widowControl = data.get('printwidowcontrol', True) self.indentFactor = data.get('printindentfactor', 2.0) if 'printpapersize' in data: self.pageLayout.setPageSize( QPageSize(getattr(QPageSize, data['printpapersize']))) self.pageLayout.setMargins(QMarginsF(*(_defaultMargin, ) * 4)) if 'printpaperwidth' in data and 'printpaperheight' in data: width = data['printpaperwidth'] height = data['printpaperheight'] self.pageLayout.setPageSize( QPageSize(QSizeF(width, height), QPageSize.Inch)) self.pageLayout.setMargins(QMarginsF(*(_defaultMargin, ) * 4)) if not data.get('printportrait', True): self.pageLayout.setOrientation(QPageLayout.Landscape) if 'printmargins' in data: margins = data['printmargins'] self.pageLayout.setMargins(QMarginsF(*margins)) self.headerMargin = data.get('printheadermargin', _defaultHeaderPos) self.footerMargin = data.get('printfootermargin', _defaultHeaderPos) self.numColumns = data.get('printnumcolumns', 1) self.columnSpacing = data.get('printcolumnspace', _defaultColumnSpace) self.headerText = data.get('printheadertext', '') self.footerText = data.get('printfootertext', '') if 'printfont' in data: self.useDefaultFont = False self.mainFont.fromString(data['printfont']) self.adjustSpacing()
def checkPageLayout(self): """Check and set the page layout on the current printer. Verify that the layout settings match the printer, adjust if required. """ if not self.printer.setPageLayout(self.pageLayout): tempPrinter = QPrinter() tempPageLayout = tempPrinter.pageLayout() tempPageLayout.setUnits(QPageLayout.Inch) pageSizeIssue = False defaultPageSize = tempPageLayout.pageSize() tempPageLayout.setPageSize(self.pageLayout.pageSize()) if not tempPrinter.setPageLayout(tempPageLayout): pageSizeIssue = True tempPageLayout.setPageSize(defaultPageSize) marginIssue = not (tempPageLayout.setMargins( self.pageLayout.margins()) and tempPrinter.setPageLayout(tempPageLayout)) if marginIssue: margin = 0.1 while True: if (tempPageLayout.setMargins(QMarginsF(*(margin, ) * 4)) and tempPrinter.setPageLayout(tempPageLayout)): break margin += 0.1 newMargins = [] for oldMargin in self.roundedMargins(): newMargins.append( oldMargin if oldMargin >= margin else margin) tempPageLayout.setMargins(QMarginsF(*newMargins)) tempPageLayout.setOrientation(self.pageLayout.orientation()) self.printer.setPageLayout(tempPageLayout) if not pageSizeIssue and not marginIssue: return if pageSizeIssue and marginIssue: msg = _('Warning: Page size and margin settings unsupported ' 'on current printer.\nSave page adjustments?') elif pageSizeIssue: msg = _('Warning: Page size setting unsupported ' 'on current printer.\nSave adjustment?') else: msg = _('Warning: Margin settings unsupported ' 'on current printer.\nSave adjustments?') ans = QMessageBox.warning(QApplication.activeWindow(), 'TreeLine', msg, QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if ans == QMessageBox.Yes: self.pageLayout = tempPageLayout
def __init__(self, file_name, card_format, paper_format, separation=[0.8, 0.8]): self.cardFormat = self.mm2pix(card_format) self.paperFormat = self.mm2pix(paper_format) self.separation = self.mm2pix(separation) self.paperFormatMM = paper_format self.file = QFile(str(file_name)) self.file.open(QIODevice.WriteOnly) self.writer = QPdfWriter(self.file) self.writer.setResolution(self.RESOLUTION) self.writer.setPageSizeMM(QSizeF(*self.paperFormatMM)) self.writer.setPageMargins(QMarginsF(0, 0, 0, 0)) self.painter = QPainter(self.writer) self.pen = QPen() self.pen.setWidth(self.mm2pix([1])[0]) self.painter.setPen(self.pen) self.bleeding = [0, 0] self.bleeding[0] = (self.paperFormat[0] % int(self.cardFormat[0] + self.separation[0])) / 2 self.bleeding[1] = (self.paperFormat[1] % int(self.cardFormat[1] + self.separation[1])) / 2 self.cursor = self.bleeding[:] self._setupPage()
def printPDF(url, margins): app = QtWidgets.QApplication(sys.argv) loader = QtWebEngineWidgets.QWebEngineView() loader.setZoomFactor(1) loader.load(QtCore.QUrl(url)) layout = QPageLayout( QPageSize(QPageSize.A4), QPageLayout.Portrait, QMarginsF(margins[0], margins[1], margins[2], margins[3])) def printFinished(): page = loader.page() page.profile().clearHttpCache() log("%s Printing Finished!" % page.title()) app.exit() def printToPDF(finished): loader.show() page = loader.page() page.printToPdf("./pdfs/%s.pdf" % page.title(), layout) loader.page().pdfPrintingFinished.connect(printFinished) loader.loadFinished.connect(printToPDF) app.exec_()
def __init__(self, filePath, parent=None): """ Constructor @param filePath path of the file to write into @type str @param parent reference to the parent widget @type QWidget """ super(PrintToPdfDialog, self).__init__(parent) self.setupUi(self) self.pdfFilePicker.setMode(E5PathPickerModes.SaveFileOverwriteMode) self.pdfFilePicker.setFilters( self.tr("PDF Files (*.pdf);;" "All Files (*)")) if not os.path.isabs(filePath): documentsPath = QStandardPaths.writableLocation( QStandardPaths.DocumentsLocation) if documentsPath: filePath = os.path.join(documentsPath, filePath) else: filePath = os.path.abspath(filePath) self.pdfFilePicker.setText(filePath, toNative=True) self.__currentPageLayout = QPageLayout(QPageSize(QPageSize.A4), QPageLayout.Portrait, QMarginsF(0.0, 0.0, 0.0, 0.0)) self.__updatePageLayoutLabel()
def setMainPixmap(self, pixmap): self.mainPixmapItem.setPixmap(pixmap) # set scene rect boundingRect = self.mainPixmapItem.boundingRect() margin = 0 boundingRect += QMarginsF(margin, margin, margin, margin) self.scene.setSceneRect(boundingRect)
def load_finished(self): if self.do_preview: self.show() else: pageLayout = QPageLayout(QPageSize(QPageSize.A5), QPageLayout.Portrait, QMarginsF(0, 0, 0, 0)) self.page().printToPdf(self.filename, pageLayout) self.page().pdfPrintingFinished.connect(on_pdf_finished)
def _sceneRect(self): rect = self.scene().sceneRect() return rect.marginsAdded( QMarginsF( 0.05 * rect.width(), 0.05 * rect.height(), 0.05 * rect.width(), 0.05 * rect.height(), ))
def reallocate_scene(self): self.scene = QGraphicsScene() self.view.setScene(self.scene) self.view.resetTransform() self.view.resetCachedContent() self.view.setSceneRect(QRectF()) self.view.fitInView(self.scene.sceneRect().marginsAdded(QMarginsF(10, 10, 10, 10)), Qt.KeepAspectRatio)
def paint(self, painter: QPainter, options, widget=None): painter.setBrush(QBrush(self.fill_color_current)) painter.setPen(QPen(QColor(0, 0, 0, 0))) painter.drawRoundedRect(self.rect, 5, 5) if self.pixmap is not None: painter.drawPixmap(self.hor_margin * self.scaling, self.ver_margin * self.scaling, self.pixmap) if self.tooltip_shown: painter.setBrush(QBrush(QColor(50, 50, 50, 200))) painter.drawRoundedRect(self.tooltip.boundingRect().translated(self.tooltip.pos()) .marginsAdded(QMarginsF(5, 0, 5, 0)), 5, 5)
def __init__(self, label=""): QGraphicsEllipseItem.__init__(self) self.text = label self.textItem = GraphicsTextItem(self.text, parent=self) self.textItem.setTextInteractionFlags(Qt.TextEditorInteraction) self.setRect(self.textItem.boundingRect().marginsAdded( QMarginsF(10, 10, 10, 10))) self.setFlags(QGraphicsItem.ItemIsSelectable) self.observers = set() self.edgeInConstruction = None
def scale_initializer_deffered_function(): self.view.resetTransform() # print("size when loading: ", self.view.viewport().size()) if self.slide_view_params.level_rect: # self.view.fitInView(QRectF(*self.slide_view_params.level_rect), Qt.KeepAspectRatioByExpanding) self.view.fitInView(QRectF(*self.slide_view_params.level_rect), Qt.KeepAspectRatio) # print("after fit: ", self.get_current_view_scene_rect()) else: start_margins = QMarginsF(200, 200, 200, 200) start_image_rect_ = self.slide_helper.get_rect_for_level( self.slide_view_params.level) self.view.fitInView(start_image_rect_ + start_margins, Qt.KeepAspectRatio)
def writePdf(self, name): pdfFile = QFile(name) #打开要写入的pdf文件 pdfFile.open(QIODevice.WriteOnly) #创建pdf写入器 pPdfWriter = QPdfWriter(pdfFile) #设置纸张为A4 pPdfWriter.setPageSize(QPagedPaintDevice.A4) #设置纸张的分辨率为300,因此其像素为3508X2479 pPdfWriter.setResolution(300) pPdfWriter.setPageMargins(QMarginsF(60, 60, 60, 60)) pPdfPainter = QPainter(pPdfWriter) # 标题上边留白 iTop = 100 #文本宽度2100 iContentWidth = 2100 # 标,22号字 font = QFont() font.setFamily("simhei.ttf") fontSize = 22 font.setPointSize(fontSize) pPdfPainter.setFont(font) pPdfPainter.drawText(QRect(0, iTop, iContentWidth, 90), Qt.AlignHCenter, "我是标题我骄傲") # 内容,16号字,左对齐 fontSize = 16 font.setPointSize(fontSize) pPdfPainter.setFont(font) iTop += 90 pPdfPainter.drawText(QRect(0, iTop, iContentWidth, 60), Qt.AlignLeft, "1、目录一") iTop += 90 # 左侧缩进2字符 iLeft = 120 pPdfPainter.drawText(QRect(iLeft, iTop, iContentWidth - iLeft, 60), Qt.AlignLeft, "我的目录一的内容。") iTop += 90 pPdfPainter.drawText(QRect(0, iTop, iContentWidth, 60), Qt.AlignLeft, "2、目录二") iTop += 90 pPdfPainter.drawText(QRect(iLeft, iTop, iContentWidth - iLeft, 60), Qt.AlignLeft, "我的目录一的内容") pPdfPainter.end() pdfFile.close()
def __post_init__(self): # Scaling ratio for Qt point 72dpi -> constants.PRINT_DPI ratio = 72 / constants.PRINT_DPI super().__setattr__( "qt_object", QPageLayout( QPageSize( QSize( int(self.width.base_value * ratio), int(self.height.base_value * ratio), ), ), QPageLayout.Portrait, # Margins are implemented at a higher level QMarginsF(0, 0, 0, 0), ), )
def setDefaults(self): """Set all paparmeters saved in TreeLine files to default values. """ self.drawLines = True self.widowControl = True self.indentFactor = 2.0 self.pageLayout.setUnits(QPageLayout.Inch) self.pageLayout.setPageSize(QPageSize(QPageSize.Letter)) self.pageLayout.setOrientation(QPageLayout.Portrait) self.pageLayout.setMargins(QMarginsF(*(_defaultMargin, ) * 4)) self.headerMargin = _defaultHeaderPos self.footerMargin = _defaultHeaderPos self.numColumns = 1 self.columnSpacing = _defaultColumnSpace self.headerText = '' self.footerText = '' self.useDefaultFont = True self.setDefaultFont()
def generate_pdf(df_data): app = QtWidgets.QApplication(sys.argv) list_globalid = list(set(df_data['Global ID'].to_list())) print(list_globalid) for gid in list_globalid: html_file = 'P' + str(gid) + '.html' df_temp = df_data[df_data['Global ID'] == gid] df_temp.columns = set_columns() th_props = [('font-size', '8px'), ('text-align', 'center'), ('font-weight', 'bold'), ('color', '#6d6d6d'), ('background-color', '#f7f7f9')] td_props = [('font-size', '8px')] pd.set_option('colheader_justify', 'center') # FOR TABLE <th> df_temp.to_html(html_file, index=False, justify='left', border="1") loader = QtWebEngineWidgets.QWebEngineView() loader.load(QtCore.QUrl(get_path() + html_file)) layout = QPageLayout(QPageSize(QPageSize.A4), QPageLayout.Portrait, QMarginsF(8, 12, 8, 12)) def printFinished(): page = loader.page() # print("%s Printing Finished!" % page.title()) app.exit() def printToPDF(finished): loader.show() page = loader.page() page.printToPdf("%s.pdf" % page.title()[:9], layout) print("Generated pdf file %s.pdf" % page.title()[:9]) loader.page().pdfPrintingFinished.connect(printFinished) loader.loadFinished.connect(printToPDF) app.exec_() loader.close() app.closeAllWindows()
def update_view(self, steno_layout: StenoLayout, stroke: List[str]): ''' Updates the layout display for the provided layout and stroke ''' scene = self.graphics_scene pen = self._scene_pen font = QFont(steno_layout.font) if steno_layout.font else QFont() # Clear all items from the scene. Could be more efficient... scene.clear() scene.setBackgroundBrush(QBrush(QColor(steno_layout.background_color))) for key in steno_layout.keys: path = LayoutDisplayView._create_key_path(steno_layout, key) brush = LayoutDisplayView._get_key_path_brush(key, (key.name in stroke)) pen.setColor(QColor(key.stroke_color)) # Add the key path before its label, then center the label scene.addPath(path, pen, brush) if key.label: label = QGraphicsTextItem(key.label) label.setFont(font) label.setDefaultTextColor(QColor(key.font_color)) label_rect = label.boundingRect() label_rect.moveCenter(path.boundingRect().center()) label.setPos(label_rect.x(), label_rect.y()) scene.addItem(label) # Scene rects don't shrink when items are removed, so need to manually # set it to the current size needed by the contained items + margin margin = steno_layout.margin scene_rect = scene.itemsBoundingRect() scene_rect = scene_rect.marginsAdded(QMarginsF(margin, margin, margin, margin)) scene.setSceneRect(scene_rect) self.fitInView(scene.sceneRect(), Qt.KeepAspectRatio) self.setScene(scene) self.show()
def get_new_scene_rect(self): first_pass = True for group in canvas.group_list: for widget in group.widgets: if widget is None or not widget.isVisible(): continue item_rect = widget.boundingRect().translated(widget.scenePos()) item_rect = item_rect.marginsAdded(QMarginsF(50, 20, 50, 20)) if first_pass: full_rect = item_rect else: full_rect = full_rect.united(item_rect) first_pass = False if not first_pass: return full_rect return QRectF()
def savePdf(self): fileName = QFileDialog.getSaveFileName(self, self.tr("Export document to PDF"), self.currentTab.getBaseName() + ".pdf", self.tr("PDF files (*.pdf)"))[0] if fileName: if not QFileInfo(fileName).suffix(): fileName += ".pdf" title, htmltext, preview = self.currentTab.getDocumentForExport() if globalSettings.useWebEngine and hasattr(preview.page(), "printToPdf"): pageSize = self.getPageSizeByName(globalSettings.paperSize) if pageSize is None: pageSize = QPageSize(QPageSize.A4) margins = QMarginsF(20, 20, 13, 20) # left, top, right, bottom (in millimeters) layout = QPageLayout(pageSize, QPageLayout.Portrait, margins, QPageLayout.Millimeter) preview.page().printToPdf(fileName, layout) # Available since Qt 5.7 return printer = self.standardPrinter(title) printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName(fileName) document = self.getDocumentForPrint(title, htmltext, preview) if document != None: document.print(printer)
def adjust_view_to_fit(self): viewOrigin = self.view.rect().topLeft() sceneOrigin = self.view.mapFromScene(self.scene.sceneRect().translated(-15, -15).topLeft()) if viewOrigin.x() >= sceneOrigin.x() or viewOrigin.y() >= sceneOrigin.y(): #self.view.fitInView(QRectF(0, 0, 50, 50).united(self.scene.sceneRect().marginsAdded(QMarginsF(100, 100, 100, 100))), Qt.KeepAspectRatio) self.view.fitInView(self.scene.sceneRect().marginsAdded(QMarginsF(50, 50, 50, 50)), Qt.KeepAspectRatio)
def wideRect(self, width=10) -> QRectF: rect = self.boundingRect(border=False) return rect.marginsAdded(QMarginsF(*[width] * 4))
def paint(self, painter: QPainter, option: QStyleOptionGraphicsItem, widget: Optional[PyQt5.QtWidgets.QWidget] = ...): painter.setPen(QPen(self.current_color, 1.0)) brush = QBrush(self.current_highlight_color) pen = QPen(brush, 4) painter.setPen(pen) if self.highlighted: painter.fillRect(self.boundingRect(), QBrush(self.current_highlight_color)) if self.frame_color is not None and self.mode != StickMode.Edit and self.mode != StickMode.EditDelete: painter.setPen(QPen(self.frame_color, 4)) painter.drawRect(self.boundingRect()) pen = QPen(QColor(0, 255, 0, 255)) pen.setWidth(1.0) pen.setColor(QColor(255, 0, 255, 255)) pen.setStyle(Qt.DotLine) painter.setPen(pen) off = 10 painter.drawLine(self.line.p1() - QPointF(0, off), self.line.p1() + QPointF(0, off)) painter.drawLine(self.line.p1() - QPointF(off, 0), self.line.p1() + QPointF(off, 0)) painter.drawLine(self.line.p2() - QPointF(0, off), self.line.p2() + QPointF(0, off)) painter.drawLine(self.line.p2() - QPointF(off, 0), self.line.p2() + QPointF(off, 0)) pen.setStyle(Qt.SolidLine) pen.setColor(QColor(0, 255, 0, 255)) painter.setPen(pen) if self.mode != StickMode.EditDelete: pen.setWidth(2.0) br = painter.brush() painter.setPen(pen) painter.drawEllipse(self.line.p1(), 10, 10) painter.drawEllipse(self.line.p2(), 10, 10) painter.setBrush(br) if self.mode == StickMode.Measurement and self.proposed_snow_height >= 0: point = QPointF(self.boundingRect().x(), -self.proposed_snow_height + self.line.p2().y()) pen = QPen(QColor(200, 100, 0, 255), 3.0) painter.setPen(pen) painter.drawLine(point, point + QPointF(self.boundingRect().width(), 0.0)) if self.measured_height >= 0: vec = (self.stick.top - self.stick.bottom) / np.linalg.norm(self.stick.top - self.stick.bottom) dist_along_stick = self.measured_height / np.dot(np.array([0.0, -1.0]), vec) point = self.line.p2() + dist_along_stick * QPointF(vec[0], vec[1]) point = QPointF(self.boundingRect().x(), point.y()) pen = QPen(QColor(0, 100, 200, 255), 3.0) painter.setPen(pen) painter.drawLine(point, point + QPointF(self.boundingRect().width(), 0.0)) else: painter.drawLine(self.line.p1(), self.line.p2()) if self.selected: pen.setColor(QColor(255, 125, 0, 255)) pen.setStyle(Qt.DashLine) painter.setPen(pen) painter.drawRect(self.boundingRect().marginsAdded(QMarginsF(5, 5, 5, 5))) if self.show_measurements: painter.fillRect(self.stick_label_text.boundingRect().translated(self.stick_label_text.pos()), QBrush(QColor(0, 0, 0, 120)))
def update(self, *args, **kwargs): self.setRect(self.textItem.boundingRect().marginsAdded( QMarginsF(10, 10, 10, 10))) QGraphicsEllipseItem.update(self, *args, **kwargs)
def handle_highlight_animation_value_changed(self, new: QColor): if not self.deleting: self.update(self.boundingRect().marginsAdded(QMarginsF(10, 10, 10, 10)))