vue2利用html2canvas+jspdf动态生成多页PDF

news2024/9/21 19:07:22

业务需求中,前端把页面上的内容导出为图片,pdf,excel是常有的事。当然,这些工作后端也是能做。秉着前端是万能的理念,今天就站在前端的角度上,来实现将页面内容导出为pdf,实现指定div内容导出,并自动拼接成一个多页的PDF文件

1.PDF相关依赖 

        vue2脚手架项目中,关于PDF的依赖老生常用的就那么几个。pdfmake,vue-print-nb,v-html5-renderer,print-js,html2pdf.js,vue-pdf。总结起来无非就是达到将内容生成pdf,预览pdf这两个业务场景。

        本篇讲的是通过html2canvas+jspdf来动态指定div内容转化为pdf

        html2canvas 可以将 HTML 画布(canvas)捕捉为图像,然后 jspdf 可以将这些图像转换为 PDF 格式

第一步先安装依赖

npm install jspdf html2canvas --save
# 或者
yarn add jspdf html2canvas

2.效果展示及源码

 导出后一个div为一个pdf页面,不足的留空白。超出的会自动加页面补充。假设,你首页想指定一个图片作为封面,中间的一大段内容从第二页开始,自动往后分页。那就设置两个div就行了。

PDF生成后的大致效果

下面附上代码,就一个vue文件,方便各位拿来即用,能立马看到效果:

<template>
    <div id="pdfinsurancepdf">
        <div style="width: 490pt;margin: auto;">
            <div class="title" style="padding:20pt">
                <el-button type="primary" @click="downpdf">下载PDF</el-button>
                 <el-divider></el-divider>
            </div>
            <div id="page1">
                <img src="@/assets/1.jpg" style="width:100%;height:auto" alt="封面" />
            </div>
            <div id="page2">
                    <template>
                    <el-table
                    :data="tableData"
                    style="width: 100%">
                    <el-table-column
                        prop="date"
                        label="日期"
                        width="180">
                    </el-table-column>
                    <el-table-column
                        prop="name"
                        label="姓名"
                        width="180">
                    </el-table-column>
                    <el-table-column
                        prop="address"
                        label="地址">
                    </el-table-column>
                    </el-table>
                </template>
                <div>
                    <pre>
当你在凝视着网页的时候
网页也正在凝视着你
流情|导航站
Who is liuqing?

种一棵树最好的时间是十年前,然后就是现在——致想做还未来得及做的你

How lucky to meet you!

你好,这里是流情 Liuqing ,26岁,技术宅,对有趣的世界和可能有趣的你感到好奇,热爱IT和国风文化,
从事互联网产品/Web开发相关工作。希望能与你在比特之海的繁星之下相见!
                    </pre>
                </div>  
            </div>
            <div id="page3">
                <div>
                    <img src="@/assets/2.jpg" style="width:100%;height:auto" alt="结束页" />
                </div>
            </div>
        </div>
    </div>
</template>

<script>
import html2canvas from 'html2canvas';
import JsPDF from 'jspdf';
export default {
    name:'insurancepdf',
    data() {
        return {
            compony:"pdf导出多页测试",
            tableData: [{
                date: '2016-05-02',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1518 弄'
            }, {
                date: '2016-05-04',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1517 弄'
            }, {
                date: '2016-05-01',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1519 弄'
            }, {
                date: '2016-05-03',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1516 弄'
            }]
            }
    },
    moutned() {
        console.log(123)
    },
    methods:{
        downpdf(){
            const pdf = new JsPDF('p', 'mm', 'a4');
            var divIds = ['page1', 'page2','page3'];
            const promises = divIds.map(divId => {
                const div = document.getElementById(divId);
                return html2canvas(div, {
                    allowTaint: false,
                    taintTest: false,
                    logging: false,
                    useCORS: true,
                    dpi: window.devicePixelRatio * 1,
                    scale: 2        //画布分辨率
                });
            });
            
            Promise.all(promises).then(canvases => {
                canvases.forEach((canvas, index) => {
                    if (index > 0) {
                        pdf.addPage();
                    }
                    this.addCanvasToPdf(pdf, canvas);
                });
                pdf.save('pdf导出多页测试.pdf');
            }).catch(error => {
                console.error('Error generating PDF:', error);
            });
        },
        addCanvasToPdf(pdf,canvas){
            // 接下来使用canvas创建PDF
            var ctx = canvas.getContext('2d');
            var a4w = 190; var a4h = 277; // A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
            var imgHeight = Math.floor(a4h * canvas.width / a4w); // 按A4显示比例换算一页图像的像素高度
            var renderedHeight = 0;
            while (renderedHeight < canvas.height) {
            var page = document.createElement('canvas');
                page.width = canvas.width;
                page.height = Math.min(imgHeight, canvas.height - renderedHeight);// 可能内容不足一页
                
                // 用getImageData剪裁指定区域,并画到前面创建的canvas对象中
                page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
                pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width)); // 添加图像到页面,保留10mm边距
                
                renderedHeight += imgHeight;
                if (renderedHeight < canvas.height) {
                pdf.addPage();// 如果后面还有内容,添加一个空页
                }
                // delete page;
            }
        }
    }
    
}
</script>
<style scoped>
    #pdfinsurancepdf{
        width: 100%;
        background: #fff;
    }
    span{
        line-height: 30pt;
    }
</style>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构篇】~复杂度

标题【数据结构篇】~复杂度 前言 C语言已经学完了&#xff0c;不知道大家的基础都打得怎么样了&#xff1f; 无论怎么说大家还是要保持持续学习的状态&#xff0c;来迎接接下来的挑战&#xff01; 现在进入数据结构的学习了&#xff0c;希望大家还是和之前一样积极学习新知识…

ESP32人脸识别开发--人脸识别模型(六)

ESP-DL ESP-DL 为**神经网络推理**、**图像处理**、**数学运算**以及一些**深度学习模型**提供 API&#xff0c;通过 ESP-DL 能够快速便捷地将乐鑫各系列芯片产品用于人工智能应用 ESP-DL 无需借助任何外围设备&#xff0c;因此可作为一些项目的组件&#xff0c;例如可将其作…

使用Python制作贪吃蛇小游戏

引言 贪吃蛇游戏是一款经典的电子游戏&#xff0c;玩家通过控制一条不断增长的蛇在格子内移动&#xff0c;并吃掉随机出现的食物来获得分数。随着分数的增加&#xff0c;蛇的身体也会越来越长&#xff0c;游戏的难度也随之提升。在本文中&#xff0c;我们将详细介绍如何使用Py…

天途推出无人机软硬件定制服务

近年&#xff0c;随着低空经济高速发展&#xff0c;无人机已成为千行百业的生产和工作辅助工具&#xff0c;很多行业用户都有信息化数字化的软件需求&#xff0c;以及不同负载的集成设计需求。 天途拥有云平台开发、自主飞控系统、控制算法、无人机AI数据系统等核心技术研发团队…

Flink常见面试题整理

Flink常见面试题整理 文章目录 Flink常见面试题整理1. 数据倾斜问题怎么解决&#xff1f;2、什么是Flink中的窗口3、Flink中的水位线&#xff08;Watermarks&#xff09;是什么&#xff1f;4、Flink中的定时器实现机制是什么&#xff1f;有什么作用&#xff1f;5、Flink中的状态…

llama3.1本地部署方式

llama3.1 资源消耗情况 &#xfeff;Llama 3.1 - 405B、70B 和 8B 的多语言与长上下文能力解析&#xfeff; &#xfeff; 70B版本&#xff0c;FP1616K token需要的资源约为75G&#xff1b;FP16128K token需要的资源约为110G &#xfeff; 1、ollama ollama工具部署及使用…

力扣面试经典算法150题:找出字符串中第一个匹配项的下标

找出字符串中第一个匹配项的下标 今天的题目是力扣面试经典150题中的数组的简单题: 找出字符串中第一个匹配项的下标 题目链接&#xff1a;https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/?envTypestudy-plan-v2&envIdto…

免费远程控制电脑的软件有哪些?

什么是远程控制&#xff1f; 远程控制是一种通过网络从一台设备操作另一台设备的技术。连接后&#xff0c;用户可以直接远程操作那台电脑进行各种操作。随着科技的不断进步和用户需求的增加&#xff0c;远程控制市场日益蓬勃。远程控制不仅应用于远程办公和远程教学&#xff0…

Windows11下wsl闪退的解决

wsl闪退 1. 原因分析 解释&#xff1a;WSL&#xff08;Windows Subsystem for Linux&#xff09;闪退通常指的是在Windows操作系统中运行的Linux环境突然关闭。这可能是由于多种原因造成的&#xff0c;包括系统资源不足、WSL配置问题、兼容性问题或者是Linux内核的问题。&…

STM32—PWR电源控制

1.PWR简介 PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能 可编程电压监测器(PVD)可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值一下或上升到PVD阀值之上时&#xff0c;PVD会触发中断&#xff0c;用于执行紧急关闭任务 低…

HamronyOS开发5.0【埋点】方案讲解

大多数软件产品上线前&#xff0c;都会采用有规则的日志来对软件进行相关数据的采集&#xff0c;这个过程称为&#xff1a;[埋点]&#xff0c;采集的数据主要用于产品分析。 埋点技术已在PC端, 移动端非常成熟&#xff0c;并且有大批量以此为生的公司。 本篇将探究一下Harmon…

STM32—RTC实时时钟

1.Unix时间戳 Unix时间戳定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒 时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整形变量 世界上所有时区的秒计数器相同&#xff0c;不同时区通过添加偏移来得到当地时间 2.时间戳转…

函数(子程序)的常见、易混淆概念详解【对初学者有帮助】

C语⾔中的函数也被称做子程序&#xff0c;意思就是⼀个完成某项特定的任务的⼀小段代码。 C语⾔标准中提供了许多库函数&#xff0c;点击下面的链接可以查看c语言的库函数和头文件。 C/C官⽅的链接&#xff1a;https://zh.cppreference.com/w/c/header 目录 一、函数头与函…

VsCode配置Cph实现高效刷题教程

cph作用 : 自动创建文件自动获取题目案例自动测试样例自动配置模板 在vscode中安装cph插件 : 在扩展的搜素框中输入Competitive Programming Helper(cph)&#xff0c;点击下载即可 在浏览器中安装Competitive Companion 浏览器插件 这里推荐离线下载 : 网址 : Competit…

2024/8/15 不上电测伺服端子是否正常

拿3线220V举例&#xff0c;拿两种测量表举例&#xff0c;下图均为正常情况 L1和L2测量&#xff0c;L3不用管&#xff08;空的&#xff09;。 1.先测输入L1/2是否短路&#xff0c;输出UVW是短路为正常&#xff08;与变频器相反&#xff09; 2.正&#xff08;红&#xff09;—RS…

PL/SQL是什么软件 PL/SQL最新版本功能介绍

PL/SQL是什么软件&#xff1f;PL/SQL软件多指PL/SQL Developer&#xff0c;这是一款专业的PL/SQL开发工具&#xff0c;它可以帮助开发者编写、调试和优化PL/SQL代码&#xff0c;提高开发效率和质量。本文将介绍PL/SQL Developer 15最新版本的主要功能和特点。 一、PL/SQL是什么…

华为od统一考试B卷【比赛】python实现

def split_params(param_str): return list(map(int, param_str.split(,))) def main(): # 获取输入 target_str input().strip() # 输入验证&#xff0c;拆分并转换为整数 try: m, n split_params(target_str) except ValueError: print(-1) return # 检查 M 和 …

opencascade Adaptor3d_Curve源码学习

opencascade Adaptor3d_Curve 前言 用于几何算法工作的3D曲线的根类。 适配曲线是曲线提供的服务与使用该曲线的算法所需服务之间的接口。 提供了两个派生具体类&#xff1a; GeomAdaptor_Curve&#xff0c;用于Geom包中的曲线Adaptor3d_CurveOnSurface&#xff0c;用于Geom包…

时钟缓冲器的相关知识

时钟缓冲器是比较常用的器件&#xff0c;其主要功能作用有时钟信号复制&#xff0c;时钟信号格式转换&#xff0c;时钟信号电平转换等。我们下面简单了解下&#xff1a; 1.时钟信号复制 例如ICS553芯片&#xff0c;其将单路输入时钟信号复制4份进行输出&#xff0c;输出信号具…

CSS相关修改样式、伪类样式

一、css颜色 1.颜色表示法&#xff1a; 直接以单词来表示颜色&#xff0c;如red&#xff0c;green。 2.十六进制表示法&#xff1a;&#xff08;常用&#xff09; 以#开头的6位十六进制数&#xff0c;如#000000&#xff08;#000&#xff09;。 3.RGB三原色表示法&#xff…