使用javascript在新窗口中打开PDF字符串

IT技术 javascript pdf
2021-02-10 02:18:48

我有一个格式化的 PDF 字符串,看起来像

%PDF-1.73 0 obj<<< /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R/Contents 4 0 R>> endobj4 0 obj<> streamx��R=o�0��+��=|vL�R���l�-��ځ,���Ge�JK����{���Y5�����Z˯k�vf�a��`G֢ۢ��Asf�z�ͼ��`%��aI#�!;�t���GD?!���<�����B�b��

...

00000 n 0000000703 00000 n 0000000820 00000 n 0000000926 00000 n 0000001206 00000 n 0000001649 00000 n trailer << /Size 11 /Root 10 0 R /Info 9 0 R >>startxref2015%%EOF

我试图在新窗口中打开这个字符串作为 PDF 文件。每当我使用 window.open() 并将字符串写入新选项卡时,它认为文本应该是 HTML 文档的内容。我希望它能够识别出这是一个 PDF 文件。

任何帮助深表感谢

6个回答

仅供参考,以下

window.open("data:application/pdf," + encodeURI(pdfString)); 

在 Chrome 中不再起作用。昨天,我遇到了同样的问题并尝试了这个解决方案,但没有奏效(“不允许将顶部框架导航到数据 URL”)。您不能再直接在新窗口中打开数据 URL。但是,您可以将其包装在 iframe 中并在如下所示的新窗口中打开它。=)

let pdfWindow = window.open("")
pdfWindow.document.write(
    "<iframe width='100%' height='100%' src='data:application/pdf;base64, " +
    encodeURI(yourDocumentBase64VarHere) + "'></iframe>"
)
选项卡仍在加载问题很奇怪。我们团队中的 4 名成员使用相同的按钮打开 pdf,对于 2 个人,它在 favicon 中显示正在加载,但对于我们中的 2 个人,它没有显示加载动画......每个人都使用相同版本的 chrome.. .
2021-03-21 02:18:48
@SivaKiran setTimeout-0 像这样解决我的问题setTimeout(() => { pdfWindow.document.write(<iframe width='100%' height='100%' src='${url}'></iframe> ); pdfWindow.document.title = ${title}; }, 0);
2021-03-23 02:18:48
在 Chrome 中工作,但一旦加载它就会消耗 CPU 和 GPU,并且选项卡显示它仍在加载。尝试使用iframe,embedobject
2021-04-09 02:18:48
这项工作很棒,文档在新选项卡中打开。但是,当我单击右上角的下载图标时,什么也没有发生。如何让它可以下载?
2021-04-11 02:18:48
伙计,你刚刚拯救了我的一天:]
2021-04-12 02:18:48
var byteCharacters = atob(response.data);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
  byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var file = new Blob([byteArray], { type: 'application/pdf;base64' });
var fileURL = URL.createObjectURL(file);
window.open(fileURL);

您从 API 或其他来源返回一个 base64 字符串。您也可以下载它。

有没有办法混淆网址。我想成为文件名。现在它显示为编码的 base 64 值?
2021-03-14 02:18:48
我收到错误“无法将 atob 执行到 window.any help
2021-03-24 02:18:48
希望我能投票一百次!几天来,我一直在努力打开更大的文件。真的非常感谢你!
2021-03-27 02:18:48
你能为stackoverflow.com/questions/61840240/...提供解决方案吗?
2021-03-29 02:18:48
这似乎是迄今为止最好的解决方案。其他解决方案似乎充其量只是偶尔起作用。我一直试图对来自服务器的字符串响应进行编码,但这似乎是唯一可靠的方法。谢谢!
2021-04-10 02:18:48

您可能想使用数据 URI 进行探索。它看起来像。

window.open("data:application/pdf," + escape(pdfString));

我无法立即使其工作,这可能是因为提供了二进制字符串的格式。在使用数据 URI 时,我通常也使用 base64 编码的数据。如果您能够从编码的后端传递内容,您可以使用..

window.open("data:application/pdf;base64, " + base64EncodedPDF);

希望这是您需要的正确方向。另请注意,这在 IE6/7 中根本不起作用,因为它们不支持数据 URI。

这很好,但是 window.open(url) 需要一个 URL,而不是一个 URI。IE 会在 2048 个字符之后删除任何内容,即使您使用数据 URI。在 IE 中试试这个 jsfiddle,你会发现它不起作用:jsfiddle.net/bpdj7ksv
2021-03-13 02:18:48
这对我不起作用 window.open('data:application/pdf;base64,' + btoa(unescape(encodeURIComponent(resp))), "_blank", "toolbar=yes, scrollbars=yes, resizable=yes" );
2021-03-13 02:18:48
我相信此限制不适用于数据 URI,仅适用于 URL。IE8 有一个 32KB 的数据 URI 限制,在 IE9 中被删除。
2021-03-20 02:18:48
也不会在 IE 8+ 中工作,因为 URL 大小很可能是 IE 对 URL 强加的 > 2048 个字符限制
2021-03-22 02:18:48
window.open("data:application/pdf," + escape(pdfString)); 

上面的一种将编码的内容粘贴到 URL 中。这会限制 URL 中的内容长度,因此 PDF 文件加载失败(因为内容不完整)。

此限制不适用于数据 URI,仅适用于普通导航 URL。参考:msdn.microsoft.com/en-us/library/cc848897(v=vs.85).aspx
2021-03-16 02:18:48
警告:chrome 将此检测为弹出窗口并阻止
2021-03-17 02:18:48
当内容长度过大时,您如何解决此类问题?
2021-03-23 02:18:48
有谁知道为什么打开此窗口后无法与它进行交互?像这样var wdw = window.open("data:application/pdf," + escape(pdfString)); wdw.print(); 打印功能不做任何事情。我什至尝试使用 asetTimeout来延迟打印,但这也不起作用。这就像它失去了对 window 对象的引用。如果我做同样的事情但传入一个实际的网址,它就可以工作。
2021-04-02 02:18:48
由于 MS 决定强加 2048 个最大字符 URL 长度,这在 MSIE 中不起作用。
2021-04-06 02:18:48

这个对我有用。

window.open("data:application/octet-stream;charset=utf-16le;base64,"+data64);

这个也有效

 let a = document.createElement("a");
 a.href = "data:application/octet-stream;base64,"+data64;
 a.download = "documentName.pdf"
 a.click();