当前位置: 首页 > 知识库问答 >
问题:

使用javascript下载时,PDF是空白的

龚联
2023-03-14

我有一个web服务,它在响应中返回PDF文件内容。我想在用户点击链接时将其下载为pdf文件。我在UI中编写的javascript代码如下:

$http.get('http://MyPdfFileAPIstreamURl').then(function(response){
var blob=new File([response],'myBill.pdf',{type: "text/pdf"});
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myBill.pdf";
link.click();
});

“response”包含来自“MyPdfFileAPIstreamURl”的servlet outputstream的PDF字节数组。并且该流也没有被加密。

因此,当我点击链接时,成功下载了一个大小约为200KB的PDF文件。但当我打开这个文件时,它会打开空白页。下载的pdf文件的起始内容在图像中。

我不明白这是怎么回事。帮助!

这是下载的pdf文件开始属性:

共有3个答案

锺离浩慨
2023-03-14

我在React项目中也遇到了同样的问题。在API上,我使用res.download()将PDF文件附加到响应中。通过这样做,我收到了一个基于字符串的文件。这就是文件打开为空白或损坏的真正原因。

在我的情况下,解决方案是强制响应类型为“斑点”。由于我是通过axios发出请求的,我只是简单地在选项对象中添加了这个attr:

axios.get('your_api_url_here', { responseType: 'blob' })

之后,为了使下载发生,您可以在您的“fetchFile”方法中做类似这样的事情:

const response = await youtServiceHere.fetchFile(id)
const pdfBlob = new Blob([response.data], { type: "application/pdf" })

const blobUrl = window.URL.createObjectURL(pdfBlob)
const link = document.createElement('a')
      link.href = blobUrl
      link.setAttribute('download', customNameIfYouWantHere)
      link.click();
      link.remove();
URL.revokeObjectURL(blobUrl);
平学
2023-03-14

我从服务器获取数据作为字符串(它是base64编码为字符串),然后在客户端将其解码为base64,然后解码到数组缓冲区。

示例代码

function solution1(base64Data) {

    var arrBuffer = base64ToArrayBuffer(base64Data);

    // It is necessary to create a new blob object with mime-type explicitly set
    // otherwise only Chrome works like it should
    var newBlob = new Blob([arrBuffer], { type: "application/pdf" });

    // IE doesn't allow using a blob object directly as link href
    // instead it is necessary to use msSaveOrOpenBlob
    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveOrOpenBlob(newBlob);
        return;
    }

    // For other browsers: 
    // Create a link pointing to the ObjectURL containing the blob.
    var data = window.URL.createObjectURL(newBlob);

    var link = document.createElement('a');
    document.body.appendChild(link); //required in FF, optional for Chrome
    link.href = data;
    link.download = "file.pdf";
    link.click();
    window.URL.revokeObjectURL(data);
    link.remove();
}

function base64ToArrayBuffer(data) {
    var binaryString = window.atob(data);
    var binaryLen = binaryString.length;
    var bytes = new Uint8Array(binaryLen);
    for (var i = 0; i < binaryLen; i++) {
        var ascii = binaryString.charCodeAt(i);
        bytes[i] = ascii;
    }
    return bytes;
};
邢星波
2023-03-14

通过XMLHttpRequest和<code>xhr解决了这个问题。responseType='arraybuffer'

var xhr = new XMLHttpRequest();
    xhr.open('GET', './api/exportdoc/report_'+id, true);
    xhr.responseType = 'arraybuffer';
    xhr.onload = function(e) {
       if (this.status == 200) {
          var blob=new Blob([this.response], {type:"application/pdf"});
          var link=document.createElement('a');
          link.href=window.URL.createObjectURL(blob);
          link.download="Report_"+new Date()+".pdf";
          link.click();
       }
    };
xhr.send();
 类似资料:
  • 我试图下载一个pdf从它的URL使用requests.get方法,然后保存在本地桌面的变量名。 但是,运行大约需要2分钟,pdf文件会被保存,但acrobat阅读器无法读取。

  • 在我的主要活动中: 编辑:我在主线程上运行了网络代码,它引发了一个异常。现在为下载创建一个新的线程,它将获得示例PDF(http://www.pdf995.com/samples/PDF.PDF),并将其内容放入文件中。感谢@GreenApps!

  • 使用google docs在webview中打开pdf 一次又一次地打开相同的pdf或不同的pdf。 有时在android中会显示空白/白色页面,直到我们再次刷新网页1或2次。 我已经在PDF上做了样本。该项目的链接如下所示: 希望这能更好地帮助你。

  • 我正在实现一个ASP api来完成所有Docusign api流(获取登录信息,获取令牌,发送要签名的信封,下载信封文档)。现在我试图在浏览器中显示一个下载的文档,该文档是空白的。我正在从docusign接收文档字节内容,并试图将其呈现在iframe中。 docusign发送的PDF内容如下 更新 如果文档超过1页,则可以看到所有页面,全部为空白······

  • 本文向大家介绍JavaScript 修剪空白,包括了JavaScript 修剪空白的使用技巧和注意事项,需要的朋友参考一下 示例 要从字符串的边缘修剪空格,请使用String.prototype.trim: 许多JavaScript引擎(而非Internet Explorer)实现了非标准trimLeft和trimRight方法。目前,在该过程的第1阶段,有一项提议是标准化trimStart和tr

  • 我试图使用Apache Fop和Java生成PDF,但生成的Pdf总是一个空白页。它都嵌套在一个网络应用程序中,割断器是玻璃鱼。 有人有什么建议吗? 以下是我的xsl: 示例XML文件如下所示: 编辑:应该生成pdf的Java代码。。。 第二次编辑: 我发现我的outputStream有问题。我想显示另存为对话框,以便从web应用程序下载生成的文件。我不明白,我的输出有什么问题。。。