Nodejs將頁(yè)面轉(zhuǎn)換成pdf

前言:將頁(yè)面轉(zhuǎn)成pdf的方案有很多種罢荡,用node將頁(yè)面轉(zhuǎn)成pdf的方案的主要應(yīng)用場(chǎng)景是,本人在項(xiàng)目遇到批量導(dǎo)出pdf的功能紧索,并且導(dǎo)出的頁(yè)面是由前端寫的跷跪,所以主要實(shí)現(xiàn)的功能是需要配合后端實(shí)現(xiàn)批量導(dǎo)出pdf的功能

一、介紹nodejs插件

1. puppeteer

puppeteer 用于通過(guò)程序控制 Chrome 或 Chromium 瀏覽器齐板。通過(guò) Puppeteer吵瞻,你可以進(jìn)行各種自動(dòng)化任務(wù),比如網(wǎng)頁(yè)截圖甘磨、網(wǎng)頁(yè)內(nèi)容抓取橡羞、表單填充、模擬用戶交互等

npm install puppeteer
2. minimist

minimist是一個(gè) Node.js 輕量級(jí)的命令行參數(shù)解析庫(kù)济舆,用于解析命令行參數(shù)卿泽。它可以幫助你將命令行參數(shù)解析為易于處理的對(duì)象格式,使得在 Node.js 腳本中處理命令行參數(shù)變得更加簡(jiǎn)單和方便

npm install minimist

二滋觉、代碼demo (創(chuàng)建名為print.js的文件)

const puppeteer = require('puppeteer');
const arguments = require('minimist');
 
(async () => {
    // 執(zhí)行命令時(shí)签夭,可以通過(guò) --url='http://xxxxxx.com' 方式來(lái)獲取參數(shù)
    const prams = arguments(process.argv.slice(2));
    console.log('prams', prams);
    // 第一步:加載初始化一個(gè)新的 Chrome 或 Chromium 瀏覽器實(shí)例
    const browser = await puppeteer.launch({
        args: [
            '--no-sandbox', // 在某些環(huán)境中避免沙箱問(wèn)題
            '--disable-setuid-sandbox',// 可能需要在非標(biāo)準(zhǔn)環(huán)境下運(yùn)行
            '--disable-dev-shm-usage', // 解決Linux上內(nèi)存限制問(wèn)題
        ],
        ignoreHTTPSErrors: true,
        headless: true
    });
    // 第二步:創(chuàng)建一個(gè)新的頁(yè)面對(duì)象
    const page = await browser.newPage();

    // 設(shè)置額外的HTTP請(qǐng)求標(biāo)頭(Headers),如果需要token椎侠,添加token
    // await page.setExtraHTTPHeaders({
    //     'Authorization': token內(nèi)容
    // })

    // 第三步:通過(guò)命令行接受的url參數(shù)第租,加載前端pdf打印頁(yè)面
    await page.goto(
        // "http://192.168.40.29:3000/print.html",
        prams.url,
        {
            // timeout: 3000,
            waitUntil: 'networkidle0'
        }
    );
    /**
      1.  waitUntil: 參數(shù)用于指定 page.waitForNavigation()、page.waitForSelector() 和 page.waitForFunction() 等方法等待條件滿足的規(guī)則
      2.  load:等待整個(gè)頁(yè)面及其資源加載完成我纪。
      3.  domcontentloaded:等待頁(yè)面的 DOMContentLoaded 事件完成慎宾,即文檔解析完成,但不等待圖片等資源加載浅悉。
      4.  networkidle0:等待網(wǎng)絡(luò)狀態(tài)穩(wěn)定趟据,即沒(méi)有網(wǎng)絡(luò)連接數(shù)的變化,通常用于等待所有網(wǎng)絡(luò)連接都被關(guān)閉术健。
      5.  networkidle2:等待網(wǎng)絡(luò)空閑狀態(tài)汹碱,允許一段時(shí)間的網(wǎng)絡(luò)連接閑置,適用于大多數(shù)網(wǎng)頁(yè)荞估。
      6.  documentloaded:等待頁(yè)面文檔已加載(不包括樣式表咳促、圖片等資源)色难。
    */

    // 等待頁(yè)面中的 iframe 加載完成
    await page.waitForSelector('iframe'); // 可以根據(jù)具體的選擇器來(lái)等待特定的 iframe

    // 找到頁(yè)面所有的iframe并打印出iframe鏈接,frame.url()獲取frame的url
    // await page.frames().map(frame => {
    //     console.log('fffffff222', frame.url())
    // })

    //  第四步:將當(dāng)前頁(yè)面保存為 PDF 文件的
    // path參數(shù):頁(yè)面輸出的路徑
    await page.pdf({
        // path: './print.pdf',
        path: prams.path,
        format: 'A4',
        printBackground: true,
            preferCSSPageSize: true,
            displayHeaderFooter: true,
            format: 'A4',
            margin: {
                top: '2cm',
                bottom: '2cm'
            },
            // headerTemplate: `<div style="80%;text-align:right;margin-right: 20px;font-size:10px">頁(yè)頭</div>`,
            // footerTemplate: `<div style="80%;text-align:right;margin-right: 20px;font-size:10px">頁(yè)尾</div>`
        });
    // 第五步:關(guān)閉整個(gè)瀏覽器實(shí)例的方法
    await browser.close();
})()

三等缀、執(zhí)行命令

  • 前提是需要先安裝前面安裝兩個(gè)node插件
最后直接執(zhí)行命令 node print.js --url='http://xxxxxxxx/parint.html'枷莉,url地址為您需要打印的前端頁(yè)面
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市尺迂,隨后出現(xiàn)的幾起案子笤妙,更是在濱河造成了極大的恐慌,老刑警劉巖噪裕,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹲盘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡膳音,警方通過(guò)查閱死者的電腦和手機(jī)召衔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)祭陷,“玉大人苍凛,你說(shuō)我怎么就攤上這事”荆” “怎么了醇蝴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)想罕。 經(jīng)常有香客問(wèn)我悠栓,道長(zhǎng),這世上最難降的妖魔是什么按价? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任惭适,我火速辦了婚禮,結(jié)果婚禮上楼镐,老公的妹妹穿的比我還像新娘癞志。我一直安慰自己,他們只是感情好鸠蚪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布今阳。 她就那樣靜靜地躺著师溅,像睡著了一般茅信。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墓臭,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天蘸鲸,我揣著相機(jī)與錄音,去河邊找鬼窿锉。 笑死酌摇,一個(gè)胖子當(dāng)著我的面吹牛膝舅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窑多,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼仍稀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了埂息?” 一聲冷哼從身側(cè)響起技潘,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎千康,沒(méi)想到半個(gè)月后享幽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拾弃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年值桩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豪椿。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奔坟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搭盾,到底是詐尸還是另有隱情蛀蜜,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布增蹭,位于F島的核電站滴某,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏滋迈。R本人自食惡果不足惜霎奢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饼灿。 院中可真熱鬧幕侠,春花似錦、人聲如沸碍彭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)庇忌。三九已至舞箍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皆疹,已是汗流浹背疏橄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捎迫。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓晃酒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窄绒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贝次,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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