使用PySide / Qt打印完整文档

时间:2013-04-24 12:19:52

标签: python qt printing pyside

目前,我正忙于开发一个将PDF转换为PNG并使用PNG图像将其打印到打印机的应用程序。

问题在于我可以打印出一张图片,但是我并不了解如何以一种在纸张上始终全尺寸的方式来调整图像大小。 Offcourse我想设置一些边距,但图像必须以完全适合的方式重新调整大小。

问题在于我真的不知道如何做到这一点,因为文档非常有限。

这是我目前打印图片的代码:

#set up printer
printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)
printer.setPrinterName('Adobe PDF') #I print to my Adobe PDF software printer
#set up image
image = QtGui.QImage(pngFiles[0])
#paint & print
painter = QtGui.QPainter()
painter.begin(printer)
painter.drawImage(100,100, image)
painter.end()

我认为解决方案就在这一行:     painter.drawImage(100,100,图片)

它从侧面给图像边距为100,但不会缩放。如何以适合文档的方式缩放图像?我特别希望找到一种能够满足打印机默认文档大小的解决方案。

2 个答案:

答案 0 :(得分:0)

您可以使用QPrinter::paperSize获取文档的大小。

要在绘制图像时调整图像大小,请使用带有QRectF而不是QPoint的QPainter::drawImage的重载版本。然后缩放图像以适合目的地QRectF。

答案 1 :(得分:0)

根据与Sashoalm的对话,我可以调整图像大小,并将其很好地贴合在纸张上进行打印。我已经删除了我的expirmental代码,它应该像这样工作。

from PIL import Image
imagefile = 'image.png'

def scale(w, h, x, y, maximum=True):
    nw = y * w / h
    nh = x * h / w
    if maximum ^ (nw >= x):
        return nw or 1, y
    return x, nh or 1

#set up print printer.
printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)
#dlg = QtGui.QPrintDialog(printer, self)
printer.setPrinterName('Adobe PDF')

#check image size with PIL:  
image = Image.open(imagefile)
imageWidth, imageHeight = image.size

paperPixels = printer.pageRect(QtGui.QPrinter.DevicePixel)
paperPixels = paperPixels.getRect() #get tuple of the "pixels on the paper"
paperWidth = paperPixels[2]
paperHeight = paperPixels[3]

#set margins for paper
paperMargin = 100
#find out the image size
paperWidth = paperWidth - (paperMargin*2) #times two, for left and right.. 
paperHeight = paperHeight - (paperMargin*2)

#scale image within a rectangle.
paintWidth, paintHeight = scale(imageWidth, imageHeight, paperWidth, paperHeight, True)            
#construct the paint dimensions area
paintRect = QtCore.QRectF(paperMargin, paperMargin, paintWidth, paintHeight)

#start painting
image = QtGui.QImage(imagefile)
painter = QtGui.QPainter()
painter.begin(printer)
painter.drawImage(paintRect, image)
painter.end()
#now the page gets printed out and the image should fit the paper.