Шаг 312.
Библиотека PyQt5. Печать документов. Предварительный просмотр документов перед печатью. Экспорт в формат PDF. Класс QPdfWriter

    На этом шаге мы рассмотрим назначение, форматы конструктора, основные методы этого класса и пример использования.

    На 299 шаге уже говорилось о возможности сохранения печатаемого документа в файл формата PDF - для этого достаточно вызвать метод setOutputFileName(), передав ему в качестве параметра путь к файлу и указав у этого файла расширение pdf. Однако при этом задействуется подсистема печати Windows, что приводит к напрасному расходу системных ресурсов.

    Библиотека PyQt5 предоставляет возможность экспорта документов в формат PDF напрямую, без использования подсистемы печати. Для этого используется класс QPdfWriter, объявленный в модуле QtGui. Его иерархия наследования:

  QPaintDevice - (QObject, QPagedPaintDevice) - QPdfWriter

    Формат конструктор этого класса:

  <Объект> = QPdfWriter(<Путь к файлу>)

    В качестве параметра указывается путь к файлу, в который будет экспортирован документ.

    Вывод документа в формат PDF выполняется так же, как и его печать (смотри 300 шаг). Как и QPrinter, класс QPdfWriter поддерживает метод newPage(), подготавливающий следующую страницу документа для вывода.

    Класс QPdfWriter поддерживает также и следующие методы, которые будут нам полезны (полный их список можно найти на странице https://doc.qt.io/qt-5/qpdfwriter.html):

    В качестве практического занятия возьмем код, приведенный на 300 шаге, и немного переделаем его: пусть на первой странице он выводит вместо надписи "QPrinter" строку "QPdfWriter", а в качестве формата бумаги устанавливает А5.

from PyQt5 import QtCore, QtWidgets, QtGui, QtPrintSupport
import sys

app = QtWidgets.QApplication(sys.argv)
writer = QtGui.QPdfWriter("output.pdf")
writer.setCreator("ФИО")
writer.setTitle("Тест")
# Заодно поэкспериментируем с указанием параметров бумаги с помощью
# класса QPageLayout
layout = QtGui.QPageLayout()
layout.setPageSize(QtGui.QPageSize(QtGui.QPageSize.A5))
layout.setOrientation(QtGui.QPageLayout.Portrait)
writer.setPageLayout(layout)
painter = QtGui.QPainter()
painter.begin(writer)
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, writer.height() // 2 - 50, writer.width() - 20,
                 50, QtCore.Qt.AlignCenter | QtCore.Qt.TextDontClip,
                 "QPdfWriter")
layout.setOrientation(QtGui.QPageLayout.Landscape)
writer.setPageLayout(layout)
writer.newPage()
pixmap = QtGui.QPixmap("img.jpg")
pixmap = pixmap.scaled(writer.width(),
                       writer.height(),
                       aspectRatioMode=QtCore.Qt.KeepAspectRatio)
painter.drawPixmap(0, 0, pixmap)
painter.end()
Архив с файлами можно взять здесь.

    Содержимое pdf-файла приведено на рисунке 1.


Рис.1. Результат работы приложения

    У класса QPdfWriter есть недостаток - создаваемые с его помощью PDF-документы имеют очень большой размер. Вероятно, PyQt5 создает документы максимально доступного в формате PDF качества, и понизить его, тем самым уменьшив размер результирующих файлов, мы не можем.

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




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