在做web项目中,有时候会遇到pdf导出的需求,现根据之前在公司的React项目中遇到的导出PDF需求,整理一个demo出来。

导出PDF需要用到两个依赖包:html2canvas、jspdf

1、安装html2canvas和jspdf

npm install html2canvas -S / yarn add html2canvas -S

npm install jspdf -S / yarn add jspdf -S

2、把导出PDF封装成一个公共方法

1、在src/common目录下新建exportPDF.js文件

exportPDF.js:

import html2canvas from 'html2canvas';
import jsPDF from 'jspdf'; /**
* 导出PDF
* @param {导出后的文件名} title
* @param {要导出的dom节点:react使用ref} ele
*/
export const exportPDF = async (title, ele) => {
// 根据dpi放大,防止图片模糊
const scale = window.devicePixelRatio > 1 ? window.devicePixelRatio : 2;
// 下载尺寸 a4 纸 比例
let pdf = new jsPDF('p', 'pt', 'a4');
let width = ele.offsetWidth;
let height = ele.offsetHeight;
console.log('height', height)
console.log('aa', width, height, scale) const canvas = document.createElement('canvas');
canvas.width = width * scale;
canvas.height = height * scale;
var contentWidth = canvas.width;
var contentHeight = canvas.height; console.log('contentWidth', contentWidth, contentHeight)
//一页pdf显示html页面生成的canvas高度;
var pageHeight = contentWidth / 592.28 * 841.89;
//未生成pdf的html页面高度
var leftHeight = contentHeight;
console.log('leftHeight', leftHeight)
//页面偏移
var position = 0;
//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
var imgWidth = 595.28;
var imgHeight = 592.28 / contentWidth * contentHeight;
const pdfCanvas = await html2canvas(ele, {
useCORS: true,
canvas,
scale,
width,
height,
x: 0,
y: 0,
});
const imgDataUrl = pdfCanvas.toDataURL(); if (height > 14400) { // 超出jspdf高度限制时
const ratio = 14400 / height;
// height = 14400;
width = width * ratio;
} // 缩放为 a4 大小 pdfpdf.internal.pageSize 获取当前pdf设定的宽高
height = height * pdf.internal.pageSize.getWidth() / width;
width = pdf.internal.pageSize.getWidth();
if (leftHeight < pageHeight) {
pdf.addImage(imgDataUrl, 'png', 0, 0, imgWidth, imgHeight);
} else { // 分页
while (leftHeight > 0) {
pdf.addImage(imgDataUrl, 'png', 0, position, imgWidth, imgHeight)
leftHeight -= pageHeight;
position -= 841.89;
//避免添加空白页
if (leftHeight > 0) {
pdf.addPage();
}
}
}
// 导出下载
await pdf.save(`${title}.pdf`);
}

3、在react组件中使用导出方法

在Article组件中使用导出功能

3.1、Article.jsx组件的代码:

import React, { Component } from 'react';
import { Button } from 'antd';
import { exportPDF } from '@/common/exportPdf';
import img1 from '@/assets/img/bg.jpg'; /**
* 文章
*/
class Article extends Component {
constructor(props) {
super(props);
this.pdfRef = React.createRef();
} // 点击导出PDF
onExportPDF = () => {
exportPDF('测试导出PDF', this.pdfRef.current)
} render() {
return (
<div className="main-container" style={{ background: '#fff' }}>
<div style={{ textAlign: 'center' }}>
<Button type="primary" onClick={this.onExportPDF}>导出PDF</Button>
</div>
<div ref={this.pdfRef} style={{ width: 800, padding: 30, boxSizing: 'border-box', margin: '0 auto', lineHeight: '30px', fontSize: 14 }}>
<img src={img1} alt="" style={{ width: '100%' }} />
<h2>aaa</h2>
<div>
据中国商飞公司消息,昨天(5月14日)早上6时52分,一架编号为B-001J的C919大飞机从浦东机场第4跑道起飞,于9时54分安全降落,标志着中国商飞公司即将交付首家用户的首架C919大飞机首次飞行试验圆满完成。
在3小时2分钟的飞行中,试飞员与试飞工程师协调配合,完成了预定的各项任务,飞机状态及性能良好。目前,C919大飞机试飞取证和交付准备工作正在有序推进。
首家用户、首架飞机、首次飞行,这些令人兴奋的关键性字眼,预示着国产大飞机C919在首飞五年之后,即将迎来交付商业用户的历史性时刻。机身上的编号也表明,这不再是一架用于验证飞行的原型机,而是即将交付的1号机。虽然这架试飞飞机的机身依然是中国商飞公司的涂装,但在正式交付前,会换上首家用户中国东方航空的喷漆。
航空圈内传播的视频显示,在此次试飞前6天,也就是5月8日,这架东航首架C919飞机已经在上海浦东机场第五跑道进行了低、中速滑行试验,完成了飞机燃油、液压系统和刹车功能检查等项目。
国产大飞机距离正式交付已经只有一步之遥了。中国人坐上自己设计生产的大型客机的梦想,在今年或将得以实现。
前不久,在上海的抗疫保卫战中,突发疾病去世的志愿者孟庆功,就是中国商飞的型号副总设计师,同时也是中国商飞复合材料中心副主任。国产C919首架交付机的首次试飞成功的消息,想必也是对他在天之灵最好的告慰了。
自那之后,国人就一直在关注着国产大飞机的进展,期盼着定型交付,进入市场运营那天能早日到来。
但研发一款具有国际主流水准的大型客机并非是一蹴而就的事情,即便是对于波音、空客这样的国际航空巨头来说,依然要经过复杂的流程,更何况中国在这方面的经验还几乎就是一张白纸。
从首飞到交付的速度快慢,和机型成熟度以及创新程度也都有关系。在这一方面,作为中国商飞的竞争对手,波音和空客显然经验更足。以空客A320举例,其首飞到交付仅相距1年多的时间,但这也是在空客拥有A300和A310两款机型成功研发的基础之上才达成的。
虽然2017年到2018年间,C919的试飞工作进行不多。但从2018年年中开始,C919整体的取证试飞工作已经加快,并开始展开密集的飞行测试。自2019年起,6架C919在上海、阎良、东营、南昌等地进行飞行试验,开展了一系列地面试验和飞行试验。2020年11月,C919获型号检查核准书(TIA),全面进入局方审定试飞阶段。
除了试飞取证,C919也先后在2020-2021的两届南昌飞行大会上公开亮相,其中一届还进行了飞行表演。
就研制进度而言,民用飞机主要会经历立项、设计、样机制造、试飞、适航审定、小批量交付和批量生产这几个阶段,而C919项目正处于适航审定阶段,简单来说,就是通过各种试验,判断飞机能否正常航行,如果通过验证,就能拿到适航证,进而转入产业化阶段。
在2022年上海两会期间,中国商用飞机有限责任公司副总经理、总会计师吴永良曾表示,国产C919项目仍处于适航取证阶段,预计将于2022年完成交付,具体的交付将等到取证完成后才具备条件。
其实,在去年的9月,民航华东局就发布消息,东方航空首架C919进入总装阶段。当时华东局副局长吕新明提到,C919批生产首架机是在型号合格审定工作尚未完成之前开展生产许可审定工作。这也是民航局顺应国产民机发展的需要和提升国产民机竞争力的重要举措。
“2022年,大飞机项目将由研制阶段逐步转入产业化阶段。”今年2月7日,中国商飞董事长贺东风在干部大会上表示。
如今,即将交付首家用户的首架C919大飞机首次飞行试验圆满完成,离取证完成从而实现交付的时间表又顺利迈进了一步。
C919国内单价不到1亿美元
国务院发布的《“十四五”现代综合交通运输体系发展规划》指出,我国将重点推动C919大型客机示范运营和ARJ21支线客机系列化发展。
2021年3月1日,中国东方航空作为国产大飞机C919全球首家启动用户,与中国商飞公司在上海签署了C919大型客机购机合同。当时公布首批引进5架,东航也将成为全球首家运营C919大型客机的航空公司。2020年,东航下属一二三航空开始运营国产ARJ21飞机。
</div>
<h2>bbb</h2>
<div>
据中国商飞公司消息,昨天(5月14日)早上6时52分,一架编号为B-001J的C919大飞机从浦东机场第4跑道起飞,于9时54分安全降落,标志着中国商飞公司即将交付首家用户的首架C919大飞机首次飞行试验圆满完成。
在3小时2分钟的飞行中,试飞员与试飞工程师协调配合,完成了预定的各项任务,飞机状态及性能良好。目前,C919大飞机试飞取证和交付准备工作正在有序推进。
首家用户、首架飞机、首次飞行,这些令人兴奋的关键性字眼,预示着国产大飞机C919在首飞五年之后,即将迎来交付商业用户的历史性时刻。机身上的编号也表明,这不再是一架用于验证飞行的原型机,而是即将交付的1号机。虽然这架试飞飞机的机身依然是中国商飞公司的涂装,但在正式交付前,会换上首家用户中国东方航空的喷漆。
航空圈内传播的视频显示,在此次试飞前6天,也就是5月8日,这架东航首架C919飞机已经在上海浦东机场第五跑道进行了低、中速滑行试验,完成了飞机燃油、液压系统和刹车功能检查等项目。
国产大飞机距离正式交付已经只有一步之遥了。中国人坐上自己设计生产的大型客机的梦想,在今年或将得以实现。
前不久,在上海的抗疫保卫战中,突发疾病去世的志愿者孟庆功,就是中国商飞的型号副总设计师,同时也是中国商飞复合材料中心副主任。国产C919首架交付机的首次试飞成功的消息,想必也是对他在天之灵最好的告慰了。
自那之后,国人就一直在关注着国产大飞机的进展,期盼着定型交付,进入市场运营那天能早日到来。
但研发一款具有国际主流水准的大型客机并非是一蹴而就的事情,即便是对于波音、空客这样的国际航空巨头来说,依然要经过复杂的流程,更何况中国在这方面的经验还几乎就是一张白纸。
从首飞到交付的速度快慢,和机型成熟度以及创新程度也都有关系。在这一方面,作为中国商飞的竞争对手,波音和空客显然经验更足。以空客A320举例,其首飞到交付仅相距1年多的时间,但这也是在空客拥有A300和A310两款机型成功研发的基础之上才达成的。
虽然2017年到2018年间,C919的试飞工作进行不多。但从2018年年中开始,C919整体的取证试飞工作已经加快,并开始展开密集的飞行测试。自2019年起,6架C919在上海、阎良、东营、南昌等地进行飞行试验,开展了一系列地面试验和飞行试验。2020年11月,C919获型号检查核准书(TIA),全面进入局方审定试飞阶段。
除了试飞取证,C919也先后在2020-2021的两届南昌飞行大会上公开亮相,其中一届还进行了飞行表演。
就研制进度而言,民用飞机主要会经历立项、设计、样机制造、试飞、适航审定、小批量交付和批量生产这几个阶段,而C919项目正处于适航审定阶段,简单来说,就是通过各种试验,判断飞机能否正常航行,如果通过验证,就能拿到适航证,进而转入产业化阶段。
在2022年上海两会期间,中国商用飞机有限责任公司副总经理、总会计师吴永良曾表示,国产C919项目仍处于适航取证阶段,预计将于2022年完成交付,具体的交付将等到取证完成后才具备条件。
其实,在去年的9月,民航华东局就发布消息,东方航空首架C919进入总装阶段。当时华东局副局长吕新明提到,C919批生产首架机是在型号合格审定工作尚未完成之前开展生产许可审定工作。这也是民航局顺应国产民机发展的需要和提升国产民机竞争力的重要举措。
“2022年,大飞机项目将由研制阶段逐步转入产业化阶段。”今年2月7日,中国商飞董事长贺东风在干部大会上表示。
如今,即将交付首家用户的首架C919大飞机首次飞行试验圆满完成,离取证完成从而实现交付的时间表又顺利迈进了一步。
C919国内单价不到1亿美元
国务院发布的《“十四五”现代综合交通运输体系发展规划》指出,我国将重点推动C919大型客机示范运营和ARJ21支线客机系列化发展。
2021年3月1日,中国东方航空作为国产大飞机C919全球首家启动用户,与中国商飞公司在上海签署了C919大型客机购机合同。当时公布首批引进5架,东航也将成为全球首家运营C919大型客机的航空公司。2020年,东航下属一二三航空开始运营国产ARJ21飞机。
</div>
</div>
</div > );
}
} export default Article;

3.2、Article.jsx组件

4、导出效果

React项目实现导出PDF的功能的更多相关文章

  1. vue项目中导出PDF的两种方式

    参考大家导出的方式,基本上是如下两种: 1.使用 html2Canvas + jsPDF 导出PDF, 这种方式什么都好,就是下载的pdf太模糊了.对要求好的pdf这种方式真是不行啊! 2.调用浏览器 ...

  2. vue项目中导出Excel文件功能的前端代码实现

    在项目中遇到了两种不同情况, 1.get请求导出文件,实现起来相对简单 // 导出数据 exportData() { window.location.href = `/oes-content-mana ...

  3. 个人永久性免费-Excel催化剂功能第50波-批量打印、导出PDF、双面打印功能

    在倡导无纸化办公的今天,是否打印是一个碍眼的功能呢,某些时候的确是,但对于数据的留存,在现在鼓吹区块链技术的今天,仍然不失它的核心价值,数据报表.单据打印出来留存,仍然是一种不可或缺的数据存档和防篡改 ...

  4. JS导出PDF插件(支持中文、图片使用路径)

    在WEB上想做一个导出PDF的功能,发现jsPDF比较多人推荐,遗憾的是不支持中文,最后找到pdfmake,很好地解决了此问题.它的效果可以先到http://pdfmake.org/playgroun ...

  5. 使用itext导出pdf

    导出pdf这个功能是在工作中遇到的,写这个功能的时候遇到了不少的问题,比如中文乱码,不显示的问题,这些问题在我不断的测试,研究后都一一解决了. 第一步,先导入所需要的jar包 第一个jar包是用于解决 ...

  6. HTML页面导出PDF——高清版

    需要做一个导出PDF的功能,网上找有很多,但是一般导出来的都是比较模糊的那种,下面这个是高清版的,导出的PDF都是几M,跟正常手动导出的差不多,很清晰. 首先用到的JS有: <script ty ...

  7. iText导出PDF(图片,水印,页眉,页脚)

    项目需要导出PDF,导出的内容包含图片和文本,而且图片的数量不确定,在网上百度发现大家都在用iText,在官网发现可以把html转换为PDF,但是需要收费,那就只能自己写了. 在开始之前先在网上百度了 ...

  8. 导出pdf功能

    本程序下载地址: PDF是我们极其常用的文件格式,但对如何生成PDF,个人一直觉得很神秘,其实利用一些公开的PDF库,我们就可以直接生成PDF文件,而不用关注PDF文件的内部细节.我知道的PDF库有如 ...

  9. React+后端实现导出Excle表格的功能

    最近在做一个基于React+antd前端框架的Excel导出功能,我主要在后端做了处理,根据以下步骤,可以很容易就实现导出Excel表格数据的功能. 在做这类导出文件的功能,其实,在后端进行处理,会更 ...

随机推荐

  1. 【Unity原神AR开发实战 2022】下载原神模型,PMX转FBX,导入到Unity,AR设置,测试应用程序,生成应用程序

    文章目录 一.前言 二.模型下载 1.官网下载 2.模之屋官方下载 3.第三方链接 三.pmx转fbx 1.Blender插件CATS的下载与安装 2.pmx模型的导入 四.Unity开发部分 1.V ...

  2. Python入门-pip模块管理工具

    安装 # 在线安装 pip install <包名> 安装后,该模块文件会在安装python环境目录:lib/packages目录下 # 安装本地安装包 pip install <目 ...

  3. python---两个栈实现一个队列

    class Solution: """两个栈实现一个队列""" def __init__(self): # 接收栈 self.accept_ ...

  4. Struts2-拦截器原理

    拦截器原理包含Aop思想和责任链模式 1.Aop思想 aop是面向切面编程,有基本功能,扩展功能,不通过修改源代码方式扩展功能.(动态代理) 2.责任链模式,Java有23种设计模式,责任链模式是其中 ...

  5. Java学习day12

    Set集合特点:不能包含重复的元素:没有所有的方法,不能通过普通的for循环遍历集合 哈希值是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值,同一个对象多次调用hashCode()方法 ...

  6. Java学习day42

    继续刷力扣题

  7. Java学习day27

    今天跟着做了一个模拟龟兔赛跑的程序 只有一条赛道,乌龟和兔子在同一条赛道上比赛,使用了多线程 为了实现兔子睡觉,在run方法内增加了当前奔跑者是否是兔子的判断且当前奔跑步数是否是10的整数倍的判断,如 ...

  8. php个人博客搭建第二阶段②

    网站正文部分:热门博客的推荐: html代码: <!-- 网站正文部分 -->     <div class="content">         < ...

  9. android软件简约记账app开发day05-记账页面条目代码优化和bug解决

    android软件简约记账app开发day05-记账页面条目代码优化和bug解决 今天还是因为该bug又极大的耽误了项目进程,该开发文档都要没有时间来写了. 先说bug吧,在昨天已经实现了页面图标的展 ...

  10. Python学习笔记: pip install 常见错误汇总

    本机环境RHEL8, Python3.9 pip install: 无法安装最新版本的包 在pypi上查看pkg的页面,因为有些pip包的版本对特定的python版本有要求 pip install e ...