我想将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的安装说明,这是模块的依赖性。
脚步
该代码的简单版本如下所示:
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] 删除。
我来说两句