Puppeteer-如何获取当前页面(应用程序/ pdf)作为缓冲区或文件?

时间:2018-11-26 18:56:35

标签: javascript node.js pdf buffer puppeteer

使用木偶(https://github.com/GoogleChrome/puppeteer),我的页面是 application / pdf 。使用headless: false时,页面是通过Chromium PDF查看器加载的,但是我想使用headless。如何下载原始.pdf文件或如何与其他库(例如(pdf-parse https://www.npmjs.com/package/pdf-parse))一起使用?

2 个答案:

答案 0 :(得分:1)

由于page.goto(),由于Puppeteer当前不支持通过upstream issue以无头模式导航到PDF文档,因此您可以使用page.setRequestInterception()启用请求拦截,然后您可以收听'request'事件,并在使用请求客户端获取PDF缓冲区之前检测资源是否为PDF。

获取PDF缓冲区后,您可以使用request.abort()中止原始的Puppeteer请求,或者如果该请求不是针对PDF的,则可以使用request.continue()正常继续该请求。

这是一个完整的示例:

'use strict';

const puppeteer = require('puppeteer');
const request_client = require('request-promise-native');

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

  await page.setRequestInterception(true);

  page.on('request', request => {
    if (request.url().endsWith('.pdf')) {
      request_client({
        uri: request.url(),
        encoding: null,
        headers: {
          'Content-type': 'applcation/pdf',
        },
      }).then(response => {
        console.log(response); // PDF Buffer
        request.abort();
      });
    } else {
      request.continue();
    }
  });

  await page.goto('https://example.com/hello-world.pdf').catch(error => {});

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

答案 1 :(得分:0)

Grant Miller的解决方案对我不起作用,因为我已登录网站。但是,如果pdf是公开的,则此解决方案效果很好。

我的案例的解决方案是添加cookie

await page.setRequestInterception(true);

page.on('request', async request => {
    if (request.url().indexOf('exibirFat.do')>0) { //This condition is true only in pdf page (in my case of course)
      const options = {
        encoding: null,
        method: request._method,
        uri: request._url,
        body: request._postData,
        headers: request._headers
      }
      /* add the cookies */
      const cookies = await page.cookies();
      options.headers.Cookie = cookies.map(ck => ck.name + '=' + ck.value).join(';');
      /* resend the request */
      const response = await request_client(options);
      //console.log(response); // PDF Buffer
      buffer = response;
      let filename = 'file.pdf';
      fs.writeFileSync(filename, buffer); //Save file
   } else {
      request.continue();
   }
});