前端生成PDF文件实现方案

2023-10-31

一、技术选型

1.html转换成canvas后生成图片导出pdf(本文选用)
  • html转canvas插件:html2canvas是一款将HTML代码转换成Canvas的插件;
  • canvas生成pdf:jsPDF是一个使用Javascript语言生成PDF的开源库
2.HTML代码转出pdf

wkhtmltopdf是一款将HTML代码转换成pdf的插件,表格场景使用居多

二、技术实现(基于html2canvas和jsPDF实现)

1.安装插件
npm i html2canvas -S
npm i jspdf -S
2.注册及实现封装

以下封装的代码可以直接引用到项目文件中使用,需要注意以下几点:

  1. 由于需要固定导出pdf图片大小,所以需要给导出的dom上添加.pdf-screen样式类用于查找导出元素,然后更改导出元素样式;
  2. 导出页面尺寸固定为a4大小;
/**
 * @file 导出pdf文件
 */
import html2canvas from 'html2canvas';
import JsPDF from 'jspdf';

/* eslint-disable */

const PDF = {};

// a4
let a4Width = 595.28; 
let a4Height = 841.89;

let defaultOptions = {
    name: new Date().getTime(),
    scale: window.devicePixelRatio * 2,
    padding: 0,
    width: 595.28 * 2,
    allowTaint: true,
    onclone: function (dom) {
        let screen = dom.querySelector('.pdf-screen');
        screen.style.width = 595.28 * 2 + 'px';
        screen.style.padding = '10px';
    }
}

PDF.install = function (Vue, rootOptions = {}) {
    Vue.prototype.$pdf = function (dom, options = rootOptions) {
        
        options = Object.assign(defaultOptions, options);
        
        html2canvas(dom, options).then(canvas => {
            let position = 0;

            // 生成的画布元素宽高(需要收缩回原比例大小)
            let canvasWidth = canvas.width / options.scale;
            let canvasHeight = canvas.height / options.scale;

            // 页面等比例缩放后宽高
            let pageWidth = a4Width;
            let pageHeight = (a4Width / canvasWidth) * canvasHeight;
            
            //返回图片dataURL,参数:图片格式和清晰度(0-1)
            let jpeg = canvas.toDataURL('image/jpeg', 1.0);

            //方向默认竖直,尺寸ponits,格式a4[595.28,841.89]
            let doc = new JsPDF('', 'pt', 'a4');
            
            //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
            //当内容未超过pdf一页显示的范围,无需分页
            if (canvasHeight < pageHeight) {
                doc.addImage(jpeg, 'JPEG', 0, 0, pageWidth, pageHeight); // 从图片顶部开始打印
            } else {
                while (canvasHeight > 0) {
                    doc.addImage(jpeg, 'JPEG', 0, position, pageWidth, pageHeight);
                    canvasHeight -= pageHeight;
                    position -= a4Height;

                    //避免添加空白页
                    if (canvasHeight > 0) {
                        doc.addPage();
                    }
                }
            }
            doc.save(options.name + '.pdf');
        });
    };
};

export default PDF;

3.使用方式
// 在 main.js 中导入插件
import pdf from "./plugins/pdf";

// 注册插件
Vue.use(PDF);

// 在需要导出pdf的函数中调用
// dom是需要导出的最外层元素
this.$pdf(dom, options);

// 使用案例(该配置可参考HTML2CANVAS相关配置)
this.$pdf(this.$refs.screen, {
    name: 'filename',   // 导出文件名
    scale: 2,   // 导出文件清晰度,值越大清晰度越高,文件体积越大(默认值为设备dpr*2)
    ignoreElements: (element) => {  // 忽略渲染元素(通过查询dom元素,不局限于类名查询)
        if (element.className.indexOf('className') !== -1) {
            return true;
        }
    }
});

三、遇到问题及解决方案

1. pdf内容截断问题 (待解决)

问题描述:由于实现原理是将html转换成canvas后生成图片的形式导出pdf文件,会导致canvas生成的长图在分页保存的过程中出现内容被截断的情况;

2. PDF导出文件分辨率问题(已解决)

问题描述:canvas生成的图片分辨率过低;

解决方案:可对dom元素按比例进行缩放后,再生成图片并导出到pdf文件中;

四、待优化点

1.导出时附带水印效果

五、参考资料

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端生成PDF文件实现方案 的相关文章

随机推荐

  • 3dmax不能撤销

    3dmax是设计常用的软件 它既可以用来做图 也可以用来编程 但是现在出现很多的病毒 影响了3dmax的使用 例如有时候在使用3dmax做图的时候 会出现场景不能撤销的情况 这个时候就需要注意了 这个一般是感染了3dmax的ALC病毒导致的
  • JavaWeb --- JavaScript

    一 JavaScript介绍 JavaScript语言诞生主要是完成页面的数据验证 因此它运行在客户端 需要运行浏览器来解析执行JavaScript代码 JS是Netcape网景公司的产品 最早取名为LiveScript 为了吸引更多jav
  • IDEA如何执行maven命令进行打包编译及常用命令

    前提条件 maven配置环境变量 在保证环境变量配置没问题的情况下执行过程出现mvn不是内部命令类似的错误 建议重启编译器或者命令窗口 执行maven命令 方式一 在IDEA主界面左下角找到 Terminal 点击进入 直接输入想执行的命令
  • 出现 No services need to be restarted. No containers need to be restarted. No user sessions are 解决方法

    目录 前言 1 问题所示 2 解决方法 前言 此提示严重 如果有意关闭 可继续往下看 1 问题所示 当使用apt安装东西的时候 底下会出现如下问题 Scanning linux images Running kernel seems to
  • VScode运行C语言,qsort测试例子

    好久没用 刚好需要测试一下排序 顺便把VSCode的配置也记录一下 准备 1 安装编译环境 我用的mingw64 官网https sourceforge net projects mingw w64 files 记得安装好配置环境变量 或者
  • com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:

    分析 出现这种异常的原因是 MySQL服务器默认的 wait timeout 是8小时 也就是说一个connection空间超过8个小时 mysql将自动断开该connection 这就是问题所在 在连接池中的connection如果空闲超
  • 富士施乐2022网络扫描设置_富士施乐sc2020网络扫描怎么设置?

    1 在计算机客户端添加一个命名为SMB 命名随意 的共享文件夹 这个文件夹是用来存储局域网网络扫描的文件 使用简单的共享方式设置文件夹属性 勾选 在网络上共享这个文件夹 和 允许网络用户更改我的文件 2 在已经安装好多功能办公设备的计算机客
  • undionly.kpxe php,VLOG

    经过研究 终于可以将ESXI的系统通过IPXE网络启动安装到无盘的软路由或者PC上了 当然也可以通过这种方法安装window linux等等其他的系统 一 编译IPXE增加功能与自定义脚本 一 iPXE 概要 按iPXE 官网的介绍是这样的
  • Java提高篇(二七)-----TreeMap

    原文出自 http cmsblogs com p 1013 尊重作者的成果 转载请注明出处 个人站点 http cmsblogs com TreeMap的实现是红黑树算法的实现 所以要了解TreeMap就必须对红黑树有一定的了解 其实这篇博
  • IOS-Xcode Compile flags

    flag 功能 fno objc arc 该文件不启用ARC fo objc arc 该文件启用ARC w 去除警告
  • 【google版efficientdet】官方版efficientdet训练自己的数据集,终于训练成功了

    看全网还没有一篇攻略 本文是第一个 有心人当点赞下 有问题可以下方留言 互相交流 如转载请注明出处 不枉解决各种各样的bug 环境 v100 cuda10 1 tensorflow2 1 0 python3 7 7 只保证这个版本是可行的
  • NUC980开源项目5-安装repo

    上面是我的微信和QQ群 欢迎新朋友的加入 项目码云地址 国内下载速度快 https gitee com jun626 nuc980 open source project 项目github地址 https github com Jun117
  • Pandas 报错 TypeError: ‘Series‘ objects are mutable, thus they cannot be hashed

    一 需求 根据原始 CSV 文件的列 A 的值 添加一列 B 二 尝试 1 1 将 A 列与 B 列对应的值写入字典 dict A 列为 key B 列为 value 2 将 CSV 文件处理为 DataFrame 3 import pan
  • Python入门02:详细来了解一下Requests库

    那个叫做 Urllib 的库让我们的 python 假装是浏览器 接下来我们要来玩一个新的库 这个库的名称叫做 Requests 这个库比 urllib 可是要牛逼一丢丢的 毕竟 Requests 是在 urllib 的基础上搞出来的 通过
  • 个人笔记随记——在CSDN写随记原因,部分是为了自己复习,查看。

    在CSDN写随记原因 部分是为了自己复习 查看 部分原因是用来分享经验 大家共同进步 之前我的几个电脑里面有个自己的个人数据库 所以笔记都在那里记录 因为现在除了码字 经常不携带电脑 导致笔记不能随时观看 所以现在即在CSDN开了个人博客
  • C++前置声明用法

    前置声明的目的是避免在某个 h文件中include其他头文件 取而代之的是用class struct 声明 类的前置声明就是告诉编译器有这么一个类 它的名字是XXX 甚至不需要知道它具有哪些成员 注意 这里只是声明类 没有分配空间 实例化成
  • kubernetes结合portworx

    参考网址 https docs portworx com scheduler kubernetes install html https docs portworx com scheduler kubernetes support html
  • IDEA配置JDBC

    IDEA配置JDBC 驱动下载 MySQL 首先进入MySQL官网 进入downloads 选择页面最下方 MySQL Community GPL Downloads 选择Connector J link 选择plantform indep
  • 『网络安全』蜜罐到蜜网入门指南(二)蜜罐的起源、作用及分类

    原创不易 点个赞呗 如果喜欢 欢迎随意赞赏 前言 大家好 网络安全 蜜罐到蜜网入门指南 进入第二篇 在第一篇 我们由网络安全入手 由浅入深 引出蜜罐概念 从这一篇开始 我们将主要围绕蜜罐 honeypot 密网 honeynet 继续编写后
  • 前端生成PDF文件实现方案

    一 技术选型 1 html转换成canvas后生成图片导出pdf 本文选用 html转canvas插件 html2canvas是一款将HTML代码转换成Canvas的插件 canvas生成pdf jsPDF是一个使用Javascript语言