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

问题描述

使用 Puppeteer ( https://github.com/GoogleChrome/puppeteer ),我有一个页面是application/pdf。使用headless: false,页面是通过 Chromium PDF 查看器加载的,但我想使用无头。如何下载原始 .pdf 文件或作为 blob 与另一个库一起使用,例如 (pdf-parse https://www.npmjs.com/package/pdf-parse )?

标签: javascriptnode.jspdfbufferpuppeteer

解决方案


page.goto()由于上游问题, Puppeteer 目前不支持通过无头模式导航到 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();
})();

推荐阅读