在 Mac 上检测 PDF 打印

Detecting PDF Printing on Mac

本文关键字:PDF 打印 检测 Mac      更新时间:2023-10-16

我使用 QPrintDialog 初始化一个 QPrinter 对象,如下所示:

QPrinter printer;
QPrintDialog dlg(&printer);
if (dlg.exec() == QDialog::Accepted)
{
   /* Are we printing to PDF? */
}

在 Windows 上,很容易检测输出是发送到文件还是 PDF 编写器。 在 Mac 上,没有相同的功能工作:

if ((printer.outputFormat() == QPrinter::PdfFormat)
 || (!printer.outputFileName().isEmpty()))
{
    qDebug("PDF mode");
}

在线查看qprintdialog_mac.mm的副本,在函数QPrintDialogPrivate::closeCarbonPrintPanel()中,Qt尝试检测输出是否被重定向到文件。 它将文件名存储在QMacPrintEnginePrivate的成员中。 不知何故,该名称永远不会出现在 QPrinter 对象中。 我不确定断开连接在哪里。

所以。。。。。如何判断打印输出是否实际发送到文件? 如果很容易,我愿意在这里获得特定于平台的信息。 不过,我的Mac编程经验为零。

这是

Qt中的一个错误。

在Qt 5.3中,提供的示例代码将起作用,因为第二个条件,即调用QPrinter::outputFileName()

从Qt 5.14开始,QPrinter的outputFileName属性仍然为空,即使在QPrintDialog中选择了"另存为PDF"。

但是,当绘制到QPrinter对象时,正确的事情就完成了。

  • 如果选择了"使用预览打开",则绘制的内容将打开预览版。
  • 如果选择"另存为PDF",将弹出一个文件对话框
  • 如果选择了"在邮件中发送",邮件客户端将打开 PDF附
  • 等。

知何故,QPrinter 似乎以一种不透明的方式存储对话中的所有信息,无法通过公共获取者访问。

支持mac打印对话框中所有选项的正确方法似乎是:

QPrinter printer;
QPrintDialog dlg(&printer);
if (dlg.exec() == QDialog::Accepted)
{
   QPainter painter;
   painter.begin(&printer);
   // do the painting
   painter.end();
}

遗憾的是,如果您想实现自己的打印逻辑,似乎无法从 QPrinter 对象中提取信息。