前端下载PDF

本文介绍了如何在JavaScript中使用a标签进行文件下载,包括直接使用a标签的download属性、通过axios或原生XMLHttpRequest请求获取文件流并创建下载链接,以及后端设置Content-Disposition响应头以实现强制下载。还提及了处理字符内容转blob和IE浏览器兼容性问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.a标签下载

       const elink = document.createElement("a");
       elink.download = i.substring(i.lastIndexOf('/')+1);
       elink.style.display = "none";
       elink.target="_blank";
       elink.href = i;
       document.body.appendChild(elink);
       elink.click();
       URL.revokeObjectURL(elink.href); // 释放URL 对象
       document.body.removeChild(elink);

必须同源,否则会出现只跳转不下载的情况。

2.直接使用a标签并在url后拼接'?response-content-type=application/octet-stream'字符串就能实现下载。

url = url + "?response-content-type=application/octet-stream"

3.文件流

axios请求:vue记得引入axios

       axios.get(i, {responseType: 'blob'}).then(res=>{
           console.log(res);
           let url=URL.createObjectURL(res.data);
           console.log(url);
           const a = document.createElement('a');
           a.style.display = 'none';
           a.href = url;
           //download属性可以设置下载到本地时的文件名称,经测试并不需要加文件后缀
           a.setAttribute('download', fileName);
           document.body.appendChild(a);
           a.click();
           document.body.removeChild(a);
         //释放内存
           URL.revokeObjectURL(url);
       })

 原生请求:

    getBlob(url) {
        let xhr = new XMLHttpRequest()
        let _this = this
        xhr.open('get', url, true)
        xhr.setRequestHeader('Content-Type', `application/pdf`)
        xhr.responseType = 'blob'
        xhr.onload = function() {
            if (this.status === 200) {
            // 接受二进制文件流
            // var blob = xhr.response
            var blob = this.response
            // 下载
            _this.downloadExportFile(blob, '文件名', 'pdf')
            }
        }
        xhr.send()
    },
    downloadExportFile(blobData, fileName, fileType = 'xlsx', callback){
      fileName = fileName + '.' + fileType

      if (window.navigator.msSaveOrOpenBlob) {
        // IE浏览器下
        navigator.msSaveBlob(blobData, fileName)
      } else {
        let link = document.createElement('a')
        link.href = window.URL.createObjectURL(blobData)
        link.download = fileName
        link.click()
        window.URL.revokeObjectURL(link.href)
      }
      if (callback) {
        callback()
      }
    },

 如果有文件content:

Download(content, filename) {
    var eleLink = document.createElement('a');
    eleLink.download = filename;
    eleLink.style.display = 'none';
    // 字符内容转变成blob地址
    var blob = new Blob([content]);
    eleLink.href = URL.createObjectURL(blob);
    // 触发点击
    document.body.appendChild(eleLink);
    eleLink.click();
    document.body.removeChild(eleLink);
};

4.后端设置下载请求的响应头 Content-Disposition 强制下载

前端只需要 window.open(url) 即可在pc 直接下载
### 前端实现PDF文件下载的功能 在前端开发中,可以通过多种方式来实现PDF文件的下载功能。以下是几种常见的方法及其具体实现: #### 方法一:通过调整浏览器默认行为 某些情况下,PDF文件可能不会自动触发下载,而是在浏览器内部直接预览。为了强制下载而不是预览,可以修改浏览器的行为设置[^2]。 例如,在Google Chrome浏览器中,进入 **设置 -> 隐私与安全 -> 网站设置 -> 更多内容设置 -> PDF 文档**,将默认行为改为“始终下载PDF文件”。 这种方法适用于用户手动配置环境的情况,但对于自动化需求并不适用。 --- #### 方法二:使用 `html2canvas` 和 `jspdf` 插件 此方法适合于动态生成PDF的需求。它通过先将HTML页面渲染为图片,再利用 `jspdf` 将其转化为PDF文件并提供下载链接[^3]。 ##### 实现步骤: 1. 安装依赖库: ```bash npm install html2canvas jspdf --save ``` 2. 编写代码逻辑: ```javascript import html2canvas from 'html2canvas'; import jsPDF from 'jspdf'; function generatePdf() { const element = document.getElementById('contentToConvert'); // 要转换的内容区域ID html2canvas(element).then(canvas => { const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF(); // 添加图像至PDF pdf.addImage(imgData, 'PNG', 0, 0); pdf.save("downloaded-document.pdf"); }); } ``` 这种方式的优点在于灵活性高,缺点是性能开销较大,尤其对于复杂页面结构。 --- #### 方法三:基于HTTP请求获取二进制数据流 这是最常见的一种实现方案,特别适用于已知固定路径的PDF资源。通过发送GET请求获取服务器上的PDF文件,并将其作为Blob对象处理后供客户端下载[^4]。 ##### 示例代码: ```javascript function downloadFile(url, fileName) { axios.get(url, { responseType: 'blob' }) // 设置响应类型为 blob .then(response => { const fileUrl = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = fileUrl; link.setAttribute('download', fileName || 'document.pdf'); // 自定义保存名称 document.body.appendChild(link); link.click(); // 执行点击事件以启动下载 // 清理临时DOM节点 link.remove(); window.URL.revokeObjectURL(fileUrl); }) .catch(error => console.error('Error downloading the file:', error)); } // 使用示例 const pdfUrl = "http://example.com/path/to/file.pdf"; downloadFile(pdfUrl, "sample-file.pdf"); ``` 上述代码片段展示了如何通过Axios发起网络请求以及后续的操作流程。注意需确保目标服务支持CORS跨域资源共享策略或者采用代理机制规避潜在的安全限制。 --- #### 总结 以上介绍了三种不同的前端技术手段用于完成PDF文件的下载任务。每种都有各自的特点和适应场景,请依据实际业务需求选取合适的解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值