基于Puppeteer实现地图打印输出

简介: 一 Puppeteer简介Puppeteer.js是谷歌官方推出的一个nodejs库,它提供了一组用来操纵Chrome的API(默认headless也就是无UI的chrome,也可以配置为有UI),有点类似于PhantomJS,但Puppeteer是Chrome官方团队进行维护的,前景更好。

一 Puppeteer简介

Puppeteer.js是谷歌官方推出的一个nodejs库,它提供了一组用来操纵Chrome的API(默认headless也就是无UI的chrome,也可以配置为有UI),有点类似于PhantomJS,但Puppeteer是Chrome官方团队进行维护的,前景更好。使用Puppeteer,相当于同时具有Linux和Chrome的能力,应用场景会非常多。就爬虫领域来说,远比一般的爬虫工具功能更丰富,性能分析、自动化测试也不在话下。官方列出的主要功能如下:

  • 利用网页生成PDF、图片
  • 爬取SPA应用,并生成预渲染内容(即“SSR” 服务端渲染)'
  • 可以从网站抓取内容
  • 自动化表单提交、UI测试、键盘输入等
  • 帮你创建一个最新的自动化测试环境(chrome),可以直接在此运行测试用例
  • 捕获站点的时间线,以便追踪你的网站,帮助分析网站性能问题
    安装如下很简单:
npm install puppeteer

二 输出地图图片

在工程项目中,常常有导出地图图片保存的需求,这种需求很多时候,直接在前端canvas渲染图片导出即可,参考:OpenLayers3关于Map Export的Canvas跨域,但很多时候,Map的Layer来源很多,有公网第三方网站的,有工程自己服务器的,并不是每个地图服务器都支持cors操作,canvas渲染常常无法使用,而使用服务端请求出图也是一种可选方案。

测试以本地的一个web页面为准:

img_636bfc53c016eea27d384cc795a5d829.png
测试页面.png

废话不多说,直接上代码:

const puppeteer = require('puppeteer');
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    
    //登录地图网页
    await page.goto('http://localhost:63342/%E7%89%B9%E6%95%88demo/Gansu.html');
        
    //根据页面上下文,获取map div的宽高  
    let result = await page.evaluate((divid) => {
        let mapdiv=document.querySelector(`#${divid}`);
        let width= parseInt(mapdiv.offsetWidth);
        let height=parseInt(mapdiv.offsetHeight);
        return Promise.resolve([width,height]);
    }, 'map');
    console.log(result); 
    
    //等待1.2秒
    await sleep(1200);
    //print png
    await page.screenshot({
        path: 'clickbd.png',
        //fullPage与clip使用时互斥
        //fullPage: true,  //整页输出
        //只clip出map div的范围输出地图
        clip:{
            x:0,
            y:0,
            width:result[0],
            height:result[1]
        }
    });
    browser.close();
})();


function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

以上代码保存为工程中,起名叫print.js,然后执行:

node print.js

等待之后,输出结果如下:

img_c21bf0b7d70ad967c85aaccfb0c3f271.png
结果.png

本文只简单介绍下Puppeteer,可以预见,将来会越来越火,毕竟是chrome官方维护的库,比同类产品牌子更大。

相关文章
|
1月前
|
JavaScript 前端开发 物联网
文本,Vue实现打印的方式,打印机的种类有多少,浏览器打印html,右键,2打印插件,3指令打印,vue-print-nb
文本,Vue实现打印的方式,打印机的种类有多少,浏览器打印html,右键,2打印插件,3指令打印,vue-print-nb
|
10月前
|
定位技术 Python
Python根据经纬度在地图上显示(folium)
Python根据经纬度在地图上显示(folium)
256 0
Python根据经纬度在地图上显示(folium)
|
3月前
|
JavaScript
Vue实现预览PDF并且支持打印,不会出现乱码、拉升变形、打印预览被切割等弱智问题
Vue实现预览PDF并且支持打印,不会出现乱码、拉升变形、打印预览被切割等弱智问题
|
XML JSON 定位技术
干货 | Python调用百度地图API获取各点的经纬度信息(两种方式)
干货 | Python调用百度地图API获取各点的经纬度信息(两种方式)
2019 0
干货 | Python调用百度地图API获取各点的经纬度信息(两种方式)
|
数据可视化 定位技术
怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)2
怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)
476 0
怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)2
|
XML JSON 数据可视化
怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)
怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)
524 0
怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)
Vue2 中使用C-Lodop打印控件时无法调整二维码大小问题
Vue2 中使用C-Lodop打印控件时无法调整二维码大小问题,打印模板里配置的二维码是偏小的,但是在页面使用打印的时候打印预览的二维码不是预期大小
219 0
Vue2 中使用C-Lodop打印控件时无法调整二维码大小问题
|
Web App开发 数据采集 前端开发
分享一个Chrome控制台数据获取的例子
讲了一下获取Chrome控制台数据的前因后果
453 0
|
Web App开发 BI Windows
echarts 统计图如何实现打印导出
echarts 统计图如何实现打印导出
1680 0
|
Python
小技巧:with用法 pycharm控制台输出带颜色的文字 打印进度条的
with用法 with用法在python中是一个很独特的用法,因为别的语言的中没有这个用法。所以针对这个特点我们来做一次总结,什么样的情况下可以同with  我们学到的有文件的操作,和acquire   release 说道with首先要引入一个概念:上下文管理协议,支持该协议的对象内部要实现__enter__ ()          __exit__()  这两种方法            只要实现了这两种方法的对象,在做打开和关闭的操作时我们就可以直接用with来操作。
2485 0