html頁(yè)面轉(zhuǎn)pdf

最近公司遇見(jiàn)一個(gè)新的需求,將原生html頁(yè)面一鍵轉(zhuǎn)換成pdf文件,作為一個(gè)小白表示很懵,卡在了第一步,引入插件,下面就記錄一下詳細(xì)步驟,興許以后還能用得上呢~

1.下載插件

我們需要引入兩個(gè)插件,html2canvas和jsPdf
如果是原生js寫(xiě)的話(huà)可以通過(guò)script標(biāo)簽引入

1.1 引入html2canvas html2canvas官網(wǎng)

點(diǎn)擊圖片中的按鈕,右鍵另存至項(xiàng)目?jī)?nèi)


html2canvas官網(wǎng)
1.12引入jsPdf jsPdf官網(wǎng)

方法1: https://www.npmjs.com/package/jspdf ,可以參考這里面的方法,
方法2: https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.3.1/jspdf.umd.min.js 直接進(jìn)去右鍵另存至項(xiàng)目 (推薦)

2.引入插件

在你的html頁(yè)面內(nèi)引入剛才下載的文件,路徑看你放的位置,我是直接放在根目錄內(nèi)的


image.png

3 js內(nèi)使用

重點(diǎn):如果new jsPDF構(gòu)造函數(shù)時(shí)報(bào)jspdf is not defiend 或者 jspdf is not a constructor
可以在開(kāi)發(fā)者工具上打印一下window.jspdf 看jsPDF在哪一層,再具體應(yīng)用
這種就需要這樣調(diào)用: new jspdf.jsPDF()


image.png

導(dǎo)出一整頁(yè)不分頁(yè)型:

//在導(dǎo)出按鈕上綁定這個(gè)函數(shù):
function onDerive(){
    let content=document.getElementById('pdfContent') //獲取需要導(dǎo)出的節(jié)點(diǎn)
    download(content); //導(dǎo)出函數(shù)
}

function download(content) {
    html2canvas(content, {
        allowTaint: true,
        scale: 2 // 提升畫(huà)面質(zhì)量窜司,但是會(huì)增加文件大小
    }).then(function (canvas) {
        /**jspdf將html轉(zhuǎn)為pdf一頁(yè)顯示不截?cái)啵w思路:
         * 1. 獲取DOM
         * 2. 將DOM轉(zhuǎn)換為canvas
         * 3. 獲取canvas的寬度航揉、高度(稍微大一點(diǎn))
         * 4. 將pdf的寬高設(shè)置為canvas的寬高
         * 5. 將canvas轉(zhuǎn)為圖片
         * 6. 實(shí)例化jspdf塞祈,將內(nèi)容圖片放在pdf中(因?yàn)閮?nèi)容寬高和pdf寬高一樣,就只需要一頁(yè)迷捧,也防止內(nèi)容截?cái)鄦?wèn)題)
         */
        const contentWidth = canvas.width;
        const contentHeight = canvas.height;

        // 將canvas轉(zhuǎn)為base64圖片
        const pageData = canvas.toDataURL('image/jpeg', 1.0);

        // 設(shè)置pdf的尺寸,pdf要使用pt單位 已知 1pt/1px = 0.75   pt = (px/scale)* 0.75
        // 2為上面的scale 縮放了2倍
        const pdfX = (contentWidth + 10) / 2 * 0.75;
        const pdfY = (contentHeight + 500) / 2 * 0.75; // 500為底部留白

        // 設(shè)置內(nèi)容圖片的尺寸胀葱,img是pt單位
        const imgX = pdfX;
        const imgY = (contentHeight / 2 * 0.75); //內(nèi)容圖片這里不需要留白的距離

        // 初始化jspdf 第一個(gè)參數(shù)方向:默認(rèn)''時(shí)為縱向漠秋,第二個(gè)參數(shù)設(shè)置pdf內(nèi)容圖片使用的長(zhǎng)度單位為pt,第三個(gè)參數(shù)為PDF的大小抵屿,單位是pt
        const PDF = new jspdf.jsPDF('', 'pt', [pdfX, pdfY]); //看看你的jspdf在哪里呀,我看其它教程都是直接var PDF = new jsPDF('', 'pt', [pdfX, pdfY])

        // 將內(nèi)容圖片添加到pdf中庆锦,因?yàn)閮?nèi)容寬高和pdf寬高一樣,就只需要一頁(yè)轧葛,位置就是 0,0
        PDF.addImage(pageData, 'jpeg', 0, 0, imgX, imgY)

        PDF.save('信息.pdf')

    })
}

分頁(yè)型:

function onDerive() {
//分頁(yè),但是可能內(nèi)容會(huì)被截?cái)喾桨?    html2canvas(document.getElementById('pdfContent')).then(function (canvas) { //獲取需要導(dǎo)出的節(jié)點(diǎn)
        let SmallPDF = document.getElementById('SmallPDF');
        let content = SmallPDF.appendChild(canvas) //這句代碼會(huì)將canvas截圖生成一個(gè)元素節(jié)點(diǎn),不需要可以用css隱藏
         onrendered(content)


    });
}

function onrendered(canvas) {

    const contentWidth = canvas.width;
    const contentHeight = canvas.height;

    //一頁(yè)pdf顯示html頁(yè)面生成的canvas高度;
    const pageHeight = contentWidth / 592.28 * 841.89;
    //未生成pdf的html頁(yè)面高度
    let leftHeight = contentHeight;
    //pdf頁(yè)面偏移
    let position = 0;
    //a4紙的尺寸[595.28,841.89]搂抒,html頁(yè)面生成的canvas在pdf中圖片的寬高
    const imgWidth = 595.28;
    const imgHeight = 592.28 / contentWidth * contentHeight;

    const pageData = canvas.toDataURL('image/jpeg', 1.0);

    const pdf = new jspdf.jsPDF('', 'pt', 'a4')

    //有兩個(gè)高度需要區(qū)分,一個(gè)是html頁(yè)面的實(shí)際高度尿扯,和生成pdf的頁(yè)面高度(841.89)
    //當(dāng)內(nèi)容未超過(guò)pdf一頁(yè)顯示的范圍求晶,無(wú)需分頁(yè)
    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;
            //避免添加空白頁(yè)
            if (leftHeight > 0) {
                pdf.addPage();
            }
        }
    }

    pdf.save('html轉(zhuǎn)pdf測(cè)試.pdf');
}

不分頁(yè)代碼來(lái)自:http://www.reibang.com/p/4061bdea2a3e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市衷笋,隨后出現(xiàn)的幾起案子芳杏,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爵赵,死亡現(xiàn)場(chǎng)離奇詭異吝秕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)空幻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)烁峭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人秕铛,你說(shuō)我怎么就攤上這事约郁。” “怎么了如捅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵棍现,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我镜遣,道長(zhǎng)己肮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任悲关,我火速辦了婚禮谎僻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寓辱。我一直安慰自己艘绍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布秫筏。 她就那樣靜靜地躺著诱鞠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪这敬。 梳的紋絲不亂的頭發(fā)上航夺,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音崔涂,去河邊找鬼阳掐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冷蚂,可吹牛的內(nèi)容都是我干的缭保。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蝙茶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艺骂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起隆夯,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤彻亲,失蹤者是張志新(化名)和其女友劉穎孕锄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苞尝,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畸肆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宙址。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轴脐。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抡砂,靈堂內(nèi)的尸體忽然破棺而出大咱,到底是詐尸還是另有隱情,我是刑警寧澤注益,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布碴巾,位于F島的核電站,受9級(jí)特大地震影響丑搔,放射性物質(zhì)發(fā)生泄漏厦瓢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一啤月、第九天 我趴在偏房一處隱蔽的房頂上張望煮仇。 院中可真熱鬧,春花似錦谎仲、人聲如沸浙垫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)夹姥。三九已至,卻和暖如春辙诞,著一層夾襖步出監(jiān)牢的瞬間辙售,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工倘要, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圾亏,地道東北人十拣。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓封拧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親夭问。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泽西,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容