56

所以这是我的问题:我有一个 pdf 文件作为我从服务器获取的 base64 字符串。我想使用此字符串将 PDF 直接显示到浏览器,或者在单击链接时为其提供“另存为...”选项。这是我正在使用的代码:

<!doctype>
<html>
<head>
   <title>jsPDF</title>
   <script type="text/javascript" src="../libs/base64.js"></script>
   <script type="text/javascript" src="../libs/sprintf.js"></script>
   <script type="text/javascript" src="../jspdf.js"></script>

       <script type="text/javascript">

        function demo1() {
            jsPDF.init();
            jsPDF.addPage();
            jsPDF.text(20, 20, 'Hello world!');
            jsPDF.text(20, 30, 'This is client-side Javascript, pumping out a PDF.');

            // Making Data URI
            var out = jsPDF.output();
            var url = 'data:application/pdf;base64,' + Base64.encode(out);

            document.location.href = url;
         }
    </script>
</head>
<body>

<a href="javascript:demo1()">Run Code</a>

</body>
</html>

它在 Chrome 和 Safari 上运行良好。Firefox 确实识别 pdf,但不显示它,因为 FF 需要存在扩展名,但在这种情况下 data-URI 没有。我在这里坚持的原因,如果 chrome 和 safari 让它工作,那么必须有 FF 和 IE 的解决方案

我知道有一些相关的问题,但不是真正的确切问题,现在也有点老了。我知道一种解决方法是在服务器端生成 pdf,但我想在客户端生成它。

那么请聪明的人,是否有可能通过一些黑客或额外的JS下载插件?

4

6 回答 6

34

您可以创建一个如下所示的锚来下载base64 pdf:

<a download=pdfTitle href=pdfData title='Download pdf document' />

where pdfData is your base64 encoded pdf like "data:application/pdf;base64,JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nO1cyY4ktxG911fUWUC3kjsTaBTQ1Ytg32QN4IPgk23JMDQ2LB/0+2YsZAQzmZk1PSPIEB..."

于 2014-01-24T15:55:36.837 回答
29

您可以使用此功能从 base64 下载文件。

function downloadPDF(pdf) {
const linkSource = `data:application/pdf;base64,${pdf}`;
const downloadLink = document.createElement("a");
const fileName = "abc.pdf";
downloadLink.href = linkSource;
downloadLink.download = fileName;
downloadLink.click();}

此代码将使用 href 和下载文件制作一个锚标记。如果你想使用按钮,那么你可以在你的按钮点击时调用点击方法。

我希望这对你有帮助谢谢

于 2019-12-16T08:27:49.430 回答
23

您应该能够使用下载文件

window.open("data:application/pdf;base64," + Base64.encode(out));
于 2012-07-10T14:51:40.427 回答
17

我知道这个问题很老,但也想完成这个并在寻找时遇到了它。对于 Internet Explorer,我使用此处的代码来保存 Blob。要从 base64 字符串创建一个 blob,这个站点上有很多结果,所以它不是我的代码,我只是不记得具体的来源:

function b64toBlob(b64Data, contentType) {
    contentType = contentType || '';
    var sliceSize = 512;
    b64Data = b64Data.replace(/^[^,]+,/, '');
    b64Data = b64Data.replace(/\s/g, '');
    var byteCharacters = window.atob(b64Data);
    var byteArrays = [];

    for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
        var slice = byteCharacters.slice(offset, offset + sliceSize);

        var byteNumbers = new Array(slice.length);
        for (var i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        var byteArray = new Uint8Array(byteNumbers);

        byteArrays.push(byteArray);
    }

    var blob = new Blob(byteArrays, {type: contentType});
    return blob;

使用链接文件保护程序:

if (window.saveAs) { window.saveAs(blob, name); }
    else { navigator.saveBlob(blob, name); }
于 2015-02-17T10:18:04.467 回答
9

dataURItoBlob(dataURI) {
      const byteString = window.atob(dataURI);
      const arrayBuffer = new ArrayBuffer(byteString.length);
      const int8Array = new Uint8Array(arrayBuffer);
      for (let i = 0; i < byteString.length; i++) {
        int8Array[i] = byteString.charCodeAt(i);
      }
      const blob = new Blob([int8Array], { type: 'application/pdf'});
      return blob;
    }

// data should be your response data in base64 format

const blob = this.dataURItoBlob(data);
const url = URL.createObjectURL(blob);

// to open the PDF in a new window
window.open(url, '_blank');

于 2020-06-15T15:49:45.353 回答
1

为此,您不需要任何库。JavaScript 已经支持这一点。这是我的端到端解决方案。

const xhr = new XMLHttpRequest();
xhr.open('GET', 'your-end-point', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
xhr.responseType = 'blob';
xhr.onreadystatechange = function () {
    if (this.readyState == 4 && this.status == 200) {
       if (window.navigator.msSaveOrOpenBlob) {
           window.navigator.msSaveBlob(this.response, "fileName.pdf");
        } else {
           const downloadLink = window.document.createElement('a');
           const contentTypeHeader = xhr.getResponseHeader("Content-Type");
           downloadLink.href = window.URL.createObjectURL(new Blob([this.response], { type: contentTypeHeader }));
           downloadLink.download = "fileName.pdf";
           document.body.appendChild(downloadLink);
           downloadLink.click();
           document.body.removeChild(downloadLink);
        }
    }
};
xhr.send(null);

这也适用于.xls.zip文件。您只需要将文件名更改为fileName.xlsfileName.zip。这取决于你的情况。

于 2019-11-28T02:08:07.043 回答