【问题标题】:How to Open PDF at specific page or named destination using C++ ShellExecute Command如何使用 C++ ShellExecute 命令在特定页面或命名目的地打开 PDF
【发布时间】:2022-07-06 00:38:26
【问题描述】:

我正在尝试使用ShellExecute() 在特定命名目的地打开.pdf,但我不知道应该如何格式化参数。我在这里使用的参数是pagew

以前有人试过吗?我找到了几个答案,但它们没有我需要的帮助。

PS:只打开.pdf 工作正常。

int main()
{
    std::string url = "\"C:/Users/asura/Downloads/asuras.pdf\"";
    std::wstring stemp = std::wstring(url.begin(), url.end());
    LPCWSTR sw = stemp.c_str();

    std::string action = "open";
    std::wstring atemp = std::wstring(action.begin(), action.end());
    LPCWSTR actiont = atemp.c_str();
    //1 INTRODUCTION

    string strPageDestination = "/A \"page=52\" \"pdf\"";
    std::wstring pagetemp = std::wstring(strPageDestination.begin(), strPageDestination.end());
    LPCWSTR pagew = pagetemp.c_str();
    //The line below works fine, it opens pdf with default pdf opener at first page.
    //ShellExecute(NULL, actiont, sw, NULL, NULL, SW_SHOWNORMAL);

    //The line below attempting to open file at specific page number doesn't work
    ShellExecute(NULL, actiont, sw, pagew, NULL, SW_SHOWNORMAL);
    return 0;
}

【问题讨论】:

  • 使用std::wstring(str.begin(), str.end()) 不是将std::string 转换为std::wstring 的正确方法。您需要对数据进行转换,例如使用MultiByteToWideChar()std::wstring_convert 等。或者,只需以宽字符串文字开头,例如:std::wstring url = "\"...asuras.pdf\""; std::wstring action = L"open"; std::wstring strPageDestination = L"/A \"page=52\" \"pdf\"";
  • 在任何情况下,您可以指定的输入参数完全取决于您使用的特定 PDF 查看器,而您没有指定。没有每个 PDF 查看器统一实现的通用参数集。
  • 因此,如果我从 std::wstring 开始,在特定页面或命名目的地打开 pdf 的正确格式参数是什么。 ** std::wstring pagetemp = "/A \"page=52\" \"pdf\"; LPCWSTR pagew = pagetemp.c_str(); **
  • @RemyLebeau 所以我使用 Adob​​e Acrobat Reader DC 作为默认查看器。 Acrobat 阅读器的输入参数是什么,Chrome 的参数会起作用。如果有人有这个想法,将不胜感激。
  • Acrobat 有一个 COM 组件,但我不推荐它,至少其他选项会更容易满足您的目的

标签: c++ pdf bookmarks shellexecute page-numbering


【解决方案1】:

在 cmets 中,您声明:

我使用 Adob​​e Acrobat Reader DC 作为默认查看器。

根据this Acrobat documentation(以及我发现的其他类似内容):

您可以使用一个命令或 URL 打开 PDF 文档,该命令或 URL 指定要显示的内容(命名的目标或特定页面)以及如何显示它(使用特定视图、滚动条、书签、注释或突出显示)。

大多数浏览器都支持 URL 的参数,可以在以编程方式打开 PDF 文档时使用。

其中许多参数可以传递给以下核心 API 函数(有关详细信息,请参阅 Acrobat 和 PDF 库 API 参考):

AVDocOpenFromFileWithParamString
AVDocOpenFromASFileWithParamString
AVDocOpenFromPDDocWithParamString

从命令外壳打开 PDF 文档时,您可以使用 /A 开关将参数传递给打开命令,语法如下

<Acrobat path> /A "<parameter>=<value>" "<PDF path>"

例如:

Acrobat.exe /A "zoom=1000" "C:\example.pdf"

在 Mac OS 中,您可以在打开带有 Apple 事件的 PDF 文档时使用这些参数。

我安装了 Adob​​e Acrobat Reader DC,通过查看它在 Windows 注册表中的注册方式,使用 ShellExecute("open").pdf 文件路径不会能够生成Acrobat 在使用 /A 参数时需要的上述命令语法。无论您向ShellExecute()lpParameters 参数传递什么,它都会被Acrobat 忽略。

所以,在我看来,你有两个选择:

  • 使用CreateProcess() 直接运行Acrobat .exe 程序,指定您需要的完整命令行。

  • 使用ShellExecute() 启动Web 浏览器,指定.pdf 文件的URL,格式在Acrobat 文档中列出,如下所示:

您可以在单个 URL 中指定多个参数。使用与号 (&) 或井号 (#) 字符分隔每个参数。操作在 URL 中出现时从左到右进行处理和执行。

因为所有指定的动作都会被执行,后面的动作有可能会覆盖之前动作的效果,所以使用正确的顺序很重要。例如,页面动作应该出现在缩放动作之前。

命令不区分大小写,但指定目标的值除外。 URL 中不能有空格。

网址示例

...
http://example.org/doc.pdf#page=3
...

我没有尝试使用 URL,但这种方法可能需要您运行本地 HTTP 服务器,或者至少使用 file: url,以便通过 URL 打开本地 .pdf 文件。

【讨论】:

    【解决方案2】:

    在 Windows 上,您将在命令级别运行

    应用程序/pdf 处理程序在我的情况下是 Windows Own

    \"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe\" 
    

    带有不带引号的 URL 参数,包括片段(空格需要用 %20 替换,如果它们被常规命令调用使用,Windows 可以反转 \)

    file:///C:/Users/asura/Downloads/asuras.pdf#page=52

    直接调用 Acrobat 时,将 /Action 放在文件名之前,语法可能会更加繁琐

    "C:\SandBox\apps\PDF\Adobe\Reader\AcroRd32.exe" /A page=52 "C:\Users\asura\Downloads\asuras.pdf"
    

    命名的目的地可能非常多变,它们需要准确构建(避免使用连字符或空格)并针对查看者,因此 Adob​​e 自己的文档是衡量标准测试的一个很好的指标。

    这里将 edge 中的第三个书签简单地称为 #Parameters 或将第二个书签称为 #Contents

    file:///C:/Users/WDAGUtilityAccount/Desktop/SandBox/pdf_open_parameters_acro8.pdf#Parameters
    

    或使用 nameddest 但它的 flakey。页面是可靠的。

    file:///C:/Users/WDAGUtilityAccount/Desktop/SandBox/pdf_open_parameters_acro8.pdf#nameddest=Contents
    

    【讨论】:

    • @K J 这个命令是否也适用于命名的目的地(nameddest 参数)?我的意思是在 Microsoft Edge 上打开时?我的不工作....
    • 我发现它正在为某人工作,不确定但看起来像它。 i.stack.imgur.com/xpQ7o.gif 所以,我想知道它是否真的如此。 nameddest 在 chrome 浏览器上工作。所以,为什么它不能在 Edge 上运行,这让我很生气。
    • 找到了我在更新浏览器时可能遇到问题的原因。 helpx.adobe.com/acrobat/kb/…
    【解决方案3】:

    "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader/AcroRd32.exe" /A "nameddest=OneNamedDest" "C:\Users\asur\Downloads\Test.pdf" Named destination and Bookmarks are totally different for Acrobat. 上述解决方案或任何打开的操作适用于命名目的地而不是书签。

    【讨论】:

      猜你喜欢
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多