【问题标题】:Printing a PDF file from Qt从 Qt 打印 PDF 文件
【发布时间】:2017-10-02 05:01:33
【问题描述】:

我发现以下代码 sn-p 符合我的预期,但问题是,当 PDF 文件打开并且用户使用其他打印机从 PDF 阅读器打印 PDF 文件而不关闭 PDF 阅读器和再次从我的应用程序打印 PDF 文件,它将使用在 PDF 阅读器上配置的打印机而不是我设置为打印 PDF 文件的打印机打印。

例子:

  1. 在应用程序中,我将 Printer_1 设置为打印 PDF 文件。
  2. 打印文件(它将在 PDF 阅读器中打开文件并使用 Printer_1 打印机打印)。
  3. 在 PDF 阅读器上,我转到 CTRL + P 进行打印,然后选择 Printer_2 并单击打印。
  4. 我没有关闭 PDF 阅读器,然后再次在应用程序上(打印机选择到 Printer_1),我打印了 PDF 文件。现在打印命令被发送到 Printer_2 而不是 Printer_1。

请问下面的代码sn-p有什么问题?

#include <QSettings>
#include <QProcess>
#include <QDebug>

int main(int argc, char *argv[])
{
    const QString classesRoot = "HKEY_CLASSES_ROOT";

    // get ID of .pdf extension
    QSettings pdfSettings(classesRoot + "\\.pdf", QSettings::NativeFormat);
    QString pdfId = pdfSettings.value("Default").toString();

    // get path to default program that associated with PDF files
    QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\print\\command", QSettings::NativeFormat).value("Default").toString();
    QString openPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\open\\command", QSettings::NativeFormat).value("Default").toString();
    qDebug() << "print path" << printPath;
    qDebug() << "open path" << openPath;

    // open .pdf file
    QProcess::startDetached(openPath.arg("full path to pdf file.pdf") );

    // print .pdf file
    QProcess printProcess;
    printProcess.start(printPath.arg("full path to pdf file.pdf") );
    printProcess.waitForFinished(-1);

    return 0;
}

【问题讨论】:

    标签: c++ qt pdf printing qsettings


    【解决方案1】:

    代替线

    QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\print\\command", QSettings::NativeFormat).value("Default").toString();
    

    使用它,一切都按预期工作:

    QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\printto\\command", QSettings::NativeFormat).value("Default").toString();
    

    并传递“文件名”、“打印机名称”、“打印机驱动程序”和“端口”[驱动程序名称和端口不是必须的]

    【讨论】:

      【解决方案2】:

      我很抱歉,但我说过这似乎是合理的预期行为:如果应用程序已经打开并且它被设计为不为同一个文件打开单独的实例(就像许多查看者和你的一样),那么很有可能当前设置(在您的情况下为当前打印机)也被保留,因为基本上没有任何改变。如果您重现您的步骤,但通过您自己手动打开 PDF 文件来替换您的程序,我相信您会看到相同的结果。

      一种选择是避免打开外部查看器并直接加载 PDF 文件(当前使用第三方库,例如 Poppler)并使用 Qt 的模块进行打印。您可以查看this answer了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-07
        • 2014-12-21
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多