前端利用html2canvas+jspdf实现html转pdf

2023-11-04

公司业务的月报页面,要实现pdf下载,查了资料,大概有个方向,就是利用html2canvas把html转为图片,然后再生成pdf格式的文件实现了下载。
核心代码

import html2canvas from 'html2canvas';
import JSPDF from 'jspdf';
export default {
  install(Vue, options) {
    Vue.prototype.ExportSavePdf = function(htmlTitle, currentTime) {
      document.documentElement.scrollTop = 0;
      let element = document.getElementById('pdfCentent');
      html2canvas(element, {
        logging: false,
        scale: 2
      }).then(function(canvas) {
        // let pdf = new JSPDF('p', 'mm', 'a4'); // A4纸,纵向
        // let ctx = canvas.getContext('2d');
        // let a4w = 170;
        // let a4h = 257; // A4大小,210mm x 297mm,四边各保留20mm的边距,显示区域170x257
        // let imgHeight = Math.floor((a4h * canvas.width) / a4w); // 按A4显示比例换算一页图像的像素高度
        // let renderedHeight = 0;

        // while (renderedHeight < canvas.height) {
        //   let 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;
        // }
        // pdf.save(htmlTitle);

        // 整页 2
        let contentWidth = canvas.width;
        let contentHeight = canvas.height;

        // 将canvas转为base64图片
        let pageData = canvas.toDataURL('image/jpeg', 1.0);

        // 设置pdf的尺寸,pdf要使用pt单位 已知 1pt/1px = 0.75   pt = (px/scale)* 0.75
        // 2为上面的scale 缩放了2倍
        let pdfX = ((contentWidth + 10) / 2) * 0.75;
        let pdfY = ((contentHeight + 100) / 2) * 0.75; // 500为底部留白

        // 设置内容图片的尺寸,img是pt单位
        let imgX = pdfX;
        let imgY = (contentHeight / 2) * 0.75; //内容图片这里不需要留白的距离

        // 初始化jspdf 第一个参数方向:默认''时为纵向,第二个参数设置pdf内容图片使用的长度单位为pt,第三个参数为PDF的大小,单位是pt
        let PDF = new JSPDF('', 'pt', [pdfX, pdfY]);

        // 将内容图片添加到pdf中,因为内容宽高和pdf宽高一样,就只需要一页,位置就是 0,0
        PDF.addImage(pageData, 'jpeg', 0, 0, imgX, imgY);
        PDF.save(htmlTitle);
      });
    };
  }
};

其中

document.documentElement.scrollTop = 0

解决了当页面滚动到底部的时候,下载pdf,前面页有大量空白的问题

在调用new JSPDF的时候,第三个参数为控制生成出来的PDF的宽高,如果要用A4大小的PDF,可以传a4,但是会存在分页截断的问题,代码中有两种方案分页和不分页的。

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

前端利用html2canvas+jspdf实现html转pdf 的相关文章

随机推荐

  • android平台一些网页不能正常打开的问题

    最近发现在android平台一些网页怎么也打不开 尝试更改apn设置也无效 还发现这些网页在ubuntu系统下也是打不开的 最后经过查阅和尝试解决了这个问题 在此做下记录 在linux平台proc文件系统下存在一个文件即 proc sys
  • AI 绘画基础 - 细数 Stable Diffusion 中的各种常用模型 【 魔导士装备图鉴】

    AI 绘画新手魔导士在刚开始玩 Stable Diffusion 时总会遇到各种新的概念 让人困惑 其中就包括各种模型和他们之间的关系 魔法师入门得先认识各种法师装备 各种模型 让我们遇到问题知道使用何种装备来协助自己发挥更大的效果 saf
  • SpringBoot @JsonField注解格式化日期失效

    昨天在进行登陆测试返回数据格式时 前端显示的日期都是以标准时间格式显示的 因为后端数据库定义的datetime类型 实体定义的date类型 以json格式返回给前端后 日期都格式化为标准类型 一看这个问题 就想到 JsonField注解 直
  • C与C++的函数相互调用

    无法直接调用原因 C 和 C 的函数可以相互调用 但需要一些特殊的注意事项 因为它们有不同的编译和链接规则以及一些语法差异 链接规则 C 语言的链接器通常使用 C 标准的函数命名和调用约定 而 C 链接器使用 C 的函数命名和调用约定 这意
  • c 语言private用法,举例分析private的作用(c/c++学习)

    c 中private的用处 我知道我们可以用 public 中的值 把private中的数据给提出来 但是还是搞不懂private该怎么用 或者说在一个具体程序中 private有什么用 class fun public void setn
  • HTTP协议版本检测

    HTTP 2 0在2015年就已经正式发布了 但是现在大部分网站还在使用HTTP 1 1协议 具体怎么查看网站采用的是HTTP 1 1 还是HTTP 2 0呢 本篇就介绍几种检测HTTP协议版本的方法 所有的操作都是基于Chrome浏览器
  • Week 2 Git& Github: Branch

    首先进入git目录 建议通过windows powershell操作 git branch new branch 创建一个新分支 git checkout branch 跳转到指定分支 git checkout b branchname 创
  • Spring MVC Controller传递枚举值示例

    功能描述 本文将通过一个小示例 展示在请求参数中传递枚举值 枚举定义 角色类定义 public enum RoleEnum EMPLOYEE short 1 Employee MANAGER short 2 Manager private
  • echarts前后端交互数据_前后端交互技术有哪些

    我们都知道 一个完整的IT项目是由多个不同岗位的成员共同完成 包括UI设计 前端开发 后端开发 测试等 为了实现项目的完整性 前后端需要运用技术实现联通 不过 前后端交互技术有哪些 参加郑州Web前端培训班会学吗 且看小编的分析 目前常用的
  • Java常见算法(六)【省份数量- 分组算法:深度优先、广度优先、并查集 】

    文章目录 省份数量 经典的分组算法 1 深度优先遍历 2 广度优先 3 并查集 算法 实验源码 省份数量 经典的分组算法 https www bilibili com video BV1Jv411A7Ty p 34 比如现在有三个城市 A城
  • Ai-M61/62系列的固件烧录指导

    文章目录 前言 一 软硬件的准备 二 原始硬件接线 三 烧录软件的使用 联系我们 前言 本文介绍Ai M61 62系列模组 开发板的固件烧录 一 软硬件的准备 Ai M61 62系列模组或者开发板一个 Ai M61 62烧录软件 下载链接
  • 进程和计划服务管理

    一 进程和服务 服务 是在操作系统内部活依赖网络环境运行的一种软件组件提供特定的功能或服务 服务一般在后台运行 职责包括接受请求 处理数据 执行操作 服务可以是系统自带的 也可以是基于linux开发的应用程序 服务特点 1 服务可以通过端口
  • YouTube-8M: A Large-Scale Video Classification Benchmark

    Abstract Many recent advancements in Computer Vision are attributed to large datasets Open source software packages for
  • 基于Android studio 的rpg游戏大地图的绘制

    今天开始写第一篇博客 好激动呢 衷心希望自己能坚持下去 不说闲话了 我们马上开始 最近一直在做一个基于Android studio的rpg2D角色扮演游戏 虽然说这个游戏已经烂大街了 其中的逻辑也是有了很多准确的简便的解释 不过真正做起来还
  • 【c++迭代器模拟实现】

    目录 前言 一 STL初始 二 六大组件之迭代器 迭代器初始 迭代器的模拟实现 1 victor 正向迭代器 反向迭代器1 反向迭代器2 反向迭代器3 2 list 正向迭代器 反向迭代器 总结 前言 打怪升级 第52天 一 STL初始 什
  • Oracle如何查询和中止正在运行的JOB

    今天遇到一个问题 有一个JOB会一直不停的执行 不能按照设定的间隔来执行 通过查询相关资料发现原来如此 当一个oracle job运行时返回一个error时 oracle会再次设法执行它 第一次尝试是在一分钟后 第二次是在2分钟后 第三次是
  • 代码点和代码单元的简单理解

    简单来说 代码单元就是用来表示代码点的 char数据类型就是一个采用UTF 16编码表示Unicode码点的代码单元 那代码点是什么 就是在unicode编码中的每一个符号 在特殊符号没出现之前 每个unicode代码点 字符在内 可以用一
  • 数据结构【2019年408第41题】

    1 一个N长度的链表的为了按照题目的需求 我们观察可以发现可以将一个链表从中间分开然后逆置然后依次插入则我们大致的思路如下 1 将链表分为两段 L和L2 2 将L2逆置从顺的顺序变为反过来的顺序 3 将L和L2按照 L gt L2 gt L
  • 高通LK显示屏分辨率太大,下半部分显示异常-FB buff超了的问题

    问题解决 bootable bootloader lk include dev fbcon h define LOGO IMG OFFSET 12 1024 1024 改成 define LOGO IMG OFFSET 20 1024 10
  • 前端利用html2canvas+jspdf实现html转pdf

    公司业务的月报页面 要实现pdf下载 查了资料 大概有个方向 就是利用html2canvas把html转为图片 然后再生成pdf格式的文件实现了下载 核心代码 import html2canvas from html2canvas impo