如何强制在 Acrobat 中打开 PDF 而不是在 Edge 或 Chrome 中的浏览器中打开?

How can you force a PDF to open in Acrobat instead of the browser in Edge or Chrome?

我们有一个 SharePoint 2013 站点,其中包含一个包含各种文档、电子表格或其他文件的列表。从应用程序的其他部分,我们 link 到这些附件,并希望它们通过使用一些 javascript 和 SharePoint js 函数 editDocumentWithProgID2.

直接在适当的应用程序中打开

示例:

var docUrl = $.getUrlVar('docURL');
var fileExtension = docUrl.substr(docUrl.lastIndexOf('.') + 1);

var extensionAppLocal = {
    "doc": "ms-word",
    "docm": "ms-word",
    "docx": "ms-word",
    "mpt": "ms-project",
    "xlsx": "ms-excel",
    "pptx": "ms-powerpoint",
    "one": "onenote|UsePlain",
    "vstx": "ms-visio"
};
var openApp = "";
if (extensionAppLocal[fileExtension]) {
    openApp = extensionAppLocal[fileExtension];
}

if (docUrl.indexOf(".pdf") > 0) {
    editDocumentWithProgID2(docUrl, '', 'AdobeAcrobat.OpenDocuments', '0', $.getUrlVar('siteURL'), '0', openApp);
}
else {
    editDocumentWithProgID2(docUrl, '', 'SharePoint.OpenDocuments', '0', $.getUrlVar('siteURL'), '0', openApp);
}

这仅适用于 IE 11,不适用于 Edge 或 Chrome。是否有另一种方法可以为锚标记构建 URL 或使用 Javascript 强制文件在主机系统默认应用程序中打开而不是下载或在浏览器中预览?

方法是在所有PC上设置“文件扩展名默认应用程序”。在 Windows 上,您可以打开“设置”,然后是 select“应用程序”,然后是“默认应用程序”(不确定如何在其他操作系统上执行此操作)。我相信一定有一种方法可以通过脚本执行此操作(几乎肯定涉及更改 Windows 上的注册表设置)。那么您的组织需要将脚本安排到所有 PC 上的 运行。

我们最终与微软开了工单,他们的工程师给了我们答案:

允许 PDF 文件直接从浏览器和 Microsoft Office 加载项在 Adob​​e Acrobat(或其他默认客户端应用程序)中本地打开的传统体验依赖于作为一部分安装到客户端计算机的 ActiveX 控件办公室。 Internet Explorer 是唯一 allows/supports 使用 ActiveX 控件的浏览器,因此此功能在 IE 之外不可用。

当您在网页上单击 hyperlink 时,浏览器和操作系统共同确定如何打开目标资源。当 link 目标的协议方案是 http、https 或其他已知的 Web 协议时,OS 和浏览器知道使用浏览器打开请求的资源。对于 Word 和 Excel 文档,现代版本的 Office 提供了额外的协议处理程序(例如 ms-word: 和 ms-excel:),以便于在本地客户端中打开文件。 SharePoint 2013 及更高版本将使用这些协议将 link 呈现为 Office 文档。单击 SharePoint 页面中的其中一个 link 将告知 OS 使用相应的 Office 应用程序从目标位置打开文件。如果在安装了 Office 的计算机上协议方案是 ms-word 或 ms-excel,您会在任何其他非 SharePoint HTML 页面中看到相同的行为。

Adobe 没有为带有 Acrobat 的 PDF 文件提供类似的协议处理程序,因此没有现成的方法可以直接从 SharePoint 页面(或 Office 加载项)在 Acrobat 客户端中直接打开文件使用现代浏览器。相反,您的开发人员可以创建自定义协议处理程序并将 link 呈现为 PDF 文件,以便它们在首选应用程序中打开。在高层次上,它需要以下...

  1. 编写一个协议处理程序可以: a) 接收文件的位置作为参数 b) 为客户端应用程序找到本地安装的可执行文件(即 Acrobat Reader) c) 发出启动客户端应用程序的命令并提供指定要打开的文件的参数(即 SharePoint 中的文件 URL)

  2. 为需要此类交互的每个用户在客户端计算机上注册协议处理程序。 o 可以更新加载项的安装程序以在第一个 运行 期间检查协议处理程序,并在需要时注册处理程序。这可以消除单独 install/register 协议处理程序的需要。

  3. 更新加载项代码以检测 PDF 文件并编写 hyperlinks 以使用协议处理程序方案而不是 http/s。

  4. 如果您想在 SharePoint UI 中也有此行为,您可以使用 JavaScript 将 link 检测到 PDF 文件并重写 HREF使用您的协议处理程序方案而不是 http/s 的值。该脚本可以从母版页中引用或直接包含在母版页中。对于 SharePoint Online,此更改可以作为字段定制器或列表视图定制器扩展来实现(如果需要,可以将其限制为文档库列表类型)。

概览

https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa767916(v=vs.85)#creating-an-asynchronous-pluggable-protocol-handler

例子

https://support.shotgunsoftware.com/hc/en-us/articles/219031308-Launching-Applications-Using-Custom-Browser-Protocols