QPrinter在Linux下分辨率错误

4
我正在尝试在Qt中运行一些图像打印程序。尝试打印到一台已有ppd文件的自定义打印机上。基于设备信息进行计算,以创建要发送到打印机的图像。
查看打印机属性时,我发现分辨率300 dpi x 300 dpi
在Windows中,一切正常 - 但在Linux中,计算出的图像信息变得非常大,导致我的文件爆炸...浏览所有数据后,我发现在Linux中,physicalDpiXphysicalDpiY(用于代码计算)是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中是正确的。
尝试使用 this->setResolution(300) 后,this.resolution() 变为了 300,但 physicalDpiX 和 Y 仍显示为 1200。 QPrinter::supportedResolutions () 似乎表明情况无望...
如何使我的打印机看到打印机属性中显示的分辨率?
难道唯一的希望是从 cups 中提取一些方法吗?我尝试了...我不知道如何使用我找到的唯一一条信息:cups Resolution
2个回答

3
首先,不要依赖物理设备分辨率。用户可能使用具有不同分辨率的打印机,一次使用一个分辨率(300dpi),下一次使用其他分辨率(600dpi),或者可能打印到PDF文件,或打开使用屏幕分辨率的打印预览窗口。其次,仅将ScreenResolution用于在屏幕上打印,对于任何高分辨率设备来说,这都太粗糙了。字母和图像会很丑陋,并且页面上的定位精度太低。
可以通过QPainter缩放实现与物理设备分辨率和操作系统无关的打印。据我所知,QPainter基本分辨率为1200dpi。这意味着Qt可以打印的最细有效分辨率为1200dpi。下面的示例演示了如何在绘制页面内容之前设置缩放。
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,渲染过程将自动调整所有尺寸以适应目标设备的分辨率。


你所说的很美好,但不幸的是它只在Windows系统中有效。要将内容打印到多个具有不同分辨率的设备上,需要系统能够识别这些分辨率。由于Qt打印无法识别用户/设备的分辨率,因此会出现像我这样的问题:虽然打印机仅支持300(非常大型的打印机,可用于处理巨大的图像),但系统将尝试处理16倍以上的内容,导致作业超出可用内存(甚至在某些系统上超出磁盘空间)。 - Thalia
但是...你的代码片段也依赖于设备分辨率...很遗憾它不起作用,因为"printer->resolution()"也是错误的。 - Thalia
QPrinter::resolution()的值由驱动程序设置,如果Linux驱动程序始终返回1200,则我猜它将额外缩放内容以匹配物理分辨率。我刚刚尝试从Qt代码在Windows和Linux(OpenSUSE,三星激光打印机)上打印了一些东西,两种情况下输出在纸张上的大小相同。虽然resolution()在Linux上即使我打印600dpi也会返回1200,但像我说的那样,我得到了正确的输出结果。 - user645859
您的输出结果是正确的,但是发送到打印机的图像比应该的要大。对于非常大的图片来说,这是一个重要的因素。那就是为什么在普通打印机上使用A4打印时,我会将默认值设为1200。这是可接受的尺寸。但如果将其乘以16,您的打印机将无法承受。 - Thalia

0

虽然我很想给这个问题一个通用的答案,但现在我解决了用户预期使用的特定驱动程序的问题,同时将其他驱动程序(如pdf或hp打印机)的默认值保留为1200...

我的自定义打印机包含一些cups选项,其中包括一个分辨率选项,看起来像是:

name="printer-resolution" value="300x300dpi"

我可以从中提取分辨率。如果该特定的 cups 选项不存在,则我可以使用默认的 1200。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接