使用node express和puppeteer搭建的WEB截图服务
docker pull wuxue107/screenshot-api-server
## -e MAX_BROWSER=[num] 环境变量可选,最大的puppeteer实例数,忽略选项则默认值:1 , 值auto:[可用内存]/200M
## -e PDF_KEEP_DAY=[num] 自动删除num天之前产生的文件目录,默认0: 不删除文件
docker run -p 3000:3000 -td --rm -e MAX_BROWSER=1 -e PDF_KEEP_DAY=0 -v ${PWD}:/screenshot-api-server/public --name=screenshot-api-server wuxue107/screenshot-api-server
生成的dataUrl图片,如果过大,粘贴到浏览器地址栏上显示的图片有时会显示不完整。
并不是只截取了一半,而是因为浏览器URL浏长度限制的原因。
将其复制给图片scr属性,或保存为文件,则可以看到完整图片
{
// 要截图的网页 (pageUrl 、html 参数二选一)
"pageUrl":"https://gitee.com/wuxue107",
// 要截图的网页HTML (pageUrl 、html 参数二选一)
"html" : "",
// 要截取的节点选择器,可选,默认body
"element":"body",
// 超时时间,可选,默认:30000
"timeout": 30000,
// 检查页面是否渲染完成的js表达式,可选,默认: "true"
"checkPageCompleteJs": "document.readyState === 'complete'",
// 页面完成后(checkPageCompleteJs返回为true后)延迟的时间,可选,默认:0
"delay": 100,
// 浏览器视窗宽度、高度。在响应式布局中,有时会体现出不同样式
"width": 1920,
"height": 1280
}
{
"code": 0,
"msg": "success",
"data": {
"image": "data:image/png;base64,..."
}
}
{
// 要截图的网页 (pageUrl 、html 参数二选一)
"pageUrl":"https://gitee.com/wuxue107",
// 要截图的网页HTML (pageUrl 、html 参数二选一)
"html" : "",
// 要截取的节点选择器,可选,默认body
"elements": [".card"],
// 超时时间,可选,默认:30000
"timeout": 30000,
// 检查页面是否渲染完成的js表达式,可选,默认: "true"
"checkPageCompleteJs": "document.readyState === 'complete'",
// 页面完成后(checkPageCompleteJs返回为true后)延迟的时间,可选,默认:0
"delay": 100,
// 浏览器视窗宽度、高度。在响应式布局中,有时会体现出不同样式
"width": 1920,
"height": 1280
}
{
"code": 0,
"msg": "success",
"data": {
"images": {
".card": [
"data:image/png;base64,...",
]
}
}
}
根据 bookjs-eazy 模板片段生成PDF (Chrome Headless)
{
// PDF 配置:参考 <a href="https://gitee.com/wuxue107/bookjs-eazy#%E9%85%8D%E7%BD%AE%E9%A1%B5%E9%9D%A2%E5%8F%82%E6%95%B0" target="_blank">wuxue107/bookjs-eazy 配置页面参数</a>
"bookConfig": {
"pageSize": "ISO_A4",
"orientation": "portrait",
"padding": "20mm 10mm 20mm 10mm"
},
// 额外的css样式
"bookStyle" : `a{color:red;}`,
// 模板内容:参考 <a href="https://gitee.com/wuxue107/bookjs-eazy#pdf%E5%86%85%E5%AE%B9%E8%AE%BE%E8%AE%A1" target="_blank">wuxue107/bookjs-eazy 内容设计. #contentBox内部的HTML</a>
"bookTpl" : `<div data-op-type="new-page"></div><div data-op-type="pendants"><div class='pendant-title'>第一章:Echart图表</div></div><h1 data-op-type='block'>第1章 Echart图表</h1>`,
// 超时时间,可选,默认:30000
"timeout": 30000,
"delay": 100
}
- 响应,生成的pdf文件存放在web可挂载的web目录下,路径/pdf/xxxx.pdf
{
"code": 0,
"msg": "success",
"data": {
// 拼接上接口的前缀 http://localhost:3000/ 就是完整PDF地址
// http://localhost:3000/pdf/1614458263411-glduu.pdf
// 拼接上接口的前缀 http://localhost:3000/download/可以就可生成在浏览器上的下载链接
// http://localhost:3000/download/pdf/1614458263411-glduu.pdf
// 拼接上http://localhost:3000/static/js/pdfjs/web/viewer.html?file=/pdf/1614458263411-glduu.pdf
// 可使用pdfjs库进行预览
"file": "/pdf/1614458263411-glduu.pdf"
}
}
根据bookjs-eazy 网页生成PDF(Chrome Headless)
{
// 由bookjs-eazy制作的网页
"pageUrl": "https://bookjs.zhouwuxue.com/eazy-2.html",
// 超时时间,可选,默认:30000
"timeout": 30000,
// 页面完成后(checkPageCompleteJs返回为true后)延迟的时间,可选,默认:0
"delay": 100
}
- 响应,生成的pdf文件存放在web可挂载的web目录下,路径/pdf/xxxx.pdf
{
"code": 0,
"msg": "success",
"data": {
// 拼接上接口的前缀 http://localhost:3000/ 就是完整PDF地址
// http://localhost:3000/pdf/1614458263411-glduu.pdf
// 拼接上接口的前缀 http://localhost:3000/download/可以就可生成在浏览器上的下载链接
// http://localhost:3000/download/pdf/1614458263411-glduu.pdf
// 拼接上http://localhost:3000/static/js/pdfjs/web/viewer.html?file=/pdf/1614458263411-glduu.pdf
// 可使用pdfjs库进行预览
"file": "/pdf/1614458263411-glduu.pdf"
}
}
根据bookjs-eazy 网页生成PDF(wkhtmltopdf)
{
// 由bookjs-eazy制作的网页
"pageUrl": "https://bookjs.zhouwuxue.com/eazy-2.html",
// 超时时间,可选,默认:30000
"timeout": 30000,
// 页面完成后(checkPageCompleteJs返回为true后)延迟的时间,可选,默认:0
"delay" : 100,
// 纸张
"orientation": "portrait", // 纸张方向 "portrait","landscape"
"pageSize":"A4", // 纸张大小
// 或
"pageWidth" : "210", //mm
"pageHeight" : "297",
}
- 响应,生成的pdf文件存放在web可挂载的web目录下,路径/pdf/xxxx.pdf
{
"code": 0,
"msg": "success",
"data": {
// 拼接上接口的前缀 http://localhost:3000/ 就是完整PDF地址
// http://localhost:3000/pdf/1614458263411-glduu.pdf
// 拼接上接口的前缀 http://localhost:3000/download/可以就可生成在浏览器上的下载链接
// http://localhost:3000/download/pdf/1614458263411-glduu.pdf
// 拼接上http://localhost:3000/static/js/pdfjs/web/viewer.html?file=/pdf/1614458263411-glduu.pdf
// 可使用pdfjs库进行预览
"file": "/pdf/1614458263411-glduu.pdf"
}
}
static/js
- bookjs/
latest/
bookjs-eazy.min.js
- pdfjs/
web/viewer.html?file=/pdf/2021-03-24/xxxx.pdf
- jquery.min.js
- lodash.min.js
- polyfill.min.js
{
// 要制作为PDF的网页 (pageUrl 、html 参数二选一)
"pageUrl":"https://gitee.com/wuxue107",
// 要截图的网页HTML (pageUrl 、html 参数二选一)
"html" : "<div>bookjs-eazy</div>",
// 超时时间,可选,默认:30000
"timeout": 30000,
// 检查页面是否渲染完成的js表达式,可选,默认: "true"
"checkPageCompleteJs": "true",
// 页面完成后(checkPageCompleteJs返回为true后)延迟的时间,可选,默认:0
"delay": 100
}
- 响应,生成的pdf文件存放在web可挂载的web目录下,路径/pdf/xxxx.pdf
{
"code": 0,
"msg": "success",
"data": {
// 拼接上接口的前缀 http://localhost:3000/ 就是完整PDF地址
// http://localhost:3000/pdf/1614458263411-glduu.pdf
// 拼接上接口的前缀 http://localhost:3000/download/可以就可生成在浏览器上的下载链接
// http://localhost:3000/download/pdf/1614458263411-glduu.pdf
// 拼接上http://localhost:3000/static/js/pdfjs/web/viewer.html?file=/pdf/1614458263411-glduu.pdf
// 可使用pdfjs库进行预览
"file": "/pdf/1614458263411-glduu.pdf"
}
}
- 放入web根目录./fonts下的所有字体文件,会在docker启动时自动加载。
- 为了加快截图或生成PDF速度,通常字体文件较大,下载耗时。防止渲染截图或PDF出现字体不一致情况,建议预先安装常用字体
- 如果是自己设计的页面,建议css设置字体时,优先使用字体原字体名,再使用网络字体别名,例如:
<style>
@font-face {
font-family: YH;
src: url(./fonts/msyh.ttf);
font-weight: 400;
font-style: normal
}
body {
font-family: "Microsoft YaHei", YH, sans-serif;
font-weight: normal;
}
</style>