如何使用 puppeteer 下载 PDF blob?

How to download PDF blob using puppeteer?

单击下载按钮后,将打开一个新选项卡,用户可以在其中查看 PDF 报表。

这个新标签有一个 URL 以 blob: 开头,例如:blob:https://some-domain.com/statement-id

如何将此 PDF 声明下载到文件系统?

注意:我正在使用 { headless: false } 模式。

正在尝试模拟案例:

import puppeteer from 'puppeteer';
import { writeFileSync } from 'fs';

// Minimal PDF from https://github.com/mathiasbynens/small#documents
const minimalPdf = `%PDF-1.
1 0 obj<</Pages 2 0 R>>endobj
2 0 obj<</Kids[3 0 R]/Count 1>>endobj
3 0 obj<</Parent 2 0 R>>endobj
trailer <</Root 1 0 R>>`;

const browser = await puppeteer.launch({ headless: false, defaultViewport: null });

try {
  const [page] = await browser.pages();
  await page.goto('http://example.com/');

  await page.evaluate((pdf) => {
    const url = URL.createObjectURL(new Blob([pdf], {type: 'application/pdf'}));
    window.open(url);
  }, minimalPdf);

  const newTarget = await page.browserContext().waitForTarget(
    target => target.url().startsWith('blob:')
  );
  const newPage = await newTarget.page();
  const blobUrl = newPage.url();
  page.once('response', async (response) => {
    console.log(response.url());
    const pdfBuffer = await response.buffer();
    console.log(pdfBuffer.toString());
    console.log('same:', pdfBuffer.toString() === minimalPdf);
    writeFileSync('minimal.pdf', pdfBuffer);
  });
  await page.evaluate((url) => { fetch(url); }, blobUrl);

} catch(err) { console.error(err); } finally { /* await browser.close(); */ }