国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

純前端--原生js將html頁(yè)面變成pdf文件(html2canvas+jsPDF)

這篇具有很好參考價(jià)值的文章主要介紹了純前端--原生js將html頁(yè)面變成pdf文件(html2canvas+jsPDF)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、html2canvas – 將dom變成圖片:

下載或者安裝html2canvas:官網(wǎng)

1、將文檔放在本地,用原生js進(jìn)行引用和使用。

① 新建一個(gè)名為 html2canvas.min.js 的文件,并且將線上的內(nèi)容進(jìn)行復(fù)制。
② 引入 js 文件:

// js直接引入 -- 未嘗試
<script type="text/javascript" src="XXX/html2canvas.js"></script>


// layui使用
// 首先在html2canvas.js文件中添加exports
layui.define([],function(exports){
    // 復(fù)制的內(nèi)容...
    exports('html2canvas',html2canvas);
})
// 其次進(jìn)行自定義插件的引入
layui.define(['appsmenu'],function (exports) {
	exports("conf", {
	    // 第三方擴(kuò)展
		extend: {
			// 引入html轉(zhuǎn)圖片的插件
			html2canvas: "lay/extends/html2canvas.min",
		}
	}
})
2、使用 npm 進(jìn)行安裝使用:

待續(xù)。。。

二、jsPDF – 將圖片變成pdf:

下載或者安裝jsPDF :

  • github
  • 中文網(wǎng)站
  • CDN
    • Jspdf.es.js:ES 2015 模塊格式。
    • Jspdf.umd.js:UMD模塊格式,用于 AMD 或腳本標(biāo)簽加載。
    • Jspdf.polyfills.js:Internet Explorer等舊瀏覽器所需的兼容文件。
1、將文檔放在本地,用原生js進(jìn)行引用和使用。

① 新建一個(gè)名為 jsPDF.min.js 的文件,并且將線上(我找到的都不能用)或者資源 的內(nèi)容進(jìn)行復(fù)制。
② 引入 js 文件:

// js直接引入 -- 未嘗試
<script type="text/javascript" src="XXX/jsPDF.js"></script>
// CDN引入 -- 未嘗試
<script type="text/javascript" src="https://cdn.staticfile.org/jspdf/2.5.1/jspdf.umd.min.js"></script>


// layui使用
// 首先在jsPDF.min.js文件中添加exports
layui.define([],function(exports){
    exports('jsPDF',jsPDF);
})
// 其次進(jìn)行自定義插件的引入
layui.define(['appsmenu'],function (exports) {
	exports("conf", {
	    // 第三方擴(kuò)展
		extend: {
			// 引入圖片轉(zhuǎn)pdf的插件
			jsPDF: "lay/extends/jsPDF.min",
		}
	}
})
2、使用 npm 進(jìn)行安裝使用:

待續(xù)。。。

三、普通使用(html2canvas+jsPDF):

1、 layui 或者原生js使用:
// html:
<div id="box">
    <button id="btn">下載為pdf</button>
    內(nèi)容....
</div>
// js:
// layui引入:
layui.define(['html2canvas', 'jsPDF'], function (exports) {
	var html2canvas = layui.html2canvas; // 引入html轉(zhuǎn)圖片
	var jsPDF = layui.jsPDF; // 引入圖片轉(zhuǎn)pdf
	// 初始化
	var init = function() {
		// 點(diǎn)擊下載按鈕
		document.getElementById("btn").onclick=function(){
				html2canvas(document.getElementById("box"),{
					allowTaint: false, // 是否允許跨域圖像。會(huì)污染畫布,導(dǎo)致無法使用canvas.toDataURL 方法
					backgroundColor: '#fff', // 畫布背景色(如果未在DOM中指定)。設(shè)置null為透明
					useCORS: true, // 是否嘗試使用CORS從服務(wù)器加載圖像
					dpi: 192, // 導(dǎo)出pdf清晰度
					scale: window.devicePixelRatio * 3, // 用于渲染的比例。默認(rèn)為瀏覽器設(shè)備像素比率。
				}).then(canvas => {
					// html生成圖片的數(shù)據(jù)
					var imageData = canvas.toDataURL('image/jpeg', 1.0);
					// 原本的html頁(yè)面的寬高
					const canvasWidth = canvas.width;
					const canvasHeight = canvas.height;
					// 當(dāng)分辨率是72像素/英寸時(shí),A4紙像素長(zhǎng)寬分別是842×595
					var a4Width = 595; // A4 寬度
					var a4Height = (595 / canvasWidth) * canvasHeight; // A4總高度
					// 生成pdf的一頁(yè)顯示html的高度
					let pageHeight = canvasWidth / 595 * 842;
					// 未生成pdf的html頁(yè)面高度,最初是整體的高度
					let restHeight = canvasHeight;
					// 頁(yè)面上下偏移的大小
					var position = 0;
					/**
					 * 參數(shù)1:方向:l:橫向  p:縱向
					 * 參數(shù)2:?jiǎn)挝唬?pt"、"mm"、"cm"、"m"、"in"、"px"
					 * 參數(shù)3:格式:默認(rèn)為a4
					*/
					var pdf = new jsPDF('p', 'pt', 'a4');
					// 當(dāng)內(nèi)容未超過pdf一頁(yè)顯示的范圍,無需分頁(yè)
					if (restHeight < pageHeight) {
						/**
						 * 將圖像添加到PDF中
						 * 參數(shù)1:圖片的url
						 * 參數(shù)2:圖片的格式
						 * 參數(shù)3:圖片上下偏移的大小
						 * 參數(shù)4:原始寬度
						 * 參數(shù)5:原始高度
						*/ 
						pdf.addImage(imageData, 'JPEG', 0, position, a4Width, a4Height );
					} else {
						while(restHeight > 0) {
							pdf.addImage(imageData, 'JPEG',0, position, a4Width, a4Height)
							restHeight -= pageHeight;
							position -= 842;
							if(restHeight > 0) {
								// 在PDF文檔中添加新頁(yè)面
								pdf.addPage();
							}
						}
					}
					// 保存為pdf格式的文件
					pdf.save('生成的pdf文件.pdf')
				})
			}
	}
	
	var Class = {
		init: function (options) {
			init();
			return this;
		}
	}
	exports('XXX', Class);
)}
2、 vue/react 框架進(jìn)行使用:

待續(xù)。。。

四、模塊分割(html2canvas+jsPDF – 文字會(huì)截?cái)?,除了讓后端做,沒找到別的解決辦法,感覺后端的插件比前端的更好用…):

參考鏈接:https://blog.csdn.net/qq_32244819/article/details/109678481文章來源地址http://www.zghlxwxcb.cn/news/detail-719177.html

具體代碼:
	// 點(diǎn)擊下載按鈕
	document.getElementById("btn").onclick=function(){
		outPutPdfFn()
	}
	// 導(dǎo)出方法
	var outPutPdfFn = function() {
		const A4_WIDTH = 592.28; // A4紙的寬
		const A4_HEIGHT = 841.89; // A4紙的高
		console.log('正在導(dǎo)出pdf,請(qǐng)稍候...');
		let target = document.getElementById('box'); // 需要打印的頁(yè)面的dom
		let pageHeight = target.scrollWidth / A4_WIDTH * A4_HEIGHT; // 根據(jù)比例換算一頁(yè)的高度
		// 獲取分割的dom,即class類名為splitItem的dom
		let splitItemAll = document.getElementsByClassName('splitItem');
		// 進(jìn)行分割操作,當(dāng)分塊的內(nèi)容超出a4紙的高度,則在這個(gè)塊之前插入一個(gè)空白的塊,將原有的塊下移進(jìn)行分割
		for (let i = 0; i < splitItemAll.length; i++) {
			// 計(jì)算當(dāng)前模塊需要分成幾部分
			let modulesNum = Math.ceil((splitItemAll[i].offsetTop + splitItemAll[i].offsetHeight) / pageHeight);
			if (isSplit(splitItemAll, i, modulesNum * pageHeight)) {
				let divParent = splitItemAll[i].parentNode; // 獲取當(dāng)前需要分割塊的父節(jié)點(diǎn)
				let newNode = document.createElement('div');
				newNode.className = 'emptyDiv';
				newNode.style.background = '#ffffff';
				// 計(jì)算需要插入塊的高度
				let _H = modulesNum * pageHeight - (splitItemAll[i].offsetTop + splitItemAll[i].offsetHeight);
				newNode.style.height = _H + 'px';
				newNode.style.width = '100%';
				let nextDom = splitItemAll[i].nextSibling; // 獲取當(dāng)前需要分割塊的下一個(gè)兄弟節(jié)點(diǎn)
				// 判斷兄弟節(jié)點(diǎn)是否存在
				console.log(nextDom);
				if (nextDom) {
					// 存在則將新節(jié)點(diǎn)插入到下一個(gè)兄弟節(jié)點(diǎn)的前面
					divParent.insertBefore(newNode, nextDom);
				} else {
					// 不存在則直接添加
					divParent.appendChild(newNode);
				}
			}
		}
		getPdf('導(dǎo)出pdf', 'box')
	}
	/**
	 * 計(jì)算當(dāng)前內(nèi)容是否跨越了a4大小,以此分割
	 * @params nodes 拿到的所有需要分割的dom
	 * @params index 當(dāng)前需要分割內(nèi)容的索引
	 * @params pageHeight A4紙的高度
	*/
	var isSplit = function(nodes, index, pageHeight) {
		// 當(dāng)前需要分割的內(nèi)容:內(nèi)容高度+內(nèi)容距離頁(yè)面定位父元素(/body)的高度 < 頁(yè)面的高度
		// 當(dāng)前需要分割的內(nèi)容的下一個(gè)兄弟節(jié)點(diǎn):內(nèi)容高度+內(nèi)容距離頁(yè)面定位父元素(/body)的高度 > 頁(yè)面的高度
		if (nodes[index].offsetTop + nodes[index].offsetHeight < pageHeight && nodes[index + 1] && nodes[index + 1].offsetTop + nodes[index + 1].offsetHeight > pageHeight) {
			return true;
		}
		return false;
	}
	// 導(dǎo)出pdf
	var getPdf = function(title, dom) {
		html2canvas(document.getElementById(dom),{
			allowTaint: false, // 是否允許跨域圖像。會(huì)污染畫布,導(dǎo)致無法使用canvas.toDataURL 方法
			backgroundColor: '#fff', // 畫布背景色(如果未在DOM中指定)。設(shè)置null為透明
			useCORS: true, // 是否嘗試使用CORS從服務(wù)器加載圖像
			dpi: 192, // 導(dǎo)出pdf清晰度
			scale: window.devicePixelRatio * 3   // 用于渲染的比例。默認(rèn)為瀏覽器設(shè)備像素比率。增加清晰度
		}).then(canvas => {
			// html生成圖片的數(shù)據(jù)
			var imageData = canvas.toDataURL('image/jpeg', 1.0);
			// 原本的html頁(yè)面的寬高
			const canvasWidth = canvas.width;
			const canvasHeight = canvas.height;
			// 當(dāng)分辨率是72像素/英寸時(shí),A4紙像素長(zhǎng)寬分別是842×595
			var a4Width = 592.28; // A4 寬度
			var a4Height = (592.28 / canvasWidth) * canvasHeight; // A4總高度
			// 生成pdf的一頁(yè)顯示html的高度
			let pageHeight = canvasWidth / 592.28 * 841.89;
			// 未生成pdf的html頁(yè)面高度,最初是整體的高度
			let restHeight = canvasHeight;
			// 頁(yè)面上下偏移的大小
			var position = 0;
			/**
			 * 參數(shù)1:方向:l:橫向  p:縱向
			 * 參數(shù)2:?jiǎn)挝唬?pt"、"mm"、"cm"、"m"、"in"、"px"
			 * 參數(shù)3:格式:默認(rèn)為a4
			*/
			var pdf = new jsPDF('p', 'pt', 'a4');
			// 當(dāng)內(nèi)容未超過pdf一頁(yè)顯示的范圍,無需分頁(yè)
			if (restHeight < pageHeight) {
				/**
				 * 將圖像添加到PDF中
				 * 參數(shù)1:圖片的url
				 * 參數(shù)2:圖片的格式
				 * 參數(shù)3:圖片上下偏移的大小
				 * 參數(shù)4:原始寬度
				 * 參數(shù)5:原始高度
				*/ 
				pdf.addImage(imageData, 'JPEG', 0, 0, position, a4Height );
			} else {
				while(restHeight > 0) {
					pdf.addImage(imageData, 'JPEG',0, position, a4Width, a4Height)
					restHeight -= pageHeight;
					position -= 841.89;
					if(restHeight > 0) {
						// 在PDF文檔中添加新頁(yè)面
						pdf.addPage();
					}
				}
			}
			// 保存為pdf格式的文件
			pdf.save(`${title}.pdf`)
		})
	}

五、echarts圖表模糊的解決辦法:

// 方法一:初始化echarts的時(shí)候,添加清晰度配置 devicePixelRatio
echarts.init(chartDom, null, { devicePixelRatio: window.devicePixelRatio * 3 });
// 方法二:使用svg渲染,這個(gè)效果更好,就是需要調(diào)整grid,不然圖表不完整
// echarts.init(chartDom, null, { renderer: "svg" })

到了這里,關(guān)于純前端--原生js將html頁(yè)面變成pdf文件(html2canvas+jsPDF)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • html2canvas和jspdf實(shí)現(xiàn)html導(dǎo)出pdf文件

    實(shí)現(xiàn)原理 先使用html2canvas對(duì)頁(yè)面進(jìn)行截圖,再使用jspdf將截圖生成pdf文件 html2canvas:通過純JS對(duì)瀏覽器頁(yè)面進(jìn)行截圖 jspdf:一個(gè)基于 HTML5 的客戶端解決方案,用于在客戶端 JavaScript 中生成 pdf文件 的庫(kù) 安裝html2canvas和pdf 截圖源碼 1. 截長(zhǎng)圖不分頁(yè) 2. 截圖分頁(yè) 導(dǎo)出pdf源碼 函數(shù)調(diào)

    2024年02月12日
    瀏覽(19)
  • 前端生成pdf之html2canvas+jsPDF,以及解決圖片不顯示bug

    開發(fā)背景: 需要給頁(yè)面中相應(yīng)的內(nèi)容生成pdf,查找文檔后發(fā)現(xiàn)要用到兩個(gè)插件。html2canvas 以及 jsPDF html2canvas 給dom結(jié)構(gòu)轉(zhuǎn)化為canvas,然后生成各種類型圖片 jsPDF 把canvas 生成的圖片url 轉(zhuǎn)化為pdf 參數(shù) image:表示要插入的圖片資源,可以是圖片文件的路徑或者base64編碼字符串。

    2024年02月02日
    瀏覽(28)
  • 【前端】html2canvas生成圖片空白排查data:;(js vue react uniapp)

    【前端】html2canvas生成圖片空白排查data:;(js vue react uniapp)

    因?yàn)橐鲆粋€(gè)分享圖,就用到了html2canvas,一開始是好好的,今天隨便測(cè)了下,發(fā)現(xiàn)圖片顯示不出來了。打印了下,生成的圖片鏈接變成了 data:; 。后面一步一步地排查,發(fā)現(xiàn)是頁(yè)面內(nèi)容太多了,刪減一點(diǎn)內(nèi)容就能顯示出來。然后我又去認(rèn)真看了下html2canvas的各個(gè)參數(shù),發(fā)現(xiàn)可

    2024年02月03日
    瀏覽(23)
  • js將html頁(yè)面轉(zhuǎn)為pdf

    在 JavaScript 中,可以使用以下兩種方法將 HTML 頁(yè)面轉(zhuǎn)換為 PDF 文件: 使用第三方庫(kù),如 jsPDF 或 html2canvas。 使用瀏覽器的內(nèi)置功能,如 window.print() 方法,可以將 HTML 頁(yè)面轉(zhuǎn)換為 PDF 文件。 下面是使用 jsPDF 的例子: 使用 window.print() 方法的例子: 在瀏覽器中,你可以使用快捷鍵

    2024年02月15日
    瀏覽(75)
  • Vue基于html2canvas和jspdf生成pdf文件,解決jspdf中文亂碼及自動(dòng)換行等問題

    Vue基于html2canvas和jspdf生成pdf文件,解決jspdf中文亂碼及自動(dòng)換行等問題

    在做項(xiàng)目時(shí)有這么一個(gè)需求,需要將當(dāng)前頁(yè)面指定區(qū)域的內(nèi)容導(dǎo)出pdf到本地。借助了兩個(gè)插件分別是html2canvas.js和pdf.js來實(shí)現(xiàn)。使用過程中遇到的問題及解決方法 解決一些問題: 導(dǎo)出按A4紙大小排列 預(yù)留頁(yè)面邊距的問題 內(nèi)容過多自動(dòng)分頁(yè)的問題 直接使用jspdf中文亂碼的問題

    2024年01月25日
    瀏覽(67)
  • html 點(diǎn)擊按鍵跳轉(zhuǎn)至百度/其他html頁(yè)面(原生js)

    本文提供兩種方式,以實(shí)現(xiàn): 在html中,點(diǎn)擊按鍵,跳轉(zhuǎn)至另一html頁(yè)面,或跳轉(zhuǎn)至百度等網(wǎng)頁(yè)。 方法一:通過超鏈接標(biāo)簽a實(shí)現(xiàn): ??????????????在button外添加父標(biāo)簽,超鏈接a: ??????????????????????跳轉(zhuǎn)至百度: ???????????????????????跳轉(zhuǎn)至另

    2024年02月13日
    瀏覽(24)
  • 基于前端技術(shù)原生HTML、JS、CSS 電子病歷編輯器源碼

    基于前端技術(shù)原生HTML、JS、CSS 電子病歷編輯器源碼

    電子病歷系統(tǒng)采取結(jié)構(gòu)化與自由式錄入的新模式,自由書寫,輕松錄入。實(shí)現(xiàn)病人醫(yī)療記錄(包含有首頁(yè)、病程記錄、檢查檢驗(yàn)結(jié)果、醫(yī)囑、手術(shù)記錄、護(hù)理記錄等等。)的保存、管理、傳輸和重現(xiàn),取代手寫紙張病歷。不僅實(shí)現(xiàn)了紙質(zhì)病歷的電子化儲(chǔ)存,而且實(shí)現(xiàn)了病歷的

    2024年02月11日
    瀏覽(28)
  • vue中使用html2canvas+jsPDF實(shí)現(xiàn)pdf的導(dǎo)出

    html2canvas依賴 jspdf依賴 pdf導(dǎo)出 以導(dǎo)出橫向,A4大小的pdf為例 規(guī)律:1. html2canvas 中,在保持jsPDF中的寬高不變的情況下,設(shè)置html2canvas中的 width 和 height 值越小,導(dǎo)出的pdf越顯示不全(會(huì)被放大,只能看到局部),反之值越大,導(dǎo)出的pdf越顯示完整(值也不能過大,過大在pdf中就顯

    2024年02月12日
    瀏覽(18)
  • 前端刷新頁(yè)面的五種方法(含原生js、vue和react)

    1、window.history.go(0)方法 2、location.reload()方法 3、location.href=location.href方法 4、vue-router方法 5、react-router方法

    2024年02月16日
    瀏覽(25)
  • 原生HTML+CSS+JS制作自己的導(dǎo)航主頁(yè)(前端大作業(yè),源碼+步驟詳解)

    原生HTML+CSS+JS制作自己的導(dǎo)航主頁(yè)(前端大作業(yè),源碼+步驟詳解)

    鏈接:https://pan.baidu.com/s/1uaRCJXyIrY56NXabau4wjw?pwd=LDL6 提取碼:LDL6 咕咕了好久啦,今天使用原生HTML+CSS+JS做一個(gè)很簡(jiǎn)單的個(gè)人定制的導(dǎo)航主頁(yè)吧! 先看下完整的效果圖吧! 接下來的文章將逐步帶領(lǐng)大家制作,現(xiàn)在太晚了,就精簡(jiǎn)了下,刪除了部分動(dòng)畫效果,項(xiàng)目整體非常簡(jiǎn)單!

    2024年01月22日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包