Unable to print QWidget to PDF at high resolution

174 Views Asked by At

I am trying to print a QWidget to pdf at A4 page size with QPrinter. But unable to generate it in a better quality. The PDF looks blurry. Please find the code I have tried below. Any help regarding the pdf quality is highly appreciable.

import os
import datetime
from PySide6.QtCore import QSize
from PySide6.QtGui import QPageSize
from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QLabel, QTableWidget, QVBoxLayout, QTableWidgetItem, QHeaderView
from PySide6.QtPrintSupport import QPrinter


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("")
        self.setFixedSize(QSize(794, 1123))
        self.line = QLineEdit()
        self.l1 = QLabel("This is testing")
        self.table_widget = QTableWidget(4,5, self)
        self.table_widget.setHorizontalHeaderLabels(["Item", "Batch"])
        self.table_widget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
        self.table_widget.setItem(0,0, QTableWidgetItem("Item Name"))
        self.table_widget.setItem(0,1, QTableWidgetItem("Batch no"))
        self.table_widget.setItem(0,2, QTableWidgetItem("Item Name"))
        self.table_widget.setItem(0,3, QTableWidgetItem("Item Name"))
        self.table_widget.setItem(1,0, QTableWidgetItem("Item Name"))
        self.table_widget.setItem(1,1, QTableWidgetItem("Item Name"))
        self.table_widget.setItem(1,2, QTableWidgetItem("Item Name"))
        self.table_widget.setItem(1,3, QTableWidgetItem("Item Name"))
        self.table_widget.setItem(2,0, QTableWidgetItem("Item Name"))
        self.table_widget.setItem(2,1, QTableWidgetItem("Item Name"))
        layout = QVBoxLayout()
        layout.addWidget(self.table_widget)
        self.setLayout(layout)
        

    def exportToPDF(self, filename):
        printer = QPrinter()
        printer.setPageSize(QPageSize.A4)
        printer.PrinterMode.HighResolution
        printer.setOutputFormat(QPrinter.PdfFormat)
        printer.setOutputFileName(filename)

        self.render(printer)


if __name__ == "__main__":
    app = QApplication([])

    example = Example()
    example.show()
    example.exportToPDF("invoice_" + str(datetime.datetime.now().strftime('%Y%m%d%H%M')) + ".pdf")
    os.system("start " + "invoice_" + str(datetime.datetime.now().strftime('%Y%m%d%H%M')) + ".pdf")
    
    app.exec()

Please find the pdf attached here - https://drive.google.com/file/d/1p1HbfRQixZ-lfERtfzlF_ZPFX3pkT_tv/view?usp=sharing

1

There are 1 best solutions below

0
Sayan On

I would first like to thank @musicamante, @ekhumoro and @KJ for your help. I finally figured out a solution. Here I am sharing the updated code.

import os
import datetime
from PySide6.QtCore import QSize
from PySide6.QtGui import QPageSize, QFont
from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QLabel, QTableWidget, QVBoxLayout, QTableWidgetItem, QHeaderView
from PySide6.QtPrintSupport import QPrinter


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.setFixedSize(QSize(2480, 3508))
        self.table_widget = QTableWidget(35,5, self)
        self.table_widget.setHorizontalHeaderLabels(["Item", "Batch", "MRP", "Quantity", "Amount"])
        self.table_widget.horizontalHeader().setFont(QFont("Arial", 30))
        self.table_widget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
        self.table_widget.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeMode.ResizeToContents)
        self.table_widget.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeMode.ResizeToContents)
        self.table_widget.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeMode.ResizeToContents)
        self.table_widget.horizontalHeader().setSectionResizeMode(4, QHeaderView.ResizeMode.ResizeToContents)
        self.table_widget.verticalHeader().setDefaultSectionSize(100)
        self.table_widget.setFont(QFont("Arial", 30))
        for i in range(0,35):
            for j in range(0,5):
                self.table_widget.setItem(i,j, QTableWidgetItem("Item Name_"+str(i)+"_"+str(j)))

        layout = QVBoxLayout()
        layout.addWidget(self.table_widget)
        self.setLayout(layout)
        

    def exportToPDF(self, filename):
        printer = QPrinter()
        pageSize = QPageSize(QPageSize.A4)
        printer.setPageSize(pageSize)
        printer.setResolution(300)
        printer.setOutputFormat(QPrinter.PdfFormat)
        printer.setOutputFileName(filename)

        self.render(printer)


if __name__ == "__main__":
    app = QApplication([])

    example = Example()
    example.show()
    example.exportToPDF("invoice_" + str(datetime.datetime.now().strftime('%Y%m%d%H%M')) + ".pdf")
    os.system("start " + "invoice_" + str(datetime.datetime.now().strftime('%Y%m%d%H%M')) + ".pdf")
    
    app.exec()