使用JavaScript在客户端将base64字符串另存为PDF

ows*_*ata 34 javascript pdf firefox base64 internet-explorer

所以这里我的问题:我有一个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>
Run Code Online (Sandbox Code Playgroud)

它与Chrome和Safari配合使用.Firefox确实识别pdf但不显示它,因为FF要求存在扩展,但数据uri在这种情况下没有.我坚持这里的原因,如果chrome和safari得到它的工作,那么必须有FF和IE的解决方案

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

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

adn*_*ved 25

您可以使用此功能从 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();}
Run Code Online (Sandbox Code Playgroud)

此代码将使用 href 和下载文件制作一个锚标记。如果要使用按钮,则可以在单击按钮时调用 click 方法。

我希望这会帮助你谢谢


Gab*_*l C 20

您可以创建一个类似下面显示的锚点来下载base64 pdf:

<a download=pdfTitle href=pdfData title='Download pdf document' />
Run Code Online (Sandbox Code Playgroud)

其中pdfData是您的base64编码的PDF像"数据:应用程序/ PDF格式; BASE64,JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURlY29kZT4 + CnN0cmVhbQp4nO1cyY4ktxG911fUWUC3kjsTaBTQ1Ytg32QN4IPgk23JMDQ2LB/0 + 2YsZAQzmZk1PSPIEB ......"

  • 在 C# 中,当您返回 FileContentResult 时,它会保留以 base64 编码的文件,但是没有任何迹象,也没有 mime 类型。因此,为了在客户端正确实现它,我必须附加 data:application/pdf;base64,在字符串前面,它起作用了! (3认同)
  • 您的此信息帮助我在 Salesforce Lightning 中完成了它,使用此字符串您可以通过单击按钮下载文件 (2认同)
  • 这帮助我避免创建额外的后端端点只是为了下载文件,谢谢! (2认同)

Den*_*ret 19

您应该能够使用下载文件

window.open("data:application/pdf;base64," + Base64.encode(out));
Run Code Online (Sandbox Code Playgroud)

  • 不,Chrome和FF直接下载,但不指定扩展名.Safari打开PDF并在浏览器中显示哇.IE打开一个新标签,标题为"application/octet-stream",没有别的... (2认同)

Ka0*_*a0s 15

我知道这个问题很老,但也想完成这个并且在看的时候遇到它.对于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;
Run Code Online (Sandbox Code Playgroud)

使用链接的文件管理器:

if (window.saveAs) { window.saveAs(blob, name); }
    else { navigator.saveBlob(blob, name); }
Run Code Online (Sandbox Code Playgroud)


小智 8

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');
Run Code Online (Sandbox Code Playgroud)

  • 我在互联网上寻找了多种解决方案,这是唯一对我有用的解决方案,谢谢 Manas Sahu 先生 (2认同)