最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Puppeteer生成pdf

    正文概述 掘金(Harry-qi)   2020-12-04   892

    说明:

    1. 公司服务器是centos7
    2. 前端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写接口,遇到跨域问题,返回请求头的问题等等。


    起源地下载网 » Puppeteer生成pdf

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元