结合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. Android 13 - Media框架(6)- NuPlayer

    关注公众号免费阅读全文,进入音视频开发技术分享群! 上一节我们通过 NuPlayerDriver 了解了 NuPlayer 的使用方式,这一节我们一起来学习 NuPlayer 的部分实现细节. ps: ...

  2. WPF显示网络图片的几种方法

    1.利用数据流 1 Image img; 2 byte[] btyarray = GetImageFromResponse(imageUrl); 3 4 //字节数据转流 5 MemoryStream ...

  3. WPF加载GIF的五种方式(Storyboard / WpfAnimatedGif / ImageAnimator / PictureBox / MediaElement)

    部分内容参考博文WPF 如何显示gif 一.使用Storyboard 效果: (1)页面xaml: <Window x:Class="PlayGifDemo.StoryboardWin ...

  4. LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战

    LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战 0.前言 **Modelscope **是一个交互式智能体应用基于ModelScope-Agent ...

  5. Linux下docker安装部署

    Linux下docker安装部署 环境说明 该文档安装环境为CentOS Linux release 7.9.2009,内核版本为3.10.0-1160.81.1.el7.x86_64 安装说明 安装 ...

  6. UILabel的DrawDrect方法

    一.问题 如果继承UILabel实现自己的一个Label,并且在子类的DrawRect方法中留空,什么都不写,会发生什么? 代码如下: VC @interface ViewController () ...

  7. BGP中next-hop-self 小实验

    next-hop-self 在EBGP和IBGP边界使用,对ibgp下一跳邻居使用 配置命令 router bgp 1234 neighbor 2.2.2.2 next-hop-self 使用Next ...

  8. Android Studio 编译报错:download fastutil-7.2.0.jar

    引用:https://www.cnblogs.com/caoxinyu/p/10568462.html build.gradle 可能有多个,一般在app 节点,默认里面不包含buildscript, ...

  9. 欢迎 Stable Diffusion 3 加入 🧨 Diffusers

    作为 Stability AI 的 Stable Diffusion 家族最新的模型,Stable Diffusion 3 (SD3) 现已登陆 Hugging Face Hub,并且可用在 Diff ...

  10. IT运维全面数字化|芯片设计行业领跑打造运维流程闭环

    在当今数字化转型的浪潮中,科技行业正经历着前所未有的变革.随着5G.人工智能.物联网等新兴技术的快速发展,企业对于高效.智能的运营模式的需求日益迫切. 芯片设计公司作为科技产业链中的关键一环,不仅要在 ...