Шаг 300.
Библиотека PyQt5.
Печать документов. Основные средства печати. Вывод на печать

    На этом шаге мы рассмотрим организацию вывода на печать.

    Процесс вывода документа на печать средствами PyQt можно разбить на следующие этапы:

  1. Создание принтера (экземпляра класса QPrinter) и задание его параметров:
      printer = QtPrintSupport.QPrinter()
    
  2. Создание экземпляра класса QPainter:
      painter = QtGui.QPainter()
    
  3. Вызов метода begin(<QPaintDevice>) класса QPainter и передача ему в качестве параметров только что созданного принтера:
      painter.begin(printer)
    
    Метод begin() инициирует процесс вывод графики на принтер. Он возвращает True, если инициализация прошла успешно, и False - в противном случае.

  4. Выполнение вывода необходимой графики, составлятощей собственно содержимое документа, средствами класса QPainter.

  5. В случае необходимости начать вывод новой страницы - вызов метода newPage() класса QPrinter:
      printer.newPage()
    
    Метод newPage() подготавливает принтер к выводу новой страницы и возвращает True, если подготовка увенчалась успехом, и False - в противном случае.

  6. По окончании вывода документа - вызов метода end() класса QPainter:
      painter.end()
    
    Этот метод завершает рисование графики и возвращает True, если вывод графики был закончен успешно, и False - в противном случае. После его вызова выполняется собственно печать документа.

    Перед началом вывода графики нам понадобится определить размеры всей страницы принтера, размеры области на ней, доступной для рисования, и некоторые другие параметры, касающиеся этих размеров. Для этого мы воспользуемся следующими методами класса 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. Результат работы приложения

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг