На этом шаге мы рассмотрим организацию вывода на печать.
Процесс вывода документа на печать средствами PyQt можно разбить на следующие этапы:
printer = QtPrintSupport.QPrinter()
painter = QtGui.QPainter()
painter.begin(printer)
printer.newPage()
painter.end()
Перед началом вывода графики нам понадобится определить размеры всей страницы принтера, размеры области на ней, доступной для рисования, и некоторые другие параметры, касающиеся этих размеров. Для этого мы воспользуемся следующими методами класса QPrinter (полный список их можно найти на страницах https://doc.qt.io/qt-5/qprinter.html и https://doc.qt.io/qt-5/qpaintdevice.html):
Начало координат находится в левом верхнем углу области, отведенной под вывод графики, - лишь в этой области мы можем выводить графику. Горизонтальная координатная ось направлена направо, а вертикальная - вниз.
Для примера напишем код, который будет выводить на установленный по умолчанию принтер документ из двух страниц. Первую страницу мы обведем точечной синей рамкой, а по ее центру расположим надпись "QPrinter". Вторая страница будет отпечатана в ландшафтной ориентации, и ее полностью займет графическое изображение.
from PyQt5 import QtCore, QtWidgets, QtGui, QtPrintSupport import sys app = QtWidgets.QApplication(sys.argv) # Создаем принтер printer = QtPrintSupport.QPrinter() # Для целей отладки лучше выводить документ не на принтер, # а в файл в формате PDF. Чтобы сделать это, достаточно # раскомментировать следующую строчку кода: # printer.setOutputFileName("output.pdf") # Создаем поверхность рисования и привязываем ее к принтеру painter = QtGui.QPainter() painter.begin(printer) # Рисуем рамку вокруг страницы pen = QtGui.QPen(QtGui.QColor(QtCore.Qt.blue), 5, style = QtCore.Qt.DotLine) painter.setPen(pen) painter.setBrush(QtCore.Qt.NoBrush) painter.drawRect(0, 0, printer.width(), printer.height()) # Выводим надпись color = QtGui.QColor(QtCore.Qt.black) painter.setPen(QtGui.QPen(color)) painter.setBrush(QtGui.QBrush(color)) font = QtGui.QFont("Verdana", pointSize = 42) painter.setFont(font) painter.drawText(10, printer.height() // 2 - 100, printer.width() - 20, 50, QtCore.Qt.AlignCenter | QtCore.Qt.TextDontClip, "QPrinter") # Изменяем ориентацию страницы. Сделать это нужно перед вызовом # метода newPage() printer.setPageOrientation(QtGui.QPageLayout.Landscape) # Переходим на новую страницу printer.newPage() # Выводим изображение pixmap = QtGui.QPixmap("img.jpg") pixmap = pixmap.scaled(printer.width(), printer.height(), aspectRatioMode = QtCore.Qt.KeepAspectRatio) painter.drawPixmap(0, 0, pixmap) painter.end()
Содержимое pdf-файла приведено на рисунке 1.
Рис.1. Результат работы приложения
На следующем шаге мы закончим изучение этого вопроса.