javascript - URL.createObjectURL(blob):如何为动态生成的 .pdf 提供“有意义的文件名”?
问题描述
我正在调用 Web 服务来生成 .pdf,然后使用 createObjectURL 和 iframe 来打印和显示它:
var title = "Claim-" + this.claimNumber + "-" + new Date() + ".pdf";
var blob = new Blob([wsRequest.response], { type: 'application/pdf' });
blob.name = title;
if (browser() === 'IE') {
window.navigator.msSaveOrOpenBlob(blob, title);
} else {
var fileURL = URL.createObjectURL(blob);
var win = window.open();
win.document.write('<iframe name="' + title + '" src="' + fileURL + '" frameborder="0" style="border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;" allowfullscreen></iframe>');
win.document.title = title;
对于 IE,它工作得很好:.pdf 出现在 Acrobat Reader 中,它显示,我可以打印它......它有一个“有意义的文件名”。
对于 Chrome/嵌入式 .pdf 查看器,它也可以正常工作:它出现在自己的选项卡中,并且该选项卡具有“有意义的文件名”。
但是,如果 Chrome 在 Acrobat 阅读器中显示图像:
a)我得到一个新的空白标签(带有“有意义的名称”)
b) Acrobat 显示一个 GUID - createObjectURL() 分配的 GUID:
示例:“blob: http: //192.168.116.170 :9080/dd554e89-0174-4b9a-bbd1-0934239a4c9 ”
如您所见,两者都没有blob.name = title
或<iframe name=" + title + "...>
似乎没有帮助。
问:如果 Chrome 在外部查看器(如 Acrobat)中打开动态生成的 .pdf,我有什么方法可以“为其分配一个有意义的名称”?
解决方案
一种方法是在打开文件之前用文件名保存文件。不幸的是,这可能不会自动打开文件。
var fileLink = document.createElement('a');
fileLink.href = fileURL;
fileLink.download = title;
fileLink.click();
另一种方法是在您的 Web 服务器上生成 PDF 和文件名,并远程提供链接,而不是在浏览器中本地生成文件名。这可能会为您提供更一致的时间戳,因为它们是由您的服务器生成的,而不是由不同时区的所有客户端生成的。然后,如果您和您的客户有任何疑问,他们将能够在逻辑上参考相同的文档。
推荐阅读
- react-native - 尝试制作简单的 react-native-app 时无法显示警报
- docker - Docker 容器输出不会更新其标准输出的最后一行,而是垃圾邮件
- python - 从并行运行脚本更新值的最佳方法 - Python
- javascript - JavaScript 没有从“getElementById”获取值
- c# - Quartz.NET 三级架构С#
- python - 从另一个正在运行的python文件访问一个类实例/变量?
- angular - 带有 rxjs 的异步管道
- python - 为什么 Vim 用 +python3 编译时运行 python2?
- javascript - 需要一些关于如何查找由 JavaScript 生成的动态 DOM ID 的说明
- node.js - ejs 文件已加载但没有出现