幾行代碼實(shí)現(xiàn)網(wǎng)頁轉(zhuǎn)pdf和整頁截圖

原文鏈接:https://www.xbext.com/docs/devopt/using-puppeter-convert-webpage-to-pdf-and-fullpage-screenshot/

最近需要為x瀏覽器 提供一個(gè)網(wǎng)頁轉(zhuǎn)PDF的服務(wù),鑒于X瀏覽器定位是一個(gè)簡(jiǎn)潔輕便的手機(jī)瀏覽器產(chǎn)品蚜锨,所以打算在服務(wù)端實(shí)現(xiàn)這一功能,同時(shí)為了更好的為X瀏覽器客戶端服務(wù)苫幢,所以準(zhǔn)備自己嘗試搭建這么一套服務(wù)岔霸。去年的時(shí)候曾經(jīng)看到過關(guān)于Puppeteer的相關(guān)文章趋距,知道通過這個(gè)產(chǎn)品可以實(shí)現(xiàn)網(wǎng)頁轉(zhuǎn)pdf以及生成整頁截圖月劈。這篇文章用來記錄如何使用這組件來搭建一個(gè)網(wǎng)頁轉(zhuǎn)pdf的服務(wù)呜袁。

什么是Puppeteer

Puppeteer 是由GoogleChrome團(tuán)隊(duì)維護(hù)的一套基于NodeJs的API用于操控HeadLess Chrome 敌买。headless chrome其實(shí)是一個(gè)沒有UI界面的Chrome瀏覽器,除此之外幾乎和真正的Chrome沒有差別阶界。這時(shí)候你可能會(huì)奇怪沒有界面的Chrome怎么用胺怕琛?是的對(duì)于普通用戶來講Headless Chrome確實(shí)無法使用荐操,但是對(duì)于一些自動(dòng)化測(cè)試的場(chǎng)景使用Headless Chrome就太方便了。我們只要通過命令行就可以對(duì)Chrome進(jìn)行操控完成普通瀏覽器所用使用場(chǎng)景珍策,打開頁面托启,填寫表單,點(diǎn)擊按鈕攘宙,甚至模擬鼠標(biāo)及觸屏屯耸,都完全不在話下。

Puppeteer提供了一套完備的API使我們我們可以方便的操控Chrome蹭劈,我們通過UI界面可以完成的操作都可以通過Puppeteer來實(shí)現(xiàn)疗绣。

下面介紹如何安裝Puppeteer以及使用Puppeteer提供整頁截圖和生成pdf文件。

在Linux環(huán)境下部署Puppeteer

為了安裝部署方便铺韧,我們選擇ubutun 18.04作為后臺(tái)服務(wù)多矮,在這之前我需要先安裝NodeJs運(yùn)行環(huán)境,Puppeteer的一些最新特性需要在Node v7.6.0 或更高版本中才被支持哈打。所以我們選擇安裝NodeJs的8.x版本塔逃。

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

安裝Puppeteer

mkdir puppeteer-demo
cd puppeteer-demo
npm i  puppeteer

安裝的過程中會(huì)自動(dòng)下載HeadlessChrom, 完整安裝后我們可以通過下面的腳本測(cè)試puppeteer 是否可以和HeadlessChrom一起正常工作。

//version.js
const puppeteer = require('puppeteer');
(async() => {
  const browser = await puppeteer.launch();
  console.log(await browser.version());
  await browser.close();
})();

運(yùn)行腳本

node verison.js

工作正常的話會(huì)顯示headless chromed的版本號(hào)

HeadlessChrome/79.0.3945.0

轉(zhuǎn)換網(wǎng)頁到pdf格式

下面的代碼展示了使用Puppeteer如何把網(wǎng)頁轉(zhuǎn)換為pdf格式.

const puppeteer = require('puppeteer');

(async() => {
const browser = await puppeteer.launch();
const page = await browser.newPage();

await page.goto('https://www.xbext.com', {waitUntil: 'networkidle2'});
await page.pdf({path: 'page.pdf', format: 'A4'});

await browser.close();
})();

生成整頁網(wǎng)頁截圖

下面代碼展示了如何模仿手機(jī)作為請(qǐng)求料仗,并且生成整個(gè)網(wǎng)頁的截圖

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  let page = await browser.newPage();
  const userAgent = "Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36";
  page.setUserAgent(userAgent);
  
  //await page.setViewport({ width: 1920, height: 1080 });

  await page.setViewport({ width: 480, height: 800,isMobile: true}); 

  await page.goto('https://www.xbext.com',{waitUntil: 'networkidle2'});

  await page.screenshot({path: 'myscreeshot.png',fullPage: true});
  //如圖片過大可以通過生成.jpg文件并且控制圖標(biāo)質(zhì)量
  //await page.screenshot({path: 'myscreeshot.jpg',fullPage: true,quality: 80});
  await browser.close();
})();

相關(guān)問題

運(yùn)行puppeteer腳本時(shí)候無法啟動(dòng)Chrome ,提示如下錯(cuò)誤

chrome-linux/chrome: error while loading shared libraries: libasound.so.2

安裝缺失的庫即可

sudo apt-get install libasound2

無法渲染中文

生成pdf或截圖的時(shí)候湾盗,中文字符顯示為一個(gè)個(gè)小方塊,是因?yàn)槿笔е形淖煮w文件立轧,導(dǎo)致chromium無法正常渲染格粪,使用下面的命令安裝即可.

sudo apt-get install language-pack-zh*
sudo apt-get install chinese*

參考資料

https://developers.google.com/web/updates/2017/04/headless-chrome

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躏吊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帐萎,更是在濱河造成了極大的恐慌比伏,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吓肋,死亡現(xiàn)場(chǎng)離奇詭異凳怨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)是鬼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門肤舞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人均蜜,你說我怎么就攤上這事李剖。” “怎么了囤耳?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵篙顺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我充择,道長(zhǎng)德玫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任椎麦,我火速辦了婚禮宰僧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘观挎。我一直安慰自己琴儿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布嘁捷。 她就那樣靜靜地躺著造成,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雄嚣。 梳的紋絲不亂的頭發(fā)上晒屎,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音缓升,去河邊找鬼夷磕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仔沿,可吹牛的內(nèi)容都是我干的坐桩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼封锉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绵跷!你這毒婦竟也來了膘螟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤碾局,失蹤者是張志新(化名)和其女友劉穎荆残,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體净当,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡内斯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了像啼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俘闯。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忽冻,靈堂內(nèi)的尸體忽然破棺而出真朗,到底是詐尸還是另有隱情,我是刑警寧澤僧诚,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布遮婶,位于F島的核電站,受9級(jí)特大地震影響湖笨,放射性物質(zhì)發(fā)生泄漏旗扑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一慈省、第九天 我趴在偏房一處隱蔽的房頂上張望臀防。 院中可真熱鬧,春花似錦辫呻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缕坎,卻和暖如春怖侦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谜叹。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工匾寝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荷腊。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓艳悔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親女仰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猜年,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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