class PrintList:
def __init__(self) :
self.printer = QtPrintSupport.QPrinter()
self.headerFont = QtGui.QFont("Arial", pointSize=10,
weight = QtGui.QFont.Bold)
self.bodyFont = QtGui.QFont("Arial", pointSize=10)
self.footerFont = QtGui.QFont("Arial", pointSize=9, italic=True)
self.headerFlags = QtCore.Qt.AlignHCenter | QtCore.Qt.TextWordWrap
self.bodyFlags = QtCore.Qt.TextWordWrap
self.footerFlags = QtCore.Qt.AlignHCenter | QtCore.Qt.TextWordWrap
color = QtGui.QColor(QtCore.Qt.black)
self.headerPen = QtGui.QPen(color, 2)
self.bodyPen = QtGui.QPen(color, 1)
self.margin = 5
self._resetData()
def _resetData(self):
self.headers = None
self.columnWidths = None
self.data = None
self._brush = QtCore.Qt.NoBrush
self._currentRowHeight = 0
self._currentPageHeight = 0
self._headerRowHeight = 0
self._footerRowHeight = 0
self._currentPageNumber = 1
self._painter = None
def printData(self):
self._painter = QtGui.QPainter()
self._painter.begin(self.printer)
self._painter.setBrush(self._brush)
if self._headerRowHeight == 0:
self._painter.setFont(self.headerFont)
self._headerRowHeight = self._calculateRowHeight(self.columnWidths, self.headers)
if self._footerRowHeight == 0:
self._painter.setFont(self.footerFont)
self._footerRowHeight = self._calculateRowHeight([self.printer.width()], "Страница")
for i in range(len(self.data)):
height = self._calculateRowHeight(self.columnWidths, self.data[i])
if self._currentPageHeight + height > self.printer.height() - self._footerRowHeight - 2 * self.margin:
self._printFooterRow()
self._currentPageHeight = 0
self._currentPageNumber += 1
self.printer.newPage()
if self._currentPageHeight == 0:
self._painter.setPen(self.headerPen)
self._painter.setFont(self.headerFont)
self.printRow(self.columnWidths, self.headers,
self._headerRowHeight, self.headerFlags)
self._painter.setPen(self.bodyPen)
self._painter.setFont(self.bodyFont)
self.printRow(self.columnWidths, self.data[i],
height, self.bodyFlags)
self._printFooterRow()
self._painter.end()
self._resetData()
def _calculateRowHeight(self, widths, cellData):
height = 0
for i in range(len(widths)):
r = self._painter.boundingRect(0, 0, widths[i] -
2 * self.margin, 50, QtCore.Qt.TextWordWrap,
str(cellData[i]))
h = r.height() + 2 * self.margin
if height < h:
height = h
return height
def printRow(self, widths, cellData, height, flags):
x = 0
for i in range(len(widths)):
self._painter.drawText(x + self.margin,
self._currentPageHeight + self.margin,
widths[i] - self.margin, height - 2 * self.margin,
flags, str(cellData[i]))
self._painter.drawRect(x, self._currentPageHeight,
widths[i], height)
x += widths[i]
self._currentPageHeight += height
def _printFooterRow(self):
self._painter.setFont(self.footerFont)
self._painter.drawText(self.margin, self.printer.height() -
self._footerRowHeight - self.margin, self.printer.width() -
2 * self.margin, self._footerRowHeight - 2 * self.margin,
self.footerFlags, "Страница " + str(self._currentPageNumber))
data = result[0:]
p1 = PrintList()
p1.printer.setOutputFileName("output.pdf")
print(3)
p1.data = data
p1.columnWidths = [100,350,200]
p1.headers = ["Код кафедры","Наименование", "Заведующий"]
p1.printData()
print(3)
2 минуты
26 ноября 2023