javascript - 无法下载 chrome 浏览器中显示的 base64 编码的 pdf

标签 javascript google-chrome pdf

我在内置的 chrome 查看器中显示 base64 编码的文件。无论是 jpg 还是 PDF,我都无法通过按钮或右键单击来下载它。但是,所有其他功能(例如旋转和打印)都可以使用。显示的选项卡标题也只是带有微调器的“正在加载”。我可以在 firefox 中很好地下载它。

let fileDisplayUrl = '<iframe src="' + 'data:' + mimeType + ';base64,' + base64Contents + '"frameborder="0" style="border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;"></iframe>';
let win = window.open();       
win.document.write(fileDisplayUrl);

我认为这是由于我展示它的方式所致,但我还没有通过其他方式获得好运。

编辑:将这些作为对象和 img 标签进行了尝试,并且在这些标签上出现了同样的问题。

最佳答案

您的实际问题更像是您无法从新窗口下载通过 data:-URI 提供的内容。旁注:微调器可以通过 close() 关闭文档,但它不会影响不可操作的“另存为”。

我发现了两个解决方法:

  1. 在当前窗口中打开数据(“iframe”按钮执行此操作,然后可以通过右键单击下载文档,尽管其名称在 Chrome 中默认为“download.pdf”)。短文档/小图像可能是一个选项
  2. 可以提供一个明确的下载按钮,在这种情况下也可以提供一个文件名。 “窗口(选项卡)”按钮在示例中执行此操作。虽然通常将完全相同的编码数据移动两次看起来不太好,但毕竟它发生在浏览器本地

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script>
            let pdf="JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4+CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4+CiUlRU9G";
            function doFrame(){
                let frm=document.createElement("iframe");
                frm.style="border-color:black";
                frm.src="data:application/pdf;base64,"+pdf;
                document.body.appendChild(frm);
            }
            function doWindow(){
                let wnd=open("",Date.now());
                let doc=wnd.document.open();
                doc.write("<a href='data:application/pdf;base64,"+pdf+"' download='small.pdf'>Download</a><br>");
                doc.write("Object<br><object type='application/pdf' data='data:application/pdf;base64,"+pdf+"'></object><br>");
                doc.write("Embed<br><embed type='application/pdf' src='data:application/pdf;base64,"+pdf+"'><br>");
                doc.write("IFrame<br><iframe src='data:application/pdf;base64,"+pdf+"'/>");
                doc.close();
            }
        </script>
    </head>
    <body>
        <button onclick="doWindow()">window(tab)</button><br>
        <button onclick="doFrame()">iframe</button><br>
    </body>
</html>

这不是一个可运行的片段,因为这里的安全沙箱(在 StackOverflow 上)阻止了这两种尝试。
“window(tab)”变体将 pdf 打开为 objectembediframe,我可以确认右击+“另存为” "在 Chrome 中不会对它们做任何事情。下载按钮有效(同样,至少在 Chrome 中)。

关于javascript - 无法下载 chrome 浏览器中显示的 base64 编码的 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59109423/

相关文章:

javascript - 离开页面时弹出消息

javascript - Google 可视化数据表到 CSV 下载

pdf - 如何更改数据表中的导出 PDF 字体大小?

c - 如何用c语言打印pdf文件?

javascript - 将 html 事件绑定(bind)到函数

javascript - rails : Click on results in Algolia search auto-completion

javascript - 与跨站点资源关联的 cookie 设置为没有 `SameSite` 属性

google-chrome - Chrome 稳定版和 Chrome Canary 使用不同的颜色配置文件 (Mac OSX)

pdf - ImageMagick 生成带有特殊页码的 pdf

javascript - native Javascript在调整大小后获取浏览器宽度,然后运行函数