欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

純js怎么實現(xiàn)html轉(zhuǎn)pdf

本篇內(nèi)容主要講解“純js怎么實現(xiàn)html轉(zhuǎn)pdf”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“純js怎么實現(xiàn)html轉(zhuǎn)pdf”吧!

創(chuàng)新互聯(lián)公司從2013年成立,先為田家庵等服務(wù)建站,田家庵等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為田家庵企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

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

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

3、還有一種是利用iText類后臺生成java文件。但因為需要導(dǎo)出的這個頁面是動態(tài)頁面,而且直接把頁面?zhèn)鹘o后臺會丟失大量樣式,所以還是pass。

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

html轉(zhuǎn)canvas的話,就用html2canvas這個js,這個網(wǎng)上介紹比較多了,這里就不廢話了。

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

第一步:把對應(yīng)dom節(jié)點里所有的svg元素替換成canvas

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

第二步:把glyphicons字體轉(zhuǎn)成canvas。如果項目中沒有用到glyphicons字體圖標(biāo),可忽略這一步

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是為了顯示圖標(biāo)完整
  myCanvas.width = parseInt(fontSize) + 2;
  myCanvas.height = parseInt(fontSize) + 2;
  myCanvas.style = styleContent;
  var ctx = myCanvas.getContext('2d');
  //設(shè)置繪圖內(nèi)容的顏色
  ctx.fillStyle = iconColor;
  //設(shè)置繪圖的字體大小以及font-family的名字
  ctx.font = fontSize + 'px ' + fontFamilyName;
  ctx.fillText(String.fromCharCode(charCode), 1, parseInt(fontSize) + 1);
  $(inconNode).replaceWith(myCanvas);
 });
}
//根據(jù)glyphicons/glyphicon圖標(biāo)的類名獲取到對應(yīng)的char code
getCharCodeByGlyphiconsName: function(iconName) {
 switch (iconName) {
 case("glyphicons-resize-full"):
  return "0xE216";
 case ("glyphicons-chevron-left"):
  return "0xE225";
 default:
  return "";
 }
}

第三步:html轉(zhuǎn)canvas轉(zhuǎn)圖片再轉(zhuǎn)pdf

html2canvas($("#myExportArea"), {
 onrendered: function(canvas) {
  var imgData = canvas.toDataURL('image/jpeg');
  var img = new Image();
  img.src = imgData;
  //根據(jù)圖片的尺寸設(shè)置pdf的規(guī)格,要在圖片加載成功時執(zhí)行,之所以要*0.225是因為比例問題
  img.onload = function() {
   //此處需要注意,pdf橫置和豎置兩個屬性,需要根據(jù)寬高的比例來調(diào)整,不然會出現(xiàn)顯示不完全的問題
   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);
   //根據(jù)下載保存成不同的文件名
   doc.save('report_pdf_' + new Date().getTime() + '.pdf');
  }
 },
 background: "#fff",
 //這里給生成的圖片默認(rèn)背景,不然的話,如果你的html根節(jié)點沒設(shè)置背景的話,會用黑色填充。
 allowTaint: true //避免一些不識別的圖片干擾,默認(rèn)為false,遇到不識別的圖片干擾則會停止處理html2canvas
});

到此,相信大家對“純js怎么實現(xiàn)html轉(zhuǎn)pdf”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

本文題目:純js怎么實現(xiàn)html轉(zhuǎn)pdf
新聞來源:http://aaarwkj.com/article48/jjhdep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、企業(yè)網(wǎng)站制作、ChatGPT、網(wǎng)站營銷、全網(wǎng)營銷推廣面包屑導(dǎo)航

廣告

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

成都網(wǎng)站建設(shè)
久久成人日韩电影午夜| 一级亚洲国产日韩欧美| 欧美激情网页一区三区| 毛茸茸的阴户在线观看| 欧洲一区二区在线激情| 亚洲国产日韩一区二区在线| 亚洲一区二区三区蜜桃av| 亚洲二区中文字幕在线观看| 中文字幕国产精品91| 亚洲男人的天堂社区av| 久久视热频这里只有精品| 亚洲国产欧美日韩综合| 91久久亚洲综合精品日本| 熟妇一区二区在线播放| 久久五月婷婷爱综合亚洲| 久久精品国产亚洲av不卡| 亚洲成av人片乱码午夜| 人妻少妇一区二区三区四区| 国产精品自在线拍亚洲另类| 两性色午夜视频在线观看| 日韩在线视频精品一区| 岛国少妇av之中文字幕| 日韩黄色成人在线观看| 国产在线91精品入口| 国产精品一区在线播放| 国产精品综合av一区二区国产馆 | 免费观看黄片视频在线播放 | 91人妻精品丰满少妇区| 日韩国产一区二区在线观看| 国产成人大片一区二区三区| 十八女毛片一区二区三区| 一区二区高清免费日本| 亚洲黄色av乱码在线观看| 亚洲欧美中文日韩二区一区| 国产原创av超爽剧情系列| 国产精品一区二区av麻豆| 精品国产欧美亚洲91| 亚洲二区三区四区在线| 日本一级特黄大片做受在线观看| 日本97久久久久久精品| 亚洲无人区码一码二码三码|