vue项目纯前端实现导出pdf文件

1、下载插件

npm install html2canvas
npm install jspdf

2、创建htmlToPdf.js,地址:src/utils/htmlToPdf.js

import html2Canvas from 'html2Canvas'  
import JsPDF from 'jspdf'  
  
export default {  
    install(Vue, options) {  
        Vue.prototype.getPdfFromHtml = function (eleId, pdfFileName, hide) {  
            // 确保传入了正确的元素ID  
            const ele = document.getElementById(eleId);  
            if (!ele) {  
                console.error('No element found with ID:', eleId);  
                return;  
            }  
  
            pdfFileName = pdfFileName || "pdf";  
  
            // 滚动置顶(如果需要)  
            window.pageYOffset = 0; // 或者使用 window.scrollTo(0, 0);  
  
            // ... 其他可能的滚动设置(如果有)  
  
            // 使用html2canvas捕获元素并转换为canvas  
            html2Canvas(ele, {  
                dpi: window.devicePixelRatio * 2, // 根据需要调整DPI  
                useCORS: true, // 允许跨域图片  
                // ... 其他选项  
            }).then(canvas => {  
                // 隐藏加载消息(如果有)  
                this.$message.closeAll(); // 假设您使用的是Element UI的message组件  
  
                // 创建PDF文档并添加canvas内容  
                const pdf = new JsPDF('p', 'mm', 'a4'); // 使用A4纸,横向  
                const imgProps = pdf.getImageProperties(canvas.toDataURL('image/png'));  
  
                // 根据需要添加多页内容(如果需要)  
                let heightLeft = imgProps.height;  
                const top_left_margin = 10; // 您可以根据需要调整边距  
                const pdfWidth = pdf.internal.pageSize.getWidth() - 2*top_left_margin;  
                const pdfHeight = pdf.internal.pageSize.getHeight() - 2*top_left_margin;  
  
                while(heightLeft > 0) {  
                    pdf.addImage(canvas.toDataURL('image/png'), 'PNG', top_left_margin, top_left_margin, pdfWidth, Math.min(pdfHeight, heightLeft));  
                    if (heightLeft > pdfHeight) {  
                        pdf.addPage();  
                    }  
                    heightLeft -= pdfHeight;  
  
                    // 如果需要,可以在此处添加页眉/页脚等  
                }  
  
                // 保存PDF  
                pdf.save(pdfFileName + '.pdf');  
            }).catch(error => {  
                console.error('Error generating PDF:', error);  
                // 显示错误消息(如果需要)  
                this.$message.error('生成PDF时出错');  
            });  
        };  
    }  
};

3、main.js中引入

import htmlToPdf from './utils/htmlToPdf.js'

Vue.use(htmlToPdf)

4、vue页面中使用

在需要打印的块元素上边添加id='pdfDom'

this.GetPdfFromHtml('pdfDom',this.name)

实现Vue 中查询数据并导出 PDF 文件,你需要使用一些库来生成 PDF。这里我们使用 `jspdf` 和 `html2canvas` 库来生成 PDF 文件。 首先你需要通过 Vue.js 发送一个查询数据的请求到后端,并且接收到后端返回的数据。在前端接收到数据后,你可以使用以下方法将数据生成为 PDF 文件: ```javascript import html2canvas from 'html2canvas'; import jsPDF from 'jspdf'; ... // 假设你已经从后端接收到了数据,存储在 data 变量中 const doc = new jsPDF(); const tableRows = []; const columns = [ { title: '姓名', dataKey: 'name' }, { title: '年龄', dataKey: 'age' }, { title: '性别', dataKey: 'gender' }, ]; data.forEach(item => { tableRows.push([item.name, item.age, item.gender]); }); doc.autoTable({ head: [columns.map(c => c.title)], body: tableRows, }); // 生成 PDF 文件 html2canvas(document.querySelector('#pdf-content')).then(canvas => { const imgData = canvas.toDataURL('image/png'); const imgWidth = 210; const pageHeight = 295; const imgHeight = (canvas.height * imgWidth) / canvas.width; let heightLeft = imgHeight; let position = 0; doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight); heightLeft -= pageHeight; while (heightLeft >= 0) { position = heightLeft - imgHeight; doc.addPage(); doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight); heightLeft -= pageHeight; } doc.save('data.pdf'); }); ``` 上面的代码中,我们首先使用 `autoTable` 方法将数据渲染到 PDF 表格中,然后使用 `html2canvas` 库将页面上的内容转换为 canvas,最后使用 `addImage` 方法将 canvas 添加到 PDF 中。如果 PDF 文件内容超出一页,我们需要添加新的页面来显示全部内容,这里我们使用了一个 while 循环来实现。 需要注意的是,上面的代码中使用了 `#pdf-content` 选择器来选择需要生成 PDF 的内容,你需要在你的代码中添加一个具有该选择器的元素来包含需要导出的内容。 希望这个示例能够帮助你生成 PDF 文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值