成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > HTML轉(zhuǎn)PDF的純客戶端和純服務(wù)端實現(xiàn)方案

HTML轉(zhuǎn)PDF的純客戶端和純服務(wù)端實現(xiàn)方案

熱門標(biāo)簽:長春極信防封電銷卡公司 強訊外呼系統(tǒng) crm外呼系統(tǒng)好不好 電銷外呼線路改不外呼線路 重慶人工智能電銷機器人報價 愛巢地圖標(biāo)注 貴陽ai外呼系統(tǒng) 智能電銷機器人廣告語 電話機器人批發(fā)

需求

用戶填寫表單,點擊保存之后,可以直接下載pdf文檔。

解決思路

服務(wù)端生成

思路

谷歌瀏覽器在17年自行開發(fā)了Chrome Headless特性,并與之同時推出了 puppeteer,它可以被理解為是無界面但是可以完成服務(wù)器功能特性的瀏覽器。

所以我們可以在服務(wù)端啟動puppeteer瀏覽器,打開目標(biāo)網(wǎng)址,使用chrome瀏覽器自帶的轉(zhuǎn)換功能進行html到pdf的轉(zhuǎn)換。

服務(wù)端生成核心代碼

首先要安裝puppeteer,npm安裝可能會出錯,最好使用cnpm淘寶鏡像安裝。

輸入 cnpm i puppeteer -S 安裝依賴。

創(chuàng)建一個js文件,只需要用puppeteer瀏覽器打開網(wǎng)址,保存pdf即可。

// html2pdf.js

const puppeteer = require('puppeteer');
(async function(){
    // 啟動服務(wù)
    const browser = await puppeteer.launch();
    // 打開標(biāo)簽頁
    const page = await browser.newPage();
    // 轉(zhuǎn)到該地址
    await page.goto('https://koa.bootcss.com/#context');
    // html頁面轉(zhuǎn)pdf并保存至path
    await page.pdf({path:"test.pdf",format:'A4'})
    // 關(guān)閉瀏覽器
    await browser.close();
})();

然后控制臺輸入 node html2pdf.js 啟動服務(wù)。

當(dāng)然也可以module.export將模塊方法導(dǎo)出,根據(jù)業(yè)務(wù)邏輯來。

缺點

無法保存表單動態(tài)數(shù)據(jù)

由于是從服務(wù)端請求頁面,如果不在請求地址上保存用戶輸入,截出來的pdf將是頁面沒被填寫的初始狀態(tài)。

換而言之,他只能進行靜態(tài)頁面的轉(zhuǎn)換,因為我們的需求有大量用戶輸入,因此pass。

客戶端生成核心代碼

思路

  • 使用html2canvas,輸入需要轉(zhuǎn)換的dom節(jié)點,遍歷轉(zhuǎn)換成canvas畫布
  • 將canvas畫布轉(zhuǎn)成base64圖片,使用jsPDF創(chuàng)建pdf文件,把圖片插入進pdf。

缺點

失真。

我們可以很明顯的發(fā)現(xiàn),既然是類似于對頁面截圖再將截圖插入pdf,頁面的分辨率和配置很可能影響輸出圖片的質(zhì)量。

同時,因為是截圖,可能失去頁面鏈接等功能。

文字截斷

當(dāng)canvas畫布大于pdf一頁大小時,輸出就會出錯,這時我們需要判斷canvas畫布是否超出A4大小,如果超出,對canvas進行分割,插入到不同的頁面。

這時候問題又來了,既然是分割圖片,那么很可能導(dǎo)致圖片或者文字從一半就被截斷,因為我們無法分析canvas內(nèi)部item的結(jié)構(gòu)。

核心代碼

我們的需求沒有圖片和鏈接,所以失真的問題對我們影響不大,同時我們的表單由多個重復(fù)等長的item組成,并且這些item都非常短,不會超出一張A4紙(雖然這樣不嚴(yán)謹(jǐn),如果需要,你可以獲取DOM元素寬高,根據(jù)DOM元素高度裁剪)。

所以我打算直接根據(jù)item切分canvas,每個item給一頁A4紙保存。

在開始之前需要理解幾個核心方法:

html2canvas

   // DOM是要轉(zhuǎn)換的DOM節(jié)點
    html2canvas(DOM,{
        backgroundColor:"#ffffff",
        width:width,
        height:height,
        scale:2,
        allowTaint:true,
    }).then((canvas)=>{
        // canvas 是轉(zhuǎn)換成功后的畫布
    })

jsPDF

   // 創(chuàng)建實例
    let pdf = new jsPDF('','pt','a4');
    // 將圖片添加到pdf文件里
    // 第一個參數(shù)是待插入的文件(base64)格式,第二個是文件格式
    // 第三第四是圖片左上角的坐標(biāo),最后兩個是圖片插入后的寬高
    pdf.addImage(image,'JPEG',10,10,height,width);
    // 添加新的一頁
    pdf.addPage()
    // 保存pdf文件
    pdf.save()

canvas

  // canvas是待剪切的圖片
    // sx,sy是開始裁剪的坐標(biāo)
    // swidth、sHeight是裁剪的寬高
    // dx、dy是裁剪后圖像在canvas中插入的坐標(biāo)
    // sWidth,sHeight是裁剪后圖像在canvas中的寬高
    cxt.drawImage(canvas,sx,sy,sWidth,sHeight,dx,dy,sWidth,sHeight);
/**
 * @description: 表單轉(zhuǎn)pdf文件
 * @return: pdf
 */
onSubmit(){
    // 這是我要轉(zhuǎn)換的表單,里面有很多一樣的表格
    let form = this.$refs.form;
    // 獲取元素的寬高
    let width = form.getBoundingClientRect().width;
    let height = form.getBoundingClientRect().height;
    html2canvas(form,{
        backgroundColor:"#ffffff",
        width:width,
        height:height,
        scale:2,
        allowTaint:true,
    }).then((canvas)=>{
        let pdf = new jsPDF('','pt','a4');
        // 進行圖片切割
        let canvasList = this.splitCanvas(canvas,this.forms.length);

        // 遍歷canvas列表,每頁添加一張圖片
        canvasList.forEach((item,index)=>{
            // 轉(zhuǎn)換圖片格式為base64
            let itemImage = item.toDataURL('image/jpeg',1.0);
            // 預(yù)留10px邊距,A4紙的寬在72分辨率的顯示器上是595px
            pdf.addImage(itemImage,'JPEG',10,10,575.28,575.28/item.width*item.height);
            // 如果不是最后一頁,則分頁
            index == this.forms.length-1 ? '' : pdf.addPage();
        })
        // 文件保存
        let blob = pdf.output('blob');
        
        pdf.save('test.pdf');
    })
},
/**
 * @description: 對canvas進行切割
 * @param {number} num 切片數(shù)量 
 * @param {canvas} canvas 
 * @return {array} canvas列表
 */
splitCanvas(canvas,num){
    let height = canvas.height,width = canvas.width;
    let chunkHeight = height/num;// 每個切片的高度
    let chunkList = [];// 存放結(jié)果canvas
    for(let i=0; i<height ; i+=chunkHeight){
        // 初始化裁剪矩形框位置
        let sx = 0,sy = i,sWidth = width,sHeight = chunkHeight,dx = 0, dy = 0;
        // 創(chuàng)建一個canvas節(jié)點
        let canvasItem =document.createElement("canvas");
        // 初始化畫布大小
        canvasItem.height = chunkHeight;
        canvasItem.width = width;
        let cxt = canvasItem.getContext("2d");
        // 將裁剪的圖片放到新的canvas節(jié)點
        cxt.drawImage(canvas,sx,sy,sWidth,sHeight,dx,dy,sWidth,sHeight);
        chunkList.push(canvasItem); 
    }
    return chunkList;
},

最終效果

表單保存后的頁面

轉(zhuǎn)換成pdf的效果

 到此這篇關(guān)于HTML轉(zhuǎn)PDF的純客戶端和純服務(wù)端實現(xiàn)方案的文章就介紹到這了,更多相關(guān)HTML轉(zhuǎn)PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

標(biāo)簽:內(nèi)蒙古 保定 清遠 廣安 山南 陜西 吳忠 上海

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《HTML轉(zhuǎn)PDF的純客戶端和純服務(wù)端實現(xiàn)方案》,本文關(guān)鍵詞  HTML,轉(zhuǎn),PDF,的,純,客戶端,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《HTML轉(zhuǎn)PDF的純客戶端和純服務(wù)端實現(xiàn)方案》相關(guān)的同類信息!
  • 本頁收集關(guān)于HTML轉(zhuǎn)PDF的純客戶端和純服務(wù)端實現(xiàn)方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美视频免费在线| 最近免费中文字幕大全免费第三页| 亚洲国产一区二区在线播放| 美女视频黄免费的久久| 久久免费99精品久久久久久| 永久免费看片直接| 2欧美一区二区三区在线观看视频| 小早川怜子痴女在线精品视频| 国内精品一区二区三区| 亚洲午夜国产成人| www.8ⅹ8ⅹ羞羞漫画在线看| 国产精品51麻豆cm传媒| 欧美中文字幕久久| 日韩免费高清| 日韩免费久久| 2021狠狠干| 在线观看免费视频a| 久久久91精品国产一区二区三区| 视色,视色影院,视色影库,视色网| 精品产国自在拍| 天天撸夜夜操| 欧美精品日韩www.p站| 偷拍自拍在线看| 欧美精品一区二区三区精品| 国产精品成人网站| 欧美亚洲日本在线观看| 日日夜夜精品免费视频| 久久久久久久亚洲| 久久裸体视频| 在线观看免费成人av| 中文字幕手机在线观看| jizz欧美性11| 色www精品视频在线观看| 欧美在线视频你懂得| 最新理论片影院| 欧美亚州一区二区三区| 国产精品麻豆成人av电影艾秋| 欧美色成人综合| 国产女片a归国片aa| 国产手机视频在线观看| jk破处视频在线| 国产精品一区二区资源| 97在线电影| 亚洲综合激情视频| 成人综合日日夜夜| 色乱码一区二区三区在线| 精品久久久网| 手机精品视频在线| 国产午夜精品无码一区二区| 日本久久久久久久久久| 国产网站在线看| 国产精品女人网站| 欧美xxxxx少妇| 日韩在线免费| 免费精品99久久国产综合精品应用| 国产美女久久精品香蕉69| 男人天堂av电影| 日韩精品美女| 视频一区视频二区中文| 91精品日本| 午夜视频网站在线观看| 欧美成人综合色| 911精品产国品一二三产区| 成人爽a毛片一区二区| 欧美高清videos高潮hd| 国产在线视频欧美一区| 国产剧情久久久| 在线视频中文字幕| www.撸撸| av日韩在线免费| 色婷婷综合久久久久中文字幕| ady日本映画久久精品一区二区| 久99九色视频在线观看| 亚洲网站在线观看| 九九99精品| 一区二区乱码| 日韩女在线观看| 九九综合九九综合| 欧美午夜片欧美片在线观看| 免费高清在线一区| 日韩午夜在线影院| 久久免费少妇高潮久久精品99| 欧美三级视频网站| 亚洲男人的天堂av| 中文字幕亚洲一区在线观看| 免费网站免费进入在线| 日本一区午夜艳熟免费| 黄视频免费在线看| 国产精品毛片无码| 精品美女被调教视频大全网站| 极品白嫩少妇无套内谢| 美女网站视频黄色| 欧美一区二区黄色| 国产伦精品一区二区三区妓女下载| 91av日本| 精品国产乱码久久久久久88av| 又黄又免费的视频| 青青草原网站在线观看| 69xxxx欧美| 日韩电影在线播放| 爽死777影院| 扒开jk护士狂揉免费| 中文字幕日本乱码精品影院| 亚洲免费在线视频一区 二区| 日本久久天堂| 欧美日韩在线一二三| 51蜜桃传媒精品一区二区| 国产福利亚洲| 久草热久草在线频| 亚洲永久精品国产| 少妇性饥渴无码a区免费| 国产小视频国产精品| 3d成人动漫网站| 欧美激情视频一区二区| 精品国产乱码久久久久久久软件| 国产精品三区四区| 日韩成人午夜电影| 亚洲已满18点击进入在线看片| 中文字幕永久在线观看| 欧美人与动性xxxxx杂性| 亚洲欧美日韩激情| 亚洲人一二三区| 久久国产精品久久久久久小说| 亚洲国产三级| 69久久夜色精品国产69乱青草| sese在线视频| 久久av资源网| 日本在线三级| 深夜福利视频在线免费观看| 全部a∨一极品视觉盛宴| 亚洲欧美另类自拍| 99热这里只有精品8| 97久久精品人人澡人人爽缅北| 天天操天天曰| 一区二区三区四区在线| 91精品人妻一区二区三区四区| 日韩天堂在线| 亚洲一区 视频| 午夜在线观看91| 久久一区二区三区超碰国产精品| jizz18女人高潮| 最新黄网在线观看| 精品伊人久久大线蕉色首页| 国产精品成人3p一区二区三区| 在线免费福利| 精品久久国产视频| 久草视频手机在线| 天堂一区二区在线免费观看| 美女精品国产| 神马影院我不卡| 中文字幕一区二区久久人妻| 黄色在线观看av| 日韩免费av网站| 亚洲大尺度视频在线观看| 羞羞答答国产精品www一本| 黄动漫在线免费观看| 色无极影院亚洲| 日韩欧美自拍偷拍| 麻豆传媒在线看| 久久久久久三级| 国产又爽又黄视频| 九九热视频精品| 97最新国自产拍视频在线完整在线看| 日韩在线观看视频一区二区三区| 欧美高清性xxxx| av毛片在线免费| 欧美free嫩15| 日韩欧美猛交xxxxx无码| av观看网址| 精品国产一二| 在线色视频观看| www.-级毛片线天内射视视| 亚洲成人不卡| 春暖花开亚洲| 日韩视频三区| 国产亚洲一区二区在线| 亚洲日本理论电影| 久久久久中文字幕| 在线观看国产区| 影视一区二区三区| 午夜视频一区| 国产精品无码在线播放| 国产偷国产偷亚洲高清97cao| 欧美日韩视频在线| 原创真实夫妻啪啪av| 91精品国产欧美一区二区成人| 91精品91久久久中77777老牛| 久久国产露脸精品国产| 黄色片视频免费观看| 国语对白做受xxxxx在线中国| 无码无遮挡又大又爽又黄的视频| 日本一区二区免费视频| 亚洲精品国产福利| 91九色porny视频| 亚洲资源视频| 在线观看小视频| 特级西西444www| 日批视频免费在线观看| 国产日产亚洲系列最新| 国产精品一码二码三码在线| 91视频网入口| 日韩一级免费一区| 青春草在线观看| 91在线观看一区二区| 999在线观看免费大全电视剧| 午夜成人免费视频| 日本中文字幕在线看| 全部免费的黄色毛片| 免费在线观看一区二区| 国产第一页在线播放| 波波电影院一区二区三区| 欧美一级免费片| 国产日韩欧美在线视频观看| 亚洲国产成人精品一区二区| 国产农村妇女精品一二区| 日韩中文字幕在线一区| 91福利精品第一导航| 另类小说欧美激情| 一级片黄色免费| 国产小黄视频| 国产精品超碰97尤物18| 天天爽天天爽天天爽| 一色屋色费精品视频在线观看| 国产精品欧美综合在线| 一区二区三区精品视频在线观看| 久久在精品线影院精品国产| 偷拍视频一区二区三区| 成人激情黄色小说| 亚洲一区二区在线播放相泽| 9999国产精品| www污污网站在线看| 久久精品官网| 91夜夜揉人人捏人人添红杏| 无码无套少妇毛多18pxxxx| 中文字幕一区久| 精品福利影院| 成人免费乱码大片a毛片软件| av中文字幕av| 欧美一级视频在线| 91麻豆国产精品久久| 国产精品一区电影| 欧美日韩第一视频| 久久国产日韩| 99久久综合色| 欧美视频一区二| 欧洲精品一区二区三区久久| 欧美亚洲不卡| 日日噜噜夜夜狠狠久久波多野| 超碰在线观看91| 欧美日韩视频专区在线播放| 久久视频精品在线观看| 国产欧美亚洲精品a| 99国产精品国产精品久久| 高清在线视频日韩欧美| 夜夜操 天天操| 午夜欧美大尺度福利影院在线看| 亚洲精品乱码久久久久久动漫| 国产精品成人久久电影| 国产精品视频大全| 国产偷国产偷精品高清尤物| 日本一区二区三区视频在线| 国产激情视频在线观看| 牛牛影视一区二区三区免费看| 中文字幕网站视频在线| 国产探花在线观看| 头脑特工队2免费完整版在线观看| 男人天堂2017| 欧美色资源站| 在线综合亚洲| 成人av动漫| 99视频精品| 欧美另类高清videos的特点| 国产l精品国产亚洲区在线观看| 公交车强行挺进岳身体| 久久高清免费视频| 欧美人与性动交α欧美精品| 日本久久伊人| 成人黄色a**站在线观看| 亚洲免费一级片| 亚洲欧美变态国产另类| 国产成人avxxxxx在线看| 91在线一区二区三区| 日韩美女一区二区三区| 亚洲男同1069视频| 神马电影网我不卡| 在线视频一区二区三| 亚洲影院一区二区三区| 日韩免费三级| 色综合久久五月天| 国产淫片av片久久久久久| 久久精品日韩| 中文娱乐网av| 欧美国产亚洲另类动漫| 久久高清免费视频| 青青在线观看视频中文字| 成人精品电影| 青青草在线观看视频| 欧美一区二区三区免费| 精品无码人妻少妇久久久久久| 国产裸体美女永久免费无遮挡| 精品久久久久久乱码天堂| 中文在线免费一区三区高中清不卡| 在线国产视频观看| 亚洲人成在线观看| 亚洲级视频在线观看免费1级| 欧洲生活片亚洲生活在线观看| 色婷婷久久一区二区三区麻豆| 国产美女在线播放| a级黄色片免费| 国产精品久久久免费看| 国产黄色美女视频| 中文字幕亚洲一区二区va在线| 亚洲免费福利视频| 亚洲精品一区二区在线看| 香蕉视频官网在线观看日本一区二区| 国产呦小j女精品视频| 久久久久久av无码免费看大片| 粉嫩蜜臀av国产精品网站| 国产视频中文字幕在线观看| 精品国产一区二区三区久久久| 一色桃子久久精品亚洲| 精品中文字幕一区二区三区| 欧美性猛交xxxx乱大交91| 美日韩中文字幕| 色综合视频网站| 日本在线观看视频网站| 久久精品久久久久久国产 免费| 日韩一区二区三区av|