-
2019-03-09 15:34:09
方法一:
function htmlToPdf(){ html2canvas($('#lastcontent'), { //appmsg 为选择要导出的页面id样式 height:3000, onrendered: function(canvas) { var imgData = canvas.toDataURL('img/notice/png'); var doc = new jsPDF('p', 'px','a4'); //第一列 左右边距 第二列上下边距 第三列是图片左右拉伸 第四列 图片上下拉伸 doc.addImage(imgData, 'PNG', 10, 0,420,0); doc.addPage(); //增加新一页 doc.addImage(imgData, 'PNG', 10, 0,420,0); doc.save('test.pdf'); } }); }
方法二:
function htmlToPdf() { if(confirm("您确认下载该PDF文件吗?")){ var pdf = new jsPDF('p','pt','a4'); // 设置打印比例 越大打印越小 pdf.internal.scaleFactor = 2; var options = { pagesplit: true, //设置是否自动分页 "background": '#FFFFFF' //如果导出的pdf为黑色背景,需要将导出的html模块内容背景 设置成白色。 }; var printHtml = $('#allcontent').get(0); // 页面某一个div里面的内容,通过id获取div内容 pdf.addHTML(printHtml,15, 15, options,function() { pdf.save('目标.pdf'); }); } }
更多相关内容 -
JS导出PDF插件的方法(支持中文、图片使用路径)
2020-10-21 23:04:11下面小编就为大家带来一篇JS导出PDF插件的方法(支持中文、图片使用路径)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
js导出pdf和word
2020-12-10 15:23:51用于导出pdf和wordjs.可以轻松导出word和pdf在前端就能导出。非常的方便。都不用思考太多。都封装好了。只要用就行。非常方便的工具和插件 -
spreadjs_集成 Echarts 并导出 PDFdemo.zip
2021-09-09 13:34:29spreadjs_集成 Echarts 并导出 PDFdemo -
[转]JS导出PDF
2020-01-20 15:53:11通过纯js将网页保存为pdf,A4分页,无需服务端参与 1.引入js库文件: <script src="../static/jspdf/html2canvas.js"></script> <script src="../static/jspdf/jsPdf.debug.js"></script&...通过纯js将网页保存为pdf,A4分页,无需服务端参与
1.引入js库文件:
<script src="../static/jspdf/html2canvas.js"></script> <script src="../static/jspdf/jsPdf.debug.js"></script>
2.思路:用html2canvas截取页面(html2canvas就是这样一款前端插件,它的原理是将Dom节点在Canvas里边画出来),然后用jsPDF来生成pdf文件。
3.核心代码:
为了保证生成的pdf空白区域没有黑色背景,在操作之前先把背景设置为白色(因为沒有背景色,截取时会以黑色填充)
$("#"+divID).css("background-color","white");
解决html2canvas截取页面太模糊,创建一个新的canvas:
var canvas_new = document.createElement("canvas"); var scale = 2; var w = parseInt(window.getComputedStyle(document.querySelector("#"+divID)).width); var h = parseInt(window.getComputedStyle(document.querySelector("#"+divID)).height);
将canvas画布放大若干倍,然后盛放在较小的容器内,就显得不模糊了:
canvas_new.width = w * scale; canvas_new.height = h * scale; canvas_new.getContext("2d").scale(scale, scale);
进行导出:var options = { canvas: canvas_new }; html2canvas(document.querySelector("#"+divID),options)..then(function(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 = 592.28/contentWidth * contentHeight+45; 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', 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('name.pdf');
---------------------
作者:致虚极POLE守静笃
来源:CSDN
原文:https://blog.csdn.net/u011821334/article/details/79389426
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件 -
js 导出中文pdf文件
2018-04-25 14:55:17js 导出中文pdf文件 demo,包含导出中文的案例,vfs_fonts.js和pdfmake.min.js 生成pdf文件 -
html导出pdf格式所需要的js文件
2019-03-28 12:02:49里面包含html导出pdf的html2canvas.js和jspdf.debug.js两个文件 -
vue 中使用print.js导出pdf操作
2021-01-21 10:57:041.print.js // 打印类属性、方法定义 /* eslint-disable */ const Print = function (dom, options) { if (!(this instanceof Print)) return new Print(dom, options); this.options = this.extend({ 'noPrint'... -
JavaScript将HTML元素导出PDF及World
2021-12-17 10:54:39JavaScript导出PDF及WorldJavaScript导出PDF及World前言一、JavaScript导出PDF1.下载依赖并引用2.获取DOM元素3.实例化JSPDF对象3.实例化html2canvas对象4.canvans转image5.将图片写入PDF6.导出7.博主代码二、...JavaScript导出PDF及World
JavaScript导出PDF及World
前言
使用软件版本 Vue 2.6.10 Office2016 Office2019 WPS
提示:以下是本篇文章正文内容,下面案例可供参考
一、JavaScript导出PDF
JavaScript导出PDF,原理就是将World转成图片 将图片写进PDF里并生成
1.下载依赖并引用
npm install html2canvas -S npm install jsPDF -S
import html2canvas from 'html2canvas' import jsPDF from 'jspdf'
2.获取DOM元素
document.getElementById("XXX")
3.实例化JSPDF对象
let pdf = new jsPDF('', 'pt', 'a4')
入参解释
1、生成PDF纸张方向 默认纵向
2、生成PDF单位:mm、cm、px、pt 默认:mm
3、根据入参2设置的单位生成纸张大小默认:‘a4’,可自定义大小只需要往入参3里传递数组[x,y]即可
PS:一张A4值比例为595.3 pt * 841.9 pt
正常PC端 1cm≈28.34761pt3.实例化html2canvas对象
let option={ backgroundColor: '#fff', // null无背景 allowTaint: true, // 是否允许跨域图片渲染 useCORS: true, // 是否允许跨域图片加载 taintTest: true, // 是否在渲染前测试图片 logging: false, // 是否在console.log()中输出信息 timeout: 100, // 图片加载延迟,默认0 // canvas: canvas, width: width,//宽度 height: height,//高度 // scale: scale //放大或者缩小 正常值:1 } let canvans = html2canvas(dom, option).then((canvans)=>{ //canvans则是将Dom转成画布以后的对象 })
入参解释
1、dom节点
2、属性4.canvans转image
let pageData = canvans.toDataURL('image/jpeg', 1)
入参解释
1、生成图片类型
2、是否放大 放大多少倍 正常值:15.将图片写入PDF
pdf.addImage(pageData, 'JPEG', 90.1453998, 72.0029294, 415.0, 697.87)
入参解释
1、图片数据
2、写入图片类型
3、向左偏移多少 根据PDF实例化声明的单位
4、向上偏移多少 根据PDF实例化声明的单位
5、图片宽度 根据PDF实例化声明的单位
6、图片高度 根据PDF实例化声明的单位6.导出
pdf.save(“Demo.pdf”)
7.博主代码
async getPdf() { this.loadingText = '正在生成Dom' // 此代码是Element-Ui 提示文字 let pages = document.querySelectorAll('.preview .page') let pdf = new jsPDF('', 'pt', 'a4') for (let i = 0; i < pages.length; i++) { this.loadingText = `正在生成第${i + 1}页` let page = pages[i] let width = page.offsetWidth let height = page.offsetHeight let option = { backgroundColor: '#fff', // null无背景 allowTaint: true, // 是否允许跨域图片渲染 useCORS: true, // 是否允许跨域图片加载 taintTest: true, // 是否在渲染前测试图片 logging: false, // 是否在console.log()中输出信息 timeout: 100, // 图片加载延迟,默认0 // canvas: canvas, width: width,//宽度 height: height,//高度 // scale: scale //放大或者缩小 正常值:1 } let canvans = await html2canvas(page, option) let pageData = canvans.toDataURL('image/jpeg', 0.5) //一张A4值比例为595.3 pt * 841.9 pt //1cm≈28.34761pt //world文档默认边距为 上下 2.54cm 左右 3.18cm //正常宽度应该为 595.3-(3.18 * 28.34761pt * 2)≈415 单位:pt //正常高度应该为 841.9-(2.54 * 28.34761pt * 2)≈697.87 单位:pt pdf.addImage(pageData, 'JPEG', 90.1453998, 72.0029294, 415.0, 697.87) pageData = null canvans = null pdf.text(`${i + 1}/${pages.length}`, 297.65, 841.0, 'left') if (i < pages.length - 1) { pdf.addPage()//增加一页Pdf } } this.loadingText = `合并数据` let name = "Demo.pdf" pdf.save(name) }
更多API可进
JSPDF官网:JSPDF
html2canvas官网:html2canvas二、JavaScript导出World
1、下载依赖
npm install file-saver -S
2、引用
import { saveAs } from 'file-saver';
3、获得DOM
代码如下(示例):
let Node=document.getElementById("XXX")
4、获得HTML元素
let HTML=Node.innerHTML;
5、HTML转二进制
let blob = new Blob([html], { type: 'text/html;charset=utf-8' })
6、下载
saveAs(blob,'Demo.doc')
7、博主代码
handleExport() { this.loadingText = '正在收集图表数据...' let preview = document.querySelectorAll('.preview')[0] this.loadingText = '正在生成所有图例图片...' //此方法是处理了echarts转图片写入HTML标签里 let html = this.handleDomtohtml(preview, this.echartsList) this.loadingText = '正在生成World文件...' let blob = new Blob([html], { type: 'text/html;charset=utf-8' }) let name = this.dowloadInfo.name + ' ' + this.dowloadInfo.time this.$save(blob, `${name}.doc`) }
提示 JS转World会出现
除行内样式以外的样式显示不出
1、office版本兼容问题
2、样式显示异常
在我的强烈要求下,要求我们的后端使用后端技术导出 也会出现类似的问题,使用WPS转换(VIP付费)也会出现一些格式问题
同事1的电脑显示情况
同事2的电脑显示情况
我的电脑显示情况
同事3
三、JavaScript导出World 2.0
更新时间:2021/12/21
博主最近找到了解决图片显示异常的解决办法 通过阅读jquery.wordexport.js的源码发现了一个问题也就是写入本地图片的时候最好是声明一下图片文件
jquery.wordexport.js部分代码展示
具体实现方法:
以这种形式写入World 这样写入对于Office的兼容性就已经解决了 效果展示:
最后的最后只需要解决最后两个问题
1、除行内样式以外的样式无法使用
2、文字标签(P、Span、label)行高无法设置如果各位有另外的解决方案可以一起讨论学习交流一下
-
js 导出pdf文件 demo.zip
2021-04-27 13:38:12使用前端js方式 将数据导出成pdf 文件 -
vue 中使用print.js导出pdf
2020-07-13 15:17:061.print.js // 打印类属性、方法定义 /* eslint-disable */ const Print = function (dom, options) { if (!(this instanceof Print)) return new Print(dom, options); this.options = this.extend({ 'noPrint'...1.print.js
// 打印类属性、方法定义 /* eslint-disable */ const Print = function (dom, options) { if (!(this instanceof Print)) return new Print(dom, options); this.options = this.extend({ 'noPrint': '.no-print' }, options); if ((typeof dom) === "string") { this.dom = document.querySelector(dom); } else { this.isDOM(dom) this.dom = this.isDOM(dom) ? dom : dom.$el; } this.init(); }; Print.prototype = { init: function () { var content = this.getStyle() + this.getHtml(); this.writeIframe(content); }, extend: function (obj, obj2) { for (var k in obj2) { obj[k] = obj2[k]; } return obj; }, getStyle: function () { var str = "", styles = document.querySelectorAll('style,link'); for (var i = 0; i < styles.length; i++) { str += styles[i].outerHTML; } str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>"; str += "<style>html,body,div,#preview-main,.report{width:100%!important;height: auto!important;font-size:14px}</style>"; return str; }, getHtml: function () { var inputs = document.querySelectorAll('input'); var textareas = document.querySelectorAll('textarea'); var selects = document.querySelectorAll('select'); var canvass = document.querySelectorAll('canvas'); for (var k = 0; k < inputs.length; k++) { if (inputs[k].type == "checkbox" || inputs[k].type == "radio") { if (inputs[k].checked == true) { inputs[k].setAttribute('checked', "checked") } else { inputs[k].removeAttribute('checked') } } else if (inputs[k].type == "text") { inputs[k].setAttribute('value', inputs[k].value) } else { inputs[k].setAttribute('value', inputs[k].value) } } for (var k2 = 0; k2 < textareas.length; k2++) { if (textareas[k2].type == 'textarea') { textareas[k2].innerHTML = textareas[k2].value } } for (var k3 = 0; k3 < selects.length; k3++) { if (selects[k3].type == 'select-one') { var child = selects[k3].children; for (var i in child) { if (child[i].tagName == 'OPTION') { if (child[i].selected == true) { child[i].setAttribute('selected', "selected") } else { child[i].removeAttribute('selected') } } } } } //canvass echars图表转为图片 for (var k4 = 0; k4 < canvass.length; k4++) { var imageURL = canvass[k4].toDataURL("image/png"); var img = document.createElement("img"); img.src = imageURL; img.setAttribute('style', 'max-width: 100%;'); img.className = 'isNeedRemove' // canvass[k4].style.display = 'none' // canvass[k4].parentNode.style.width = '100%' // canvass[k4].parentNode.style.textAlign = 'center' canvass[k4].parentNode.insertBefore(img,canvass[k4].nextElementSibling); } return this.dom.outerHTML; }, writeIframe: function (content) { var w, doc, iframe = document.createElement('iframe'), f = document.body.appendChild(iframe); iframe.id = "myIframe"; //iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;"; iframe.setAttribute('style', 'position:absolute;width:0;height:0;top:-10px;left:-10px;'); w = f.contentWindow || f.contentDocument; doc = f.contentDocument || f.contentWindow.document; doc.open(); doc.write(content); doc.close(); // 避免重复打印echarts var removes = document.querySelectorAll('.isNeedRemove'); for (var k = 0; k < removes.length; k++) { removes[k].parentNode.removeChild(removes[k]); } var _this = this iframe.onload = function(){ _this.toPrint(w); setTimeout(function () { document.body.removeChild(iframe) }, 100) } }, toPrint: function (frameWindow) { try { setTimeout(function () { frameWindow.focus(); try { if (!frameWindow.document.execCommand('print', false, null)) { frameWindow.print(); } } catch (e) { frameWindow.print(); } frameWindow.close(); }, 10); } catch (err) { console.log('err', err); } }, isDOM: (typeof HTMLElement === 'object') ? function (obj) { return obj instanceof HTMLElement; } : function (obj) { return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string'; } }; const MyPlugin = {} MyPlugin.install = function (Vue, options) { // 4. 添加实例方法 Vue.prototype.$print = Print } export default MyPlugin
自己页面的样式添加
str += "<style>html,body,div,#preview-main,.report{width:100%!important;height: auto!important;font-size:14px}</style>";
解决echarts图表多点击一次 就会多一张bug
img.className = 'isNeedRemove' canvass[k4].parentNode.insertBefore(img,canvass[k4].nextElementSibling); var removes = document.querySelectorAll('.isNeedRemove');
2.用法
//调用系统打印机 print () { this.$print(this.$refs.print) // 使用 },
题外话
1.在自己需要的页面引用打印页面 这边我打印页面时preview.vue页面<!-- 预览 --> <Modal v-model="previewModal" fullscreen :mask-closable="false" :closable="false"> <preview ref="print" :previewEditOldForm="previewEditForm"></preview> <div slot="footer" class="btn"> <Button type="text" @click="closePreview">关闭</Button> <Button type="primary" @click="print">打印</Button> </div> </Modal>
import Preview from '../operation_report/Preview' export default { components: { Preview } }
- 获取别的页面的表单内容 初始化
export default { data() { return{ previewEditForm: {}, } } }
// 父组件向子组件传值 on: { click: () => { // 父组件向子组件传值 this.previewEditForm = params.row; setTimeout(() => { this.$refs.print.queryById(); this.$refs.print.eventOverviews(); this.previewModal=true; }, 2000) } }
- 隐藏打印页面不需要的按钮
<style scoped> @media print { .btn{ display: none; } } </style>
4.打印内容有echarts时 内容不自适应 调整width
width: 210mm;
最终如下
-
jsPDF导出pdf示例
2020-10-26 00:06:49主要介绍了jsPDF如何导出pdf,不过其貌似不支持中文,需要的朋友可以参考下 -
datatable、pdfmake、buttons.html5导出中文pdf文件
2018-03-23 18:00:53datatable、pdfmake、buttons.html5导出中文pdf文件。资源包下载、解压后即可使用:打开test.html文件即可在浏览器点击 “导出table数据pdf文件” 即可导出table数据 -
JavaScript 实现html导出为PDF文件
2021-12-02 15:27:34相信各位前端工程狮们在一些报表项目,管理系统项目中都会遇到在这样的需求:申请报、表格、简历等等图文信息有导出为PDF文件。下面是记录我在项目中完成该需求的代码dome,发布出来也是希望对大家有些帮助。 1,... -
notion-pdf-export:允许免费 Notion 用户批量导出 PDF 的工具。 您可以导出为 HTML,然后使用此工具将其...
2021-08-03 23:35:54概念 PDF 导出 允许免费 Notion 用户批量导出 PDF 的工具。 您可以将子页面导出为 HTML,然后使用此工具将其转换为 PDF。 下载 从发布页面获取适用于 Windows 和 Mac 的最新下载: 用法 下载工具并解压。 在,将... -
纯js实现html转pdf的简单实例(推荐)
2021-01-21 13:15:12项目开发中遇到了一个变态需求,需要把一整个页面导出为pdf格式,而且要保留页面上的所有的表格、svg图片和样式。 简而言之,就是希望像截图一样,把整个页面截下来,然后保存成pdf。 咋不上天呢…… 查了一下,能够... -
页面截图导出为PDF,以及PDF强行截断分页问题的处理
2021-09-10 11:26:36页面截图导出为PDF,以及PDF强行截断分页问题的处理 需求 将页面内容截图导出为PDF文件,如果有高度过高的表格或图片,尽量不截断而是放在下一页展示。 思路 1.将需要导出的dom,都用一个特殊的类名标注起来,然后用... -
纯前端,js导出页面为pdf
2022-02-24 11:10:41首先引入js <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script> <script src=... -
js实现截屏下载导出PDF格式.rar
2021-01-12 17:32:16js 实现截屏下载导出PDF 文件,解压即可用 -
js导出PDF
2019-07-19 11:13:44js实现导出PDF <button onclick="aaa()">导出PDF</button> <div class="right-aside"> <table border="" cellspacing="" cellpadding="" id="ta"> <h3>111</h3> ... -
JavaScript 导出 HTML 到 PDF
2021-07-14 14:37:04首先说明,最佳方案是方式一。 方式二也可以实现,但是有点麻烦,兼容性还不见得好。 方式三,英文环境下挺好的,但不兼容...jsPDF library 这种方式也可以实现导出 pdf,但是没有第一种方式好。 使用方式 引入类库 -
C#导出pdf的实现方法(浏览器不预览直接下载)
2020-12-23 03:49:12这篇文章主要给大家介绍了关于C#导出pdf的实现方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下: 一.接口部分的代码 [HttpGet] public HttpResponseMessage ExportPdf(string id)... -
pdf-html:将dom导出为pdf
2021-05-12 17:05:29将任意单个或多个dom元素导出为pdf install npm i -S pdf-html usage 导出单个元素 import pdfHtml from 'pdf-html'; pdfHtml({ el: document.body }); // 使用选择器,(匹配到该选择器的元素都将出现在pdf中) ... -
js将页面导出为pdf
2021-11-26 16:21:021、页面引入js <script src="https://cdn.jsdelivr.net/bluebird/latest/bluebird.js"></script> <script src=... -
JS案例:将前端页面导出为PDF
2021-04-27 17:14:27记录一下最近的一个需求,产品需要打印表单凭证,需要实现将选中页面的元素或者是组件导出为PDF,方便打印 使用到的JS库:html2canvas(截取页面生成canvas),jsPDF(使用JS生成PDF) 下面我针对该需求实现一个... -
JS导出页面为PDF,分页导出
2021-10-29 22:49:43引入外链js -
jQ导出PDF自动分页打印代码
2021-04-25 05:39:34jQ导出PDF自动分页打印代码是一款基于jQuery跟Canvas制作的HTML文本导出PDF文件,自动分页打印效果。