我试图让一些图像打印程序在Qt中工作。 尝试打印到具有ppd的自定义打印机。 根据设备信息进行计算,以创build要发送到打印机的图像。
在查看打印机属性时,我看到Resolution
是300 dpi x 300 dpi
。
在Windows中,一切工作正常 – 但在Linux中,计算的图像信息变得非常大,使我的文件爆炸…透过所有的数据,我发现在Linux中, physicalDpiX
和physicalDpiY
(用于代码计算)是1200而不是300。
所以我把它归咎于QPrinter :: PrinterMode
QPrinter :: HighResolution 2在Windows上,将打印机分辨率设置为为正在使用的打印机定义的打印机分辨率。 对于PostScript打印,将PostScript驱动程序的分辨率设置为1200 dpi。
我改变了我的构造函数来照顾它 – 以防万一默认值是错误的…这是行不通的:
Printer::Printer(const QPrinterInfo& printerInfo, MainWindow* pWnd) : #if defined(Q_OS_WIN32) || defined (Q_MAC_OSX) QPrinter(QPrinter::HighResolution) #else QPrinter(QPrinter::ScreenResolution) #endif { qDebug()<<"printer resolution physicalDpiX="<< this->physicalDpiX()<<", physicalDpiY="<<this->physicalDpiY(); // prints 1200 for each in Linux, 300 in windows qDebug()<<"printer resolution="<< this->resolution(); // prints 96 in Linux, 300 in windows // printer properties (like from system-config-printer) show 300 // printerInfo.printerName() and printerInfo.defaultPrinter().printerName() show my printer }
这些数字在Linux中的分辨率是错误的,但在Windows中是正确的
试着
这 – > setResolution(300);
它使这个.resolution()成为300,但physicalDpiX和Y仍然显示1200。
QPrinter :: supportedResolutions()似乎说这种情况是绝望的…
如何让我的打印机看到打印机属性中显示的分辨率?
从杯子里抽出一些方法是唯一的希望吗? 我试过…我不明白如何使用我发现的唯一信息: 杯决议
首先,不要依靠物理设备的分辨率。 用户可以使用不同分辨率的打印机,使用一个分辨率(300dpi)打印一次,下次使用其他分辨率(600dpi)打印,或打印到PDF文件,或打开使用屏幕分辨率的打印预览窗口。 其次,使用屏幕分辨率仅用于打印到屏幕上,对于任何高分辨率的设备来说,它太粗糙了。 字母和图片会很丑,页面上的定位精度会太低。
QPainter缩放可以实现独立于物理设备分辨率和操作系统的打印。 据我所知,QPainter基本分辨率是1200dpi。 这意味着这是Qt可以打印的最好的有效分辨率。 下一个示例演示如何在绘制页面上的任何内容之前设置缩放比例。
QPrinter printer(QPrinter::HighResolution); qreal resolutionFactor = 1200 / printer->resolution(); QPainter painter; painter.begin(&printer); painter.scale(1 / resolutionFactor, 1 / resolutionFactor); printPage(&painter); // This method should implement printing itself painter.end();
然后执行内容绘图(设置x和y坐标,图像的宽度和高度等),以便基本QPainter分辨率为1200dpi,并且渲染过程中将自动缩放到目标设备的分辨率。
就像我想这个问题的一个通用的答案,现在我解决了我的问题,用户期望使用的具体驱动程序,而保留其他的默认值(1200),如PDF或HP打印…
我的自定义打印机包含杯子之间的选项,类似的解决方案选项
name="printer-resolution" value="300x300dpi"
我可以从中提取分辨率。 如果该特定的杯子选项不存在,那么我可以使用默认的1200。