我使用 PDFKit (无节点)在浏览器中生成 PDF,并通过 src 属性将其显示为 iframe 或嵌入标签。生成的 blob URL 是某种 UUID。所以整个页面看起来像:
<embed src="blob:http://localhost/eeaabb..."/>
PDF 看起来不错,但当我单击 Chrome 中的“下载”链接时,默认文件名是 UUID。在 FireFox 中,它只是“document.pdf”。
如果这是服务器生成的 PDF,我将使用 Content-Disposition 和/或操作 URL,因此它的最后一部分就是我想要的名称,但这对于客户端生成的对象来说似乎不可能。
我尝试过的事情:
- 通过元数据设置 PDF 标题。这有效但不影响文件名。
- 操作嵌入标签标题属性。似乎什么也没做。
- 更改页面标题。不影响文件。
- 尝试在数据 url 中附加一些内容。只是阻止 PDF 显示。
- 通过 POST 上传 PDF,然后通过我可以控制 URL 的页面下载它。可以工作,但生成客户端 PDF 只需将其上传到服务器似乎很疯狂。
有什么办法可以解决这个问题,以便我可以控制默认/建议的文件名吗?
Note:
这个答案已经过时了。
下面描述的行为自发布以来确实发生了变化,并且将来可能仍会发生变化。
由于这个问题已在其他地方提出过,并且有更好的答复,因此我邀请您阅读以下内容:我可以设置 Chrome 中显示的 PDF 对象的文件名吗? https://stackoverflow.com/questions/53548182/can-i-set-the-filename-of-a-pdf-object-displayed-in-chrome
我还没有找到 chrome 的默认插件。
我有一些适用于 Firefox 的东西,默认为download.pdf
在铬中,出于某种奇怪的原因......
通过传递以下形式的 dataURI
'data:application/pdf;headers=filename%3D' + FILE_NAME + ';base64,...'
Firefox 接受 FILE_NAME 作为文件名,但 chrome 不...
A plnkr http://plnkr.co/edit/zEGPcVn6ZbMnlTw1ySRw?p=preview来展现更好的download.pdf
在 chrome 中,它不喜欢嵌套的 iframe...
还有一个仅适用于 FF 的片段:
const FILE_NAME = 'myCoolFileName.pdf';
const file_header = ';headers=filename%3D';
fetch('https://dl.dropboxusercontent.com/s/rtktu1zwurgd43q/simplePDF.pdf?dl=0').then(r => r.blob())
.then(blob=>{
const f = new FileReader();
f.onload = () => myPdfViewer.src = f.result.replace(';', file_header + encodeURIComponent(FILE_NAME) + ';');
f.readAsDataURL(blob);
});
<iframe id="myPdfViewer" width="500" height="500"></iframe>
但请注意,如果它对您来说真的很重要,您当然可以不依赖浏览器自己的插件,而使用例如Mozilla 的 PDF.js https://mozilla.github.io/pdf.js/您将获得更广泛的控制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)