0

目前,我正忙于开发一个将 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, image)

它使图像的边距为 100,但不缩放。如何以适合文档的方式缩放图像?我特别在寻找一种可以查看打印机默认文档大小的解决方案。

4

2 回答 2

0

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

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

于 2013-04-24T13:15:57.650 回答
0

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

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.
于 2013-05-21T19:12:26.407 回答