前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >页面DOM导出PDF

页面DOM导出PDF

作者头像
码客说
发布于 2020-05-09 06:59:52
发布于 2020-05-09 06:59:52
2.8K00
代码可运行
举报
文章被收录于专栏:码客码客
运行总次数:0
代码可运行

页面DOM导出PDF

Nginx设置允许跨域

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location /static {
	add_header 'Access-Control-Allow-Origin' '*';
	add_header 'Access-Control-Allow-Credentials' 'true';
	index index.html;
	root  /data/wwwjarapi/8905xhkjfileapitest/;   
}

也就是在location下添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';

添加模块引用

第一个将页面html转换成图片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install html2canvas --save

第二个将图片生成pdf

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install jspdf --save

未使用VUE

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* eslint-disable */
import html2canvas from 'html2canvas';
import JsPDF from 'jspdf';

/**
 * @param  ele          要生成 pdf 的DOM元素(容器)
 * @param  padfName     PDF文件生成后的文件名字
 * */
function downloadPDF(ele, pdfName){
  document.documentElement.scrollTop = 0;
  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;
    //未生成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 = new JsPDF('', 'pt', 'a4');
    //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
    //当内容未超过pdf一页显示的范围,无需分页
    if (leftHeight < pageHeight) {
      //在pdf.addImage(pageData, 'JPEG', 左,上,宽度,高度)设置在pdf中显示;
      pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight);
    } else {    // 分页
      while(leftHeight > 0) {
        pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight);
        leftHeight -= pageHeight;
        position -= 841.89;
        //避免添加空白页
        if(leftHeight > 0) {
          pdf.addPage();
        }
      }
    }
    //可动态生成
    pdf.save(pdfName);
  })
}
export default {
  downloadPDF
}

注意 document.documentElement.scrollTop = 0; 是为了解决外层页面滚动时获取的canvas偏移的问题

引用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import htmlToPdf from "@/assets/js/htmlToPdf";

调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
htmlToPdf.downloadPDF(
  document.querySelector("#myexport"),
  "小明的试卷"
);

使用VUE

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'

export default{
  install (Vue, options) {
    Vue.prototype.getPdf = function (id,title) {
      document.documentElement.scrollTop = 0;
      html2Canvas(document.querySelector(`#${id}`), {
        // allowTaint: true
        useCORS:true//看情况选用上面还是下面的,
      }).then(function (canvas) {
            let contentWidth = canvas.width
            let contentHeight = canvas.height
            let pageHeight = contentWidth / 592.28 * 841.89
            let leftHeight = contentHeight
            let position = 0
            let imgWidth = 595.28
            let imgHeight = 592.28 / contentWidth * contentHeight
            let pageData = canvas.toDataURL('image/jpeg', 1.0)
            let PDF = new JsPDF('', 'pt', 'a4')
            if (leftHeight < pageHeight) {
                PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
            } else {
            	while (leftHeight > 0) {
                  PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
                  leftHeight -= pageHeight
                  position -= 841.89
                  if (leftHeight > 0) {
                      PDF.addPage()
                  }
              }
            }
            PDF.save(title + '.pdf')
        }
      )
    }
  }
}

main.js文件中添加如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import htmlToPdf from '@/utils/htmlToPdf'
Vue.use(htmlToPdf)

然后就可以在要导出pdf文件组件里面添加 如下 代码即可导出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.getPdf('resumeId',name)

Canvas转图片下载

也可以使用html2canvas获取canvas后 转为图片下载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let url = canvas.toDataURL("image/png");
var oA = document.createElement("a");
oA.download = '';// 设置下载的文件名,默认是'下载'
oA.href = url;
document.body.appendChild(oA);
oA.click();
oA.remove(); // 下载之后把创建的元素删除
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java Mail---SMTP协议-Java发邮件(带附件)演示过程
邮件客户端的主要任务是向邮件服务器发送邮件,以及接收来自邮件服务器的邮件。 Sun公司制定了一套API,它封装了邮件通信的各种协议。为Java开发者提供了收发电子邮件的公共接口。
谙忆
2021/01/21
2.3K0
Java Mail---SMTP协议-Java发邮件(带附件)演示过程
java实现发送邮件功能
电子邮件开发在后台中是普遍存在的现象和功能,比如用户注册,系统自动发送一封电子邮件到用户邮箱;再比如密码找回,系统会自动把密码发送到用户邮箱;…等等,所以作为一名java程序员,还是有必要学会这项技能的。
全栈程序员站长
2022/08/27
9730
java实现发送邮件功能
Java发送邮件案例
在日常开发中,有时会遇到向用户发送邮件的场景,例如发送注册验证码(现在基本都是发手机验证码了)、邀请链接,有时也会遇到发送带附件的邮件等业务场景。本案例以Java发送邮件为例对这些功能做一整理,希望能够对大家有所帮助。
小诸葛
2020/04/14
1.2K0
Java发送邮件案例
【Java专题_03】使用springboot发送邮件
1、以我自己的项目工程图为例(随便创建 一个sprinboot项目即可) 在pox.xml中添加依赖
夏之以寒
2024/03/04
1320
【Java专题_03】使用springboot发送邮件
Java Mail(二):JavaMail介绍及发送一封简单邮件
JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP、POP3、IMAP,开发人员使用JavaMail编写邮件程序时,无需考虑底层的通信细节(Socket),JavaMail也提供了能够创建出各种复杂MIME格式的邮件内容的API。使用JavaMail,我们可以实现类似OutLook、FoxMail的软件。虽然JavaMail(仅支持JDK4及以上)也是Java的API之一,但是却没有直接加入到JDK中,所以我们需要另
高爽
2018/01/15
1.7K0
Java Mail(二):JavaMail介绍及发送一封简单邮件
Java实现163网易邮箱消息发送
jar包依赖进去搜索名称下载 https://mvnrepository.com/
杨不易呀
2022/01/19
1.1K0
Java实现163网易邮箱消息发送
基于SMTP协议的邮件发送功能JavaEE实现
本博客介绍基于SSM框架(Spring4.0+SpringMVC+Mybatis)组合的Javamail应用,邮箱的话基于腾讯的QQ邮箱,其实也是Foxmail邮箱
SmileNicky
2019/01/17
7550
Java Mail(三):Session、Message详解
上篇文章介绍了JavaMail并实现了一个发送邮件的简单示例,JavaMail API使用上非常灵活,比如,服务器信息可以设置到Session中,也可以设置到Transport中,收件人可以设置到Message中,也可以设置到Transport中,如何使用,取决于我们应用程序中的实际情况。本文详细的介绍一下这三个类的主要方法。 Session        Session用于收集JavaMail运行过程中的环境信息,它可以创建一个单例的对象,也可以每次创建新的对象,Session没有构造器,只能通过如
高爽
2018/01/15
1K0
Java Mail(三):Session、Message详解
java实现阿里企业邮箱以及谷歌邮箱邮件的发送
fromUserName=邮箱的用户名 fromUserPassword=你的密码
故久
2020/04/24
2.2K0
java实现阿里企业邮箱以及谷歌邮箱邮件的发送
QQ授权,接收代码发送的电子邮件
1.代码(两处修改自己的QQ+授权码),授权码开启权限后获取 package com.itqf.Utils; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.net.Inet4Address; import java.util.Properties;
2020/10/23
1.7K0
QQ授权,接收代码发送的电子邮件
javaMail发送邮件随笔
1:javax.mail.NoSuchProviderException: No provider for smpt
一觉睡到小时候
2019/07/03
7450
javaMail发送邮件随笔
Java邮件发送详解
这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
全栈程序员站长
2022/08/28
1.3K0
Java邮件发送详解
SpringBoot 2.0 集成 JavaMail ,实现异步发送邮件
(1)、Message 类: javax.mail.Message 类是创建和解析邮件的一个抽象类 子类javax.mail.internet.MimeMessage :表示一份电子邮件。 发送邮件时,首先创建出封装了邮件数据的 Message 对象, 然后把这个对象传递给邮件发送Transport 类,执行发送。 接收邮件时,把接收到的邮件数据封装在Message 类的实例中,从这个对象中解析收到的邮件数据。
知了一笑
2019/07/19
1.9K0
利用java实现发送邮件
电子邮件的应用非常广泛,常见的如在某网站注册了一个账户,自动发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。很显然这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。
全栈程序员站长
2022/08/28
1.5K0
利用java实现发送邮件
公司内部邮箱服务器发送邮件 java版
由于需要给合作方以压缩包的形式每天返回数据,基于我们自己写的分布式程序,而月末通过返回的数据,来与合作方进行对账,所以每天数据返回的成败就至关重要了,但又懒得每天去查看日志,刚好借助一下公司内部的邮件服务器。
shengjk1
2018/10/24
2.1K0
Java发送邮件(含附件)
前几天写了一个Java发送邮件的帮助类i,可以发送QQ和163的邮箱,也可以发送附件,写个一个主要的方法,其他的可以自己封装。代码如下:
付威
2020/01/21
1.6K0
Java常用工具类之发送邮件
package com.csice.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingE
二十三年蝉
2018/02/28
1.5K0
Java实现邮件发送
QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)
全栈程序员站长
2022/08/27
9920
Java实现邮件发送
JavaMail-发送一封简单邮件(附带附件)
以上的工具类有个进行了重载的方法,因为对于没有附件的邮件和有附件的邮件,在构造邮件对象时是不一样的,有附件的邮件会稍微复杂一点。接着是测试类。
雨临Lewis
2022/01/11
4720
【Email】Java发送邮件接口与配置类
可能最近写博客时间不会很多,最近又在搞一个项目了。 发送邮件的类,我以前写过,不过写的不是接口封装的,现在自己项目用到了,就重新写了一下,现在把它分享出来给大家。
谙忆
2021/01/21
6800
【Email】Java发送邮件接口与配置类
相关推荐
Java Mail---SMTP协议-Java发邮件(带附件)演示过程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验