如何使用 C++ ShellExecute 命令在特定页面或指定目的地打开 PDF

2024-03-03

我正在尝试打开一个.pdf在特定的指定目的地使用ShellExecute(),但我不知道参数应该如何格式化。我这里使用的参数是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;
}

在评论中,您指出:

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

根据此 Acrobat 文档 https://pdfobject.com/pdf/pdf_open_parameters_acro8.pdf(以及我发现的其他人喜欢的):

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

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

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

AVDocOpenFromFileWithParamString AVDocOpenFromFileWithParamString
AVDocOpenFromASFileWithParamString
AVDocOpenFromPDDocWithParamString

从命令 shell 打开 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文件路径WILL NOT能够生成 Acrobat 使用时所需的上述命令语法/A范围。你传递给什么并不重要lpParameters的参数ShellExecute(),它将被 Acrobat 忽略。

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

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

  • use ShellExecute()启动 Web 浏览器并指定 URL.pdf文件,采用 Acrobat 文档中概述的格式,如下所示:

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

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

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

网址示例

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C++ ShellExecute 命令在特定页面或指定目的地打开 PDF 的相关文章

随机推荐