【问题标题】:How to download PDF blob using puppeteer?如何使用 puppeteer 下载 PDF blob?
【发布时间】:2020-12-30 06:38:57
【问题描述】:

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

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

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

注意:我使用的是{ headless: false } 模式。

【问题讨论】:

    标签: node.js pdf download puppeteer


    【解决方案1】:

    试图模拟案例:

    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(); */ }
    

    【讨论】:

      猜你喜欢
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 2016-05-14
      • 2018-12-01
      • 1970-01-01
      • 2019-05-01
      • 2022-01-22
      相关资源
      最近更新 更多