Ghostscript api请求“按<return>继续”</return>

时间:2014-09-12 11:03:25

标签: c++ qt api pdf ghostscript

我正在使用GhostScript API测试PDF是否受用户密码保护(如果您有密码,则只能打开文档,与保护内容免受未经授权的复制或打印的所有者保护不同)

我在Qt中使用此代码:

const bool PDFTools::isUserProtected(const QString &iFilePath)
{
  void *minst;

  const QString filePath = iFilePath.toUtf8();
  const std::string inputFile = QString( "%1" ).arg(filePath).toStdString();

  int initiationCode = 0;
  int executionCode = 0;

  // GhostScript arguments
  const int gsArgumentCount = 2;
  char * gsArgumentValues[gsArgumentCount];
  gsArgumentValues[0] = "-dNODISPLAY";
  gsArgumentValues[1] = const_cast<char*>( inputFile.c_str() );

  initiationCode = gsapi_new_instance(&minst, NULL);
  if(initiationCode < 0)
    return true;

  initiationCode = gsapi_set_arg_encoding(minst, GS_ARG_ENCODING_UTF8);
  if (initiationCode < 0)
  {
    gsapi_delete_instance(minst);
    return true;
  }

  executionCode = gsapi_init_with_args(minst, gsArgumentCount, gsArgumentValues);
  if(executionCode < 0)
  {
    gsapi_exit(minst);
    gsapi_delete_instance(minst);
    return true;
  }

  gsapi_exit(minst);
  gsapi_delete_instance(minst);
  return false;
}

当文档受到保护时,它返回true,因为没有密码就无法打开,Ghostscript会返回执行错误,这没关系。

问题是当文档没有受到保护时,它会打开第一页并一直等待按下返回键,以便它可以传递到下一页。

>>showpage, press <return> to continue<<

您可以将“-dNOPAUSE”和“-dBATCH”添加到gsArgumentValues,但这会导致另一个问题。如果我的页面数量非常大,那么只需要通过所有页面就会花费很多时间,否则它将返回false。

当Ghostscript提示返回时,任何人都知道如何退出进程?在那个阶段,我已经知道PDF没有受到保护,我可以退出并返回false。

我已尝试使用回调函数,但没有成功。

提前致谢。

1 个答案:

答案 0 :(得分:3)

尝试使用-dFirstPage = 1 -dLastPage = 1和-dNOPAUSE -dBATCH。然后它只处理第一页。

否则,您必须截取任何按键并中断该过程,或修改设备以在第一页之后抛出错误。

注意虽然您可以将这些开关与PDF之外的其他类型的输入一起使用,但它们仍然必须处理整个输入文件,因为与PDF不同,没有简单的方法可以找到n&#39 ; PostScript或PCL文件中的页面。