純js如何實現html轉pdf-創新互聯

這篇文章將為大家詳細講解有關純js如何實現html轉pdf,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

創新互聯是一家專業提供天壇街道企業網站建設,專注與成都網站制作、做網站、H5技術、小程序制作等業務。10年已為天壇街道眾多企業、政府機構等服務。創新互聯專業網站制作公司優惠進行中。

項目開發中遇到了一個變態需求,需要把一整個頁面導出為pdf格式,而且要保留頁面上的所有的表格、svg圖片和樣式。

簡而言之,就是希望像截圖一樣,把整個頁面截下來,然后保存成pdf。

查了一下,能夠實現html轉pdf的方法還是挺多的,大概有以下幾種:

1、大部分瀏覽器就有這個功能。然而我們客戶要的可不是這個,人家要的是能夠在系統中主動觸發的導出為pdf功能,所以這種方案pass。

2、利用第三方工具。我找到了一種利用wkhtmltopdf這種工具來導出的方案,自己在我們的項目中試了一下,效果不好,而且對svg圖片的支持也不行。pass。

3、還有一種是利用iText類后臺生成java文件。但因為需要導出的這個頁面是動態頁面,而且直接把頁面傳給后臺會丟失大量樣式,所以還是pass。

最后沒什么好的辦法,只能退而求其次,想著要不先把html頁面轉成圖片,再把圖片導出為pdf。因為要支持用戶導出下載,而且要保留樣式,所以最好是純js前端實現。

html轉canvas的話,就用html2canvas這個js,這個網上介紹比較多了,這里就不廢話了。

比較麻煩的是svg圖片,直接用html2canvas無法把svg標簽的內容轉成canvas,最后查了一圈資料后,鎖定了canvg這個js。canvg是谷歌的一個插件,可以將svg標簽內容轉成canvas。具體到我們的項目,還有一個難點,就是如何把glyphicons這種字體圖標也轉成canvas,因為在不同瀏覽器下對這種字體圖標的支持是完全不一樣的。最后找到的方法是用char code來替換這些字體圖標,重新繪制成canvas。由canvas生成圖片不用廢話。由圖片生成pdf用jsPDF實現。 折騰了大半天,總算把整個流程打通了,接下來一步一步貼上代碼。

第一步:把對應dom節點里所有的svg元素替換成canvas

svg2canvas: function(targetElem) {
 var svgElem = targetElem.find('svg');
 svgElem.each(function(index, node) {
  var parentNode = node.parentNode;
  //由于現在的IE不支持直接對svg標簽node取內容,所以需要在當前標簽外面套一層div,通過外層div的innerHTML屬性來獲取
  var tempNode = document.createElement('div');
  tempNode.appendChild(node);
  var svg = tempNode.innerHTML;
  var canvas = document.createElement('canvas');
  //轉換
  canvg(canvas, svg);
  parentNode.appendChild(canvas);
 });
}

第二步:把glyphicons字體轉成canvas。如果項目中沒有用到glyphicons字體圖標,可忽略這一步

glyphicons2canvas: function(targetElem, fontClassName, fontFamilyName) {
 var iconElems = targetElem.find('.' + fontClassName);
 iconElems.each(function(index, inconNode) {
  var fontSize = $(inconNode).css("font-size");
  var iconColor = $(inconNode).css("color");
  var styleContent = $(inconNode).attr('style');
  //去掉"px"
  fontSize = fontSize.replace("px", "");
  var charCode = getCharCodeByGlyphiconsName(iconName);
  var myCanvas = document.createElement('canvas');
  //把canva寬高各增加2是為了顯示圖標完整
  myCanvas.width = parseInt(fontSize) + 2;
  myCanvas.height = parseInt(fontSize) + 2;
  myCanvas.style = styleContent;
  var ctx = myCanvas.getContext('2d');
  //設置繪圖內容的顏色
  ctx.fillStyle = iconColor;
  //設置繪圖的字體大小以及font-family的名字
  ctx.font = fontSize + 'px ' + fontFamilyName;
  ctx.fillText(String.fromCharCode(charCode), 1, parseInt(fontSize) + 1);
  $(inconNode).replaceWith(myCanvas);
 });
}
//根據glyphicons/glyphicon圖標的類名獲取到對應的char code
getCharCodeByGlyphiconsName: function(iconName) {
 switch (iconName) {
 case("glyphicons-resize-full"):
  return "0xE216";
 case ("glyphicons-chevron-left"):
  return "0xE225";
 default:
  return "";
 }
}

第三步:html轉canvas轉圖片再轉pdf

html2canvas($("#myExportArea"), {
 onrendered: function(canvas) {
  var imgData = canvas.toDataURL('image/jpeg');
  var img = new Image();
  img.src = imgData;
  //根據圖片的尺寸設置pdf的規格,要在圖片加載成功時執行,之所以要*0.225是因為比例問題
  img.onload = function() {
   //此處需要注意,pdf橫置和豎置兩個屬性,需要根據寬高的比例來調整,不然會出現顯示不完全的問題
   if (this.width > this.height) {
    var doc = new jsPDF('l', 'mm', [this.width * 0.225, this.height * 0.225]);
   } else {
    var doc = new jsPDF('p', 'mm', [this.width * 0.225, this.height * 0.225]);
   }
   doc.addImage(imgData, 'jpeg', 0, 0, this.width * 0.225, this.height * 0.225);
   //根據下載保存成不同的文件名
   doc.save('report_pdf_' + new Date().getTime() + '.pdf');
  }
 },
 background: "#fff",
 //這里給生成的圖片默認背景,不然的話,如果你的html根節點沒設置背景的話,會用黑色填充。
 allowTaint: true //避免一些不識別的圖片干擾,默認為false,遇到不識別的圖片干擾則會停止處理html2canvas
});

雖然最后勉強完成了客戶的要求,但是生成的pdf效果明顯不如正常截圖來的清晰……水平所限,暫時只能想到這種方法,如果大家有更好的辦法,歡迎指點。

關于“純js如何實現html轉pdf”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

另外有需要云服務器可以了解下創新互聯建站m.kartarina.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

文章題目:純js如何實現html轉pdf-創新互聯
當前URL:http://m.kartarina.com/article38/cciesp.html

成都網站建設公司_創新互聯,為您提供虛擬主機移動網站建設建站公司網站排名品牌網站建設全網營銷推廣

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設
主站蜘蛛池模板: 亚洲免费无码在线| 无码人妻精品一区二区三区蜜桃| 中文字幕人成无码免费视频| 亚洲av片不卡无码久久| 亚洲国产精品无码久久九九| 国99精品无码一区二区三区| 精品无码国产自产拍在线观看蜜| 人妻无码久久精品人妻| 亚洲午夜成人精品无码色欲| 无码国内精品久久综合88| 国产成人无码A区精油按摩| 亚洲aⅴ无码专区在线观看| 中文无码字幕中文有码字幕| 亚洲中文久久精品无码| 亚洲国产精品无码专区影院| 亚洲成av人无码亚洲成av人| 亚洲日产无码中文字幕| 久久亚洲精品无码播放| 亚洲精品无码高潮喷水A片软| 久久久久亚洲精品无码系列| 无码国内精品人妻少妇| 精品无码久久久久国产| 少妇无码AV无码专区在线观看 | 国产精品va无码二区| 无码精品国产va在线观看dvd| 国产产无码乱码精品久久鸭| 久久久久亚洲?V成人无码| 无码人妻一区二区三区兔费| 伊人久久一区二区三区无码| 久久久久亚洲AV无码专区体验| 午夜不卡久久精品无码免费| 亚洲成a人片在线观看无码| 国产精品无码成人午夜电影 | 成人无码WWW免费视频| 国产成人无码一区二区在线观看| 国产精品白浆在线观看无码专区| 亚洲AV永久无码天堂影院| 无码中文字幕色专区| 免费看成人AA片无码视频羞羞网| 亚洲AV无码男人的天堂| 无码国产精品一区二区免费I6|