结合html2canvasjsPDF实现html页面转pdf

 

By:授客 QQ103355122

 

实践环境

win10

 

Vue 2.9.6

axios 0.18.0

 

html2canvas 1.0.0-rc.3

jspdf 1.5.3

安装 html2canvas

进入vue项目所在目录,然后执行以下安装命令

cd /d E:\MyProjects\TMP\frontend

E:\MyProjects\TMP\frontend>npm install html2canvas

安装jspdf

进入vue项目所在目录,然后执行以下安装命令

cd /d E:\MyProjects\TMP\frontend

E:\MyProjects\TMP\frontend>npm install jspdf

编写htmlToPdf.js

htmlToPdf.js文件路径,例中为src/common/utils/htmlToPdf.js

import html2canvas from "html2canvas"

import JsPD Ffrom "jspdf"

/**

* @param ele要生成 pdf 的DOM元素(容器)

* @param padfName     PDF文件生成后的文件名字

* */

export default {

install(Vue, options) {

Vue.prototype.getPdfFromHtml = function(ele, pdfFileName) {

let eleW = ele.offsetWidth// 获得该容器的宽

//   let eleH = ele.offsetHeight // 获得该容器的高

let eleH = ele.scrollHeight// 获得该容器的高

let eleOffsetTop = ele.offsetTop// 获得该容器到文档顶部的距离

let eleOffsetLeft = ele.offsetLeft// 获得该容器到文档最左的距离

var canvas = document.createElement("canvas")

var abs = 0

let win_in = document.documentElement.clientWidth ||         document.body.clientWidth// 获得当前可视窗口的宽度(不包含滚动条)

let win_out = window.innerWidth// 获得当前窗口的宽度(包含滚动条)

if (win_out>win_in) {

// abs = (win_o - win_i)/2;    // 获得滚动条长度的一半

abs = (win_out - win_in) / 2// 获得滚动条宽度的一半

}

canvas.width = eleW * 2// 将画布宽&&高放大两倍

canvas.height = eleH * 2

var context = canvas.getContext("2d")

context.scale(2, 2) // 增强图片清晰度

context.translate(-eleOffsetLeft - abs, -eleOffsetTop)

html2canvas(ele, {

dpi:300,

useCORS:true//允许canvas画布内可以跨域请求外部链接图片, 允许跨域请求。

}).then(canvas=> {

var contentWidth = canvas.width

var contentHeight = canvas.height

//一页pdf显示html页面生成的canvas高度;

var pageHeight = (contentWidth / 592.28) * 841.89 // 这样写的目的在于保持宽高比例一致 pageHeight/canvas.width = a4纸高度/a4纸宽度// 宽度和canvas.width保持一致

//未生成pdf的html页面高度

var leftHeight = contentHeight

//页面偏移

var position = 0

//a4纸的尺寸[595.28,841.89],单位像素,html页面生成的canvas在pdf中图片的宽高

var imgWidth = 595.28

var imgHeight = (595.28 / contentWidth) * contentHeight

var pageData = canvas.toDataURL("image/jpeg", 1.0)

var pdf = newJsPDF("", "pt", "a4")

//有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)

//当内容未超过pdf一页显示的范围,无需分页

if (leftHeight<pageHeight) {

//在pdf.addImage(pageData, 'JPEG', 左,上,宽度,高度)设置在pdf中显示;

pdf.addImage(pageData, "JPEG", 5, 0, imgWidth, imgHeight)

// pdf.addImage(pageData, 'JPEG', 20, 40, imgWidth, imgHeight);

} else {

// 分页

while (leftHeight>0) {

pdf.addImage(pageData, "JPEG", 5, position, imgWidth, imgHeight)

leftHeight -= pageHeight

position -= 841.89

//避免添加空白页

if (leftHeight>0) {

pdf.addPage()

}

}

}

pdf.save(pdfFileName + ".pdf")

})

}

}

}

修改main.js

如下,main.js中增加以下代码

import htmlToPdf from "@/common/utils/htmlToPdf"

Vue.use(htmlToPdf)

.vue组件中使用

对应代码片段

<template>

...略

<el-button size="mini" type="primary" @click="downloadSprintTestReport">下载报告  </el-button>

...略

<!-- 迭代测试报告 -->

<div class="sprint-test-report-content" v-if = "showReport"  ref="sprintReport">

<!-- 标题 -->

...略

</template>

<script>

...略

exportdefault {

...略

methods: {

...略

// 下载报告

downloadSprintTestReport() {

this.getPdfFromHtml(this.$refs.sprintReport, this.reportInfo.title)

...略

</script>

下载结果展示

存在问题

只能获取浏览器可视区域的内容,类似截图,默认情况下,依赖翻页的些数据都无法直接获取到

参考链接

http://html2canvas.hertzen.com/getting-started

https://github.com/MrRio/jsPDF

http://html2canvas.hertzen.com/configuration/

https://www.w3school.com.cn/tags/canvas_translate.asp

https://www.w3school.com.cn/tags/canvas_scale.asp

Vue 结合html2canvas和jsPDF实现html页面转pdf的更多相关文章

  1. Javascript将html转成pdf,下载(html2canvas 和 jsPDF)

    最近碰到个需求,需要把当前页面生成pdf,并下载.弄了几天,自己整理整理,记录下来,我觉得应该会有人需要 :) 项目源码地址:https://github.com/linwalker/render-h ...

  2. JS - 使用 html2canvas 将页面转PDF

    JS - 使用 html2canvas 将页面转PDF 本方法可以将页面元素块转为pdf. 网站地址 jspdf.js 官网地址:http://jspdf.com GitHub 主页:https:// ...

  3. vue.js 作一个用户表添加页面----初级

    使用vue.js 制作一个用户表添加页面,实际上是把原来需要使用js写的部分,改写成vue.js的格式 首先,想象一下,先做思考,我们要添加用户表,设涉及到哪些数据,一个是用户id,一个是用户名,一个 ...

  4. 设置vue启动项目后默认显示的页面

    通过配置路由,可以设置vue项目启动后默认显示的页面.路由的path设置为path:"/",启动项目后就会显示默认的组件页面. import Vue from 'vue' impo ...

  5. vue路由跳转取消上个页面的请求和去掉重复请求

    vue路由跳转取消上个页面的请求和去掉重复请求 axios 的二次封装(拦截重复请求.异常统一处理) axios里面拦截重复请求

  6. vue 通过 name 和 params 进行调整页面传参刷新参数丢失问题&vue路由可选参数

    vue  通过 name 和 params 进行调整页面传参刷新参数丢失问题 router.js: export default new Router({ routes: [ { path: '/', ...

  7. VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题

    VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题:https://blog.csdn.net/jerrica/article/d ...

  8. Vue 实现动态路由及登录&404页面跳转控制&页面刷新空白解决方案

    Vue实现动态路由及登录&404页面跳转控制&页面刷新空白解决方案   by:授客 QQ:1033553122   开发环境   Win 10   Vue 2.9.6   node-v ...

  9. vue修改对象的属性值后页面不重新渲染

    原文地址:vue修改对象的属性值后页面不重新渲染 最近项目在使用vue,遇到几次修改了对象的属性后,页面并不重新渲染,场景如下: HTML页面如下: [html] view plain copy &l ...

  10. vue 实现页面嵌套pdf之vue-pdf插件

    近期vue移动端项目中遇到了页面内,嵌套展示pdf内容.实现方法很多种,可以用iframe嵌套,但不利于引擎优化seo.所以在网上找到了vue-pdf这个插件,这个插件非常好用,其中封装的方法也很多, ...

随机推荐

  1. Redis知识网络

    Redis知识网络 作者:运维君莫笑 链接:https://www.zhihu.com/question/470465324/answer/2006650219 Redis为什么这么快? 根据官方数据 ...

  2. kubernetes的三种探针startupprobe,ReadinessProbe,LivenessProbe记录

    kubernetes的三种探针 startupprobe: k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动,如果配置了startuprobe,就会先禁用其他的探测,直到它成功为 ...

  3. 获得centos7网络yum源

    获得centos73网络yum源 wget http://mirrors.163.com/.help/CentOS7-Base-163.repo 网易 wget -O /etc/yum.repos.d ...

  4. 【Java】JVM字节码分析

    一.功能 1.工作原理 2.解释和运行 jvm本质上是运行在计算机上的程序,负责运行java字节码文件 对字节码文件中的指令,实时的解释成机器码,供计算机执行 3.内存管理 自动为对象.方法等分配内存 ...

  5. Cage 字符串听课笔记

    困困困! KMP 注意到 KMP 的复杂度是均摊的,那么是否可以绕开? 注意到 KMP 实际上一个串的 ACAM,那么考虑可以类似的,在加入一个字符的同时维护 ACAM(考虑 ACAM 的构建过程,前 ...

  6. Java 对象转Map,Java Map转对象方法

    Java 对象转Map,Java Map转对象方法 import com.alibaba.fastjson.JSON; import org.apache.commons.beanutils.Bean ...

  7. CNN --入门MNIST识别

    Smiling & Weeping ---- 下次你撑伞低头看水洼, 就会想起我说雨是神的烟花. 简介:主要是看刘二大人的视频讲解:https://www.bilibili.com/video ...

  8. 硬件开发笔记(十九):Altium Designer 21软件介绍和安装过程

    前言   AD硬件设计软件之一,前面说了allego,但是allego对项目的管理.原理图生成PCB,PCB反向原理图等方面比较复杂,对于一般的硬件(非多个高速电路),选择AD能够加大的节省开发工作量 ...

  9. 硬件开发笔记(二十一):外部搜索不到的元器件封装可尝试使用AD21软件的“ManufacturerPart Search”功能

    前言   这是一个AD的一个强大的新功能,能招到元器件的原理图.3D模型还有价格厂家,但是不一定都有,有了也不一定有其3D模型. ManufacturerPart Search 在设计工具中选择即用型 ...

  10. 实验12.dhcp服务器实验

    实验12.dhcp服务器实验 测试DHCP服务的可用性 实验组 交换机配置 R1 interface GigabitEthernet0/0/0 ip address 192.168.1.1 255.2 ...