c# - 尝试打开指向 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。
编辑:
- Office:Microsoft Word for Office 365 MSO (16.0.12130.20232) 32 位
- Windows:Windows 10 Enterprise 64 位版本 1903(操作系统内部版本 18362.476)
解决方案
您可能能够以某种方式更改 PDF 的呈现以更好地使用 Word,但我相信问题可能源于ForceShellExecute
控制 Office 如何处理超链接的注册表项。当密钥设置为 0(或不存在)时,Office 应用程序使用内部 Office 进程来启动超链接。当设置为 1 时,Office 将使用 Windows 进程(与用户通过开始 | 运行 | 粘贴链接 | 回车打开链接基本相同)。如果ForceShellExecute
注册表项设置为 0 或不存在,这可能是 Word 不希望处理 API 呈现的 PDF 的原因。
要测试这是否是根本原因,请使用以下步骤查找/更改值或创建注册表项(这些步骤来自在 Office 中选择超链接时出现错误消息:“无法找到 Internet 服务器或代理服务器”:
重要的提示
所有版本的 Office 都要求该项ForceShellExecute
位于9.0
注册表子项下。如果9.0
子项不存在,您将需要创建它以及后续Common
的Internet
、 和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 的影响
详细讲述了这些情况。
推荐阅读
- python - 我们可以使用 Keras 进行视频数据增强吗?
- python - 通过 pandas 绘图界面绘制带有第二个 y 轴的 pandas 数据框时设置图例位置
- quasar-framework - Quasar Framework:在 QLayoutHeader/QToolbar 中隐藏 QToolbarTitle
- pimcore - Pimcore CSV 从文件夹位置上传并自动创建数据对象
- java - 如何按照提交的顺序通过 websocket 代理在 Spring Boot 中发送消息?
- sql-server - Kafka Connect with MSSQL 不适用于删除操作
- docker - Docker:如何将容器内的 IP 重定向到另一个 IP
- angular - 禁用角度中的默认键值管道排序
- google-apps-script - 具有两个 onEdit 实例的共享电子表格,删除错误的行
- angular - Bootstrap 版本问题,从 bootstrap3 迁移到 boostrap4