首页 > 解决方案 > 尝试打开指向 API 返回的 PDF 的超链接时,MS Word 显示“无法打开指定的文件”错误

问题描述

我们在 Web API 操作中有以下片段,而不是处理 PDF 请求。该操作会在浏览器中正确呈现 PDF。

一切正常,除了我们今天遇到的一个问题。

如果用户将网站上的 PDF 链接复制到 Word 中,Word 不会打开该文件并显示“无法打开指定的文件”错误

HttpResponseMessage result = new HttpResponseMessage();
Stream stream = new MemoryStream(bytes);
result.Content = new StreamContent(stream);

result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
result.StatusCode = HttpStatusCode.OK;
return result;

PDF 在浏览器(IE/Edge/FF/Chrome - 移动或桌面)中打开没有问题。Word 版本似乎不是问题 - 通过 Office 365 ProPlus 尝试了 2010。

编辑:我认为它与上述代码有关的原因是,来自同一网站的实际 PDF 文件可以从 Word 链接,而 Word 只会显示“不安全内容”警告,但仍允许您打开它,这与来自的 PDF 不同API。

编辑:

标签: c#asp.net-web-apiasp.net-web-api2pdf-generation

解决方案


您可能能够以某种方式更改 PDF 的呈现以更好地使用 Word,但我相信问题可能源于ForceShellExecute控制 Office 如何处理超链接的注册表项。当密钥设置为 0(或不存在)时,Office 应用程序使用内部 Office 进程来启动超链接。当设置为 1 时,Office 将使用 Windows 进程(与用户通过开始 | 运行 | 粘贴链接 | 回车打开链接基本相同)。如果ForceShellExecute注册表项设置为 0 或不存在,这可能是 Word 不希望处理 API 呈现的 PDF 的原因。

要测试这是否是根本原因,请使用以下步骤查找/更改值或创建注册表项(这些步骤来自在 Office 中选择超链接时出现错误消息:“无法找到 Internet 服务器或代理服务器”

重要的提示

所有版本的 Office 都要求该项ForceShellExecute位于9.0注册表子项下。如果9.0子项不存在,您将需要创建它以及后续CommonInternet、 和ForceShellExecute子项。

在注册表编辑器中,浏览到以下子项之一(当它们不存在时创建这些项):

对于 64 位版本的 Windows 上的 32 位版本的 Office

HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\9.0\Common\Internet\

对于 32 位版本的 Windows 上的 32 位版本的 Office

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\9.0\Common\Internet

对于 64 位版本的 Windows 上的 64 位版本的 Office

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\9.0\Common\Internet

确保选中 Internet 子项。在编辑菜单上,指向新建,然后选择 DWORD 值。添加以下注册表值:

值名称:ForceShellExecute

双击 ForceShellExecute,然后将数值数据设置为 1。

此外,更改此键可能会影响您环境中的其他 Office 操作。文章

在 Office 2007、2010 和 2013 中使用 ForceShellExecute=1 的影响

详细讲述了这些情况。


推荐阅读