【问题标题】:cmd.exe to open pdf and print itcmd.exe 打开pdf并打印
【发布时间】:2016-12-27 18:18:20
【问题描述】:

我正在使用 Qt4.8,我想要的是打开一个 pdf 并通过 cmd.exe 自动打印该 pdf,而无需使用 QProcess 在 pdf 阅读器中单击打印按钮:

我有两个不同的代码来完成两个不同的任务: OPNE Pdf

QString scmd= "cmd.exe";
list.push_back("/C");
list.push_back("test.pdf");
Process.start(scmd, list);
Sleep(2000);

在不打开的情况下打印 pdf

QString scmd2 = "C:/Program Files (x86)/Adobe/Reader 11.0/Reader/AcroRd32.exe.exe"
list2.push_back("/t");
list2.push_back("test.pdf");
Process.start(scmd2, list2);
Sleep(2000);

所以我想合并这个命令,我不知道该怎么做?请给我一些建议

【问题讨论】:

  • 有什么理由使用Sleep(2000)吗? merging 命令到底是什么意思?如果你只是让这些命令一个接一个地执行会有什么问题?
  • 没有理由 sleep() 它只是复制粘贴错误忘记删除。合并意味着同时运行,这意味着打开 pdf 文件并打印它。当我一个接一个运行时,这不会执行(两个命令都失败)。
  • 我想使用默认的 PDF 阅读器而不是硬编码的一个 scmd2 变量
  • 当您一个接一个地运行命令时,究竟是什么失败了?您可以使用QDesktopServices::openUrl() 使用其默认应用程序打开文件。但是没有标准的参数来传递打印(如果用户安装了除 acrobat reader 之外的程序)。如果您想要一个用于打印 PDF 文件的便携式解决方案,我认为您需要在程序中实现它而不是执行类似的命令,请参阅Handling PDF files in Qt

标签: c++ qt pdf cmd qprocess


【解决方案1】:

您可以从 Windows 注册表的 HKEY_CLASSES_ROOT 中获取所有信息。

这是一个如何获取打印软件的默认路径以及如何运行它的示例。我在 Qt 5.7 上测试过

#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;
}

【讨论】:

  • 感谢 ramzes2,这实际上按预期工作,不幸的是它不会打开 pdf。你能推荐点什么吗?
  • 您可以类似地从“shell\open\command”子键中获取打开命令。我在答案中添加了示例。
  • 打开文件时出错。错误消息“打开此文档时出错。找不到文件”
  • 当我删除这个“shell\open\command”命令时,一切正常。
  • 尝试使用QDesktopServices::openUrl()打开,建议迈克
猜你喜欢
  • 2016-11-09
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多