from PyQt5.QtGui import *
from PyQt5 import uic
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import QtWidgets, uic
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, QVBoxLayout, QPushButton, QDialog
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPdfWriter, QPagedPaintDevice, QPainter, QScreen, QPixmap
from PyQt5.QtPrintSupport import QPrinter, QPrintDialog
import sys
import random
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True)
form_class = uic.loadUiType("qt semple7.ui")[0]
class WindowClass(QMainWindow, form_class) :
def __init__(self) :
super().__init__()
self.setupUi(self)
self.pushButton_3.clicked.connect(self.btnClick)
self.pushButton_5.clicked.connect(self.btnClick2)
def btnClick(self):
# printer creation, running
printer = QPrinter()
dlg = QPrintDialog(printer, self)
if dlg.exec() == QDialog.Accepted:
# Creating a Patter
qp = QPainter()
qp.begin(printer)
# margin ratio
wgap = printer.pageRect().width()*0.1
hgap = printer.pageRect().height()*0.1
# Place the widget in the center of the screen
xscale = (printer.pageRect().width()-wgap)/self.table.width()
yscale = (printer.pageRect().height()-hgap)/self.table.height()
scale = xscale if xscale < yscale else yscale
qp.translate(printer.paperRect().x() + printer.pageRect().width()/2, printer.paperRect().y() + printer.pageRect().height()/2)
qp.scale(scale, scale);
qp.translate(-self.table.width()/2, -self.table.height()/2);
# Printing
self.table.render(qp)
qp.end()
def btnClick2(self):
# Create pdf
pdf = QPdfWriter('test.pdf')
pdf.setPageSize(QPagedPaintDevice.A4)
# Screen capture.
screen = QApplication.primaryScreen()
img = screen.grabWindow(self.winId(), 0,0, self.rect().width(),self.rect().height())
# Trinomial operator (a if test is true, a, or b is true, or b)
# Image size is based on large values and PDF size is based on small values (prevent screen overrun)
img_size = img.width() if img.width()-img.height() > 0 else img.height()
pdf_size = pdf.width() if pdf.width()-pdf.height() < 0 else pdf.height()
# Obtaining the Optimal Ratio
ratio = pdf_size / img_size
# writing to pdf
qp = QPainter()
qp.begin(pdf)
point = QPoint(0, 0)
qp.drawPixmap(point, img.width()*ratio, img.height()*ratio, img)
qp.end()
if __name__ == "__main__" :
app = QApplication(sys.argv)
myWindow = WindowClass()
myWindow.show()
app.exec_()
Hello! Looking at the code, self.Cannot find variable table. The widget that you want to print using the printer is self.Would you like to change it to table? If you find and print this part, there will be no error.
Also, pdf before QPainter prints the PDF file in the PDF output part.The begin() method must be called. Try changing to qp.begin(pdf). And qp after completing the PDF file creation.Call end() to finish.
Below is the revised code.
from PyQt5.QtGui import *
from PyQt5 import uic
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import QtWidgets, uic
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, QVBoxLayout, QPushButton, QDialog
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPdfWriter, QPagedPaintDevice, QPainter, QScreen, QPixmap
from PyQt5.QtPrintSupport import QPrinter, QPrintDialog
import sys
import random
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True)
form_class = uic.loadUiType("qt semple7.ui")[0]
class WindowClass(QMainWindow, form_class) :
def __init__(self) :
super().__init__()
self.setupUi(self)
self.pushButton_3.clicked.connect(self.btnClick)
self.pushButton_5.clicked.connect(self.btnClick2)
def btnClick(self):
# printer creation, running
printer = QPrinter()
dlg = QPrintDialog(printer, self)
if dlg.exec() == QDialog.Accepted:
# Creating a Patter
qp = QPainter()
qp.begin(printer)
# margin ratio
wgap = printer.pageRect().width()*0.1
hgap = printer.pageRect().height()*0.1
# Place the widget in the center of the screen
xscale = (printer.pageRect().width()-wgap)/self.centralWidget().width()
yscale = (printer.pageRect().height()-hgap)/self.centralWidget().height()
scale = xscale if xscale < yscale else yscale
qp.translate(printer.paperRect().x() + printer.pageRect().width()/2, printer.paperRect().y() + printer.pageRect().height()/2)
qp.scale(scale, scale);
qp.translate(-self.centralWidget().width()/2, -self.centralWidget().height()/2);
# Printing
self.centralWidget().render(qp)
qp.end()
def btnClick2(self):
# Create pdf
pdf = QPdfWriter('test.pdf')
pdf.setPageSize(QPagedPaintDevice.A4)
# Creating a Patter
qp = QPainter()
qp.begin(pdf)
# Screen capture.
screen = QApplication.primaryScreen()
img = screen.grabWindow(self.winId(), 0, 0, self.rect().width(), self.rect().height())
# Trinomial operator (a if test is true, a, or b is true, or b)
# Image size is based on large value, PDF size is small value
`
© 2024 OneMinuteCode. All rights reserved.