【问题标题】:QPrinter resolution is wrong in LinuxLinux 中 QPrinter 分辨率错误
【发布时间】:2014-12-06 02:44:06
【问题描述】:

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

查看打印机属性时,我看到Resolution300 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,但物理 DpiX 和 Y 仍显示为 1200。

QPrinter::supportedResolutions ()好像说这个案子没救了……

如何让我的打印机看到打印机属性中显示的分辨率?

从杯子中提取一些方法的唯一希望是什么?我试过了......我不明白如何使用我找到的唯一一条信息:cups Resolution

【问题讨论】:

    标签: c++ linux qt printing resolution


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      首先,永远不要依赖物理设备分辨率。用户可以使用不同分辨率的打印机,以一种分辨率(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 坐标、图像的宽度和高度等),并且渲染过程将注意所有尺寸将自动缩放到目标设备的分辨率。

      【讨论】:

      • 你说的很漂亮 - 不幸的是它只适用于 Windows。打印到多个设备,每个设备都有自己的分辨率,要求系统必须能够识别分辨率。 Qt 打印无法识别用户/设备分辨率的事实导致了像我这样的问题:虽然打印机只支持 300(超大型打印机,适用于巨型图像),但系统将尝试处理 16 倍大的东西,导致作业超出可用内存(甚至某些系统上的磁盘空间)。
      • 但是...您的代码 sn-p 也依赖于设备分辨率...不幸的是它不起作用,因为“printer->resolution()”也是错误的
      • QPrinter::resolution() 值由驱动程序设置,如果 Linux 驱动程序总是返回 1200,我猜它会将内容额外缩放到物理分辨率。我只是尝试在 Windows 和 Linux(OpenSUSE、三星激光打印机)上从 Qt 代码打印一些东西,并且在这两种情况下我在纸上都得到了相同大小的输出。即使我以 600dpi 打印,分辨率()在 Linux 上确实返回 1200,但正如我所说,我在纸上得到了正确的输出。
      • 您得到了正确的输出 - 但发送到打印机的图像比应有的大。对于非常大的图像,这是一个重要因素。这就是为什么在普通打印机上使用 A4 打印时,我会保留默认的 1200。这是可以接受的尺寸。但是乘以 16,你的打印机就会放弃。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      相关资源
      最近更新 更多