Linux中的QPrinter分辨率错误

QPrinter resolution is wrong in Linux

本文关键字:错误 分辨率 QPrinter 中的 Linux      更新时间:2023-10-16

我正在尝试让一些图像打印程序在Qt中工作。正在尝试打印到具有ppd的自定义打印机。有基于设备信息的计算,以创建要发送到打印机的图像。

查看打印机属性时,我发现Resolution就是300 dpi x 300 dpi

在windows中,一切都很好,但在Linux中,计算的图像信息变得非常大,使我的文件爆炸。。。通过查看所有数据,我发现在Linux中,physicalDpiXphysicalDpiY(用于代码计算)是1200,而不是300。

所以我把它归咎于QPrinter::PrinterMode

Q打印机::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);

它使这个.resolution()变成了300,但physicalDpiX和Y仍然显示1200。

Q打印机::supportedResolutions()似乎说这个案子没有希望了。。。

如何使我的打印机显示"打印机"属性中显示的分辨率?

唯一的希望是从杯子里提取一些方法吗?我试过了。。。我不知道如何使用我发现的唯一一条信息:cups Resolution

首先,永远不要依赖物理设备分辨率。用户可以使用不同分辨率的打印机,以一种分辨率(300dpi)打印一次,以其他分辨率(600dpi)下次打印,也可以打印到PDF文件,或者打开使用屏幕分辨率的打印预览窗口。其次,只使用ScreenResolution打印到屏幕上,对于任何高分辨率设备来说,这都太粗糙了。字母和图像会很难看,页面上的定位精度也会太低。

打印独立于物理设备的分辨率和操作系统,也可以通过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();

然后以1200dpi的基本QPainter分辨率实现内容绘制(设置x和y坐标、图像的宽度和高度等),渲染过程将注意所有尺寸将自动缩放到目标设备的分辨率。

尽管我很想得到这个问题的通用答案,但目前我解决了用户预期使用的特定驱动程序的问题,同时将默认值(1200)留给其他驱动程序,如pdf或hp打印。。。

我的自定义打印机包含杯子选项,一个看起来像的分辨率选项

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

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