说明:
- 公司服务器是centos7
- 前端vue
1. 安装Puppeteer
npm install puppeteer --unsafe-perm=true
(要加--unsafe-perm=true
否则会提示权限不足)
2. 安装Puppeteer依赖
先根据服务器安装的系统安装相关Puppeteer
依赖,防止启动Puppeteer
失败。
3. 生成pdf代码
const puppeteer = require('puppeteer');
const account = 'xxxx';
const password = 'xxxxxx';
module.exports = {
printPdf: async function (id,callBack) {
const browser = await puppeteer.launch({ headless: true, args:['--no-sandbox']});//打开浏览器
const page = await browser.newPage();//打开一个空白页
await page.setViewport({width: 1920, height: 720}); // 设置视窗
await page.goto('http://example.com/login',{ waitUntil: 'networkidle0' });
// 输入账号密码
await page.type(".ant-form-item:nth-child(1) .ant-input", account);
await page.type(".ant-form-item:nth-child(2) .ant-input", password);
// 登录
await page.click('.login-form-button'),
await page.waitForNavigation({ waitUntil: 'networkidle0' }),
// 跳到报告页面
await page.goto(`http://example.com/report/${id}`,{ waitUntil: 'networkidle0' });
await page.pdf({
path: 'res.pdf',
printBackground:true,
format:'A4',
margin:{
left:'5px',
right:'5px',
}
});
//关掉浏览器
console.log('完成');
await browser.close()
}
}
4. node接口
const http= require('http');
const url = require("url");
const querystring = require("querystring");
const fs= require('fs');
const printFn = require('./print-pdf.js')
const secret = require('./secret') // 使用crypto-js解密id 这步骤可以省略
const server= http.createServer(function(request, response,next){
// 设置跨域
response.setHeader("Access-Control-Allow-Origin","*");
//允许的header类型
response.setHeader("Access-Control-Allow-Headers","*");
//跨域允许的请求方式
response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
if(request.method === "OPTIONS"){return response.end();}
// 获取参数
const requestUrl = request.url;
const arg = url.parse(request.url).query;
const params = querystring.parse(arg);
if(requestUrl.indexOf( '/printPdf')>=0){
let id = secret.Decrypt(params.id) // 解密id
printFn.printPdf(id).then(r=>{
fs.readFile('./res.pdf', function(err, data){
if(!err){
// encode name 因为filename不能中文
let realName = encodeURI(params.name,"GBK")
realName = realName.toString('iso8859-1')
// 返回pdf文件
response.setHeader("Content-Type","application/pdf");
response.setHeader("Content-Disposition","attachment; filename="+realName+'.pdf' )
response.end(data);
}else{
response.end(JSON.stringify(err));
}
});
})
}
})
server.listen(8004)
总结
这次接触Puppeteer
,安装使用的时候各种报错,好在github
都有这种issue
,能够找到解决方案。这次也是第一次接触node
,用node
写接口,遇到跨域问题,返回请求头的问题等等。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!