在PyQt5中打印pdf文档

拉尔夫

我想将pdf文档打印到打印机。到目前为止,我已经有了这段代码。

def printDialog(self):
        filePath, filter = QFileDialog.getOpenFileName(self, 'Open file', '', 'Text (*.txt);;PDF (*.pdf)')
        if not filePath:
          return
        file_extension = os.path.splitext(filePath)[1]
        if file_extension == ".txt":
            doc = QtGui.QTextDocument()
            try:
                with open(filePath, 'r') as txtFile:
                    doc.setPlainText(txtFile.read())
                printer = QPrinter(QPrinter.HighResolution)
                if not QPrintDialog(printer, self).exec_():
                    return
                doc.print_(printer)
            except Exception as e:
                print('Error trying to print: {}'.format(e))
        elif file_extension == ".pdf":
            printer = QPrintDialog(QPrinter.HighResolution)
            printer.setOutputFormat(QPrinter.PdfFormat)
            printer.setOutputFileName(filePath)
            # TODO
        else:
            pass

我不知道如何在本TODO节中继续

斯蒂芬·巴德

一种可能性是使用pdf2image

封装了pdftoppm和pdftocairo的python(3.5+)模块,可将PDF转换为PIL Image对象

参见https://pypi.org/project/pdf2image/

在上面的链接下,您将找到poppler的安装说明,这是模块的依赖性。

脚步

  • 读取PDF文件
  • 借助pdf2image将其转换为图像
  • 使用QPaint绘制每个图像

该代码的简单版本如下所示:

images = convert_from_path(filePath, dpi=300, output_folder=path)
painter = QPainter()
painter.begin(printer)
for i, image in enumerate(images):
    if i > 0:
        printer.newPage()
    rect = painter.viewport()
    qtImage = ImageQt(image)
    qtImageScaled = qtImage.scaled(rect.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
    painter.drawImage(rect, qtImageScaled)
painter.end()

convert_from_path的第二个参数描述了以dpi为单位的输出分辨率。可以通过在QPainter实例上调用视口来确定设备坐标系中的目标矩形。最后,然后可以使用双线性过滤器算法将图像平滑缩放到目标矩形。

独立的样本程序

我已经稍微修改了您的代码,并创建了一个完全独立的示例。

不处理诸如纸张大小,分辨率,有关内存需求和错误处理的优化等主题。目的是给出一个最小的例子。

import os
import sys

from PIL.ImageQt import ImageQt
from PyQt5 import QtWidgets
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtGui import QPainter
from PyQt5.QtPrintSupport import QPrintDialog, QPrinter
from PyQt5.QtWidgets import QMainWindow, QFileDialog, QPushButton
import tempfile

from pdf2image import convert_from_path


class PrintDemo(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(192, 128))
        self.setWindowTitle("Print Demo")

        printButton = QPushButton('Print', self)
        printButton.clicked.connect(self.onPrint)
        printButton.resize(128, 32)
        printButton.move(32, 48)

    def onPrint(self):
        self.printDialog()

    def printDialog(self):
        filePath, filter = QFileDialog.getOpenFileName(self, 'Open file', '', 'PDF (*.pdf)')
        if not filePath:
            return
        file_extension = os.path.splitext(filePath)[1]

        if file_extension == ".pdf":
            printer = QPrinter(QPrinter.HighResolution)
            dialog = QPrintDialog(printer, self)
            if dialog.exec_() == QPrintDialog.Accepted:
                with tempfile.TemporaryDirectory() as path:
                    images = convert_from_path(filePath, dpi=300, output_folder=path)
                    painter = QPainter()
                    painter.begin(printer)
                    for i, image in enumerate(images):
                        if i > 0:
                            printer.newPage()
                        rect = painter.viewport()
                        qtImage = ImageQt(image)
                        qtImageScaled = qtImage.scaled(rect.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
                        painter.drawImage(rect, qtImageScaled)
                    painter.end()
        else:
            pass


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = PrintDemo()
    mainWin.show()
    sys.exit(app.exec_())

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在PyQt5中“打印预览”由QTextDocument创建的文档?

来自分类Dev

从pyqt5的主页打印

来自分类Dev

在函数内部时如何在pyqt5中“打印”?

来自分类Dev

Pyqt5 中的 QThreads:这是官方 QThread 文档的正确 C++ 到 Python 翻译吗?

来自分类Dev

使用PyQt5在文本框中打印输出语句

来自分类Dev

PyQt5:如何打印没有模块名称的 QUrl

来自分类Dev

利用PyQt5中的QtQuick控件

来自分类Dev

在PyQt5中未触发dropEvent

来自分类Dev

更新PYQT5中的图表数据

来自分类Dev

在PyQt5中串联多个QSplitter

来自分类Dev

PyQt5中的顺序编程复制

来自分类Dev

在PyQt5中实现画布

来自分类Dev

在Windows 7中安装PyQt5

来自分类Dev

QTableWidget中的PyQt5 QComboBox

来自分类Dev

PyQt5中的哪个Gstreamer?

来自分类Dev

PyQt5 中的问号按钮

来自分类Dev

PyQt5 中的访问冲突错误

来自分类Dev

PyQt5 中的 QWebEngineView 和 QWidget

来自分类Dev

PyQT5 中的 GridLayout 和 VerticalLayout

来自分类Dev

QQuickImageProvider PyQt5

来自分类Dev

PyQT5 开发

来自分类Dev

如何从PyQt5中的QMessageBox中删除图标?

来自分类Dev

PyQt5:一个信号而不是根据文档的两个

来自分类Dev

QListWidget项上方的PyQt5光标如何弹出WhatsThis文档?

来自分类Dev

PyQt5:一个信号而不是根据文档的两个

来自分类Dev

PyQt5中的connect()方法在哪里?

来自分类Dev

如何对pyqt5中的按钮单击做出反应

来自分类Dev

如何在PyQt5中发出dataChanged

来自分类Dev

ImportError:无法在PyQt5中导入名称'QStringList'