【问题标题】:How to download a pdf that opens in a new tab in puppeteer?如何下载在 puppeteer 的新选项卡中打开的 pdf?
【发布时间】:2020-09-23 04:12:20
【问题描述】:

我有一个带有按钮的页面。当我单击该按钮时,它会在新选项卡中打开 PDF。

如何使用 puppeteer 将 PDF 下载为文件?

也许我可以从新选项卡中用缓冲区写入文件。但我不确定如何。

【问题讨论】:

    标签: javascript node.js web-scraping puppeteer


    【解决方案1】:

    一个简单的解决方案是使用fetch api 来执行GET 请求。这样您就可以读取响应,将其传递到后端并将其保存到磁盘。

    使用此示例代码作为参考:

    import fs from 'fs';
    
    async function downloadImage(page: any, url: string, fullpath: string) {
      const data = await page.evaluate(
        // tslint:disable-next-line no-shadowed-variable
        async ({ url }) => {
          function readAsBinaryStringAsync(blob) {
            return new Promise((resolve, reject) => {
              const fr = new FileReader();
              fr.readAsBinaryString(blob);
              fr.onload = () => {
                resolve(fr.result);
              };
            });
          }
    
          const r = await fetch(url, {
            credentials: 'include',
            headers: {
              accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp, */*;q=0.8',
              'cache-control': 'no-cache',
              pragma: 'no-cache',
              'sec-fetch-mode': 'navigate',
              'sec-fetch-site': 'same-site',
              'upgrade-insecure-requests': '1'
            },
            referrerPolicy: 'no-referrer-when-downgrade',
            body: null,
            method: 'GET',
            mode: 'cors'
          });
    
          return await readAsBinaryStringAsync(await r.blob());
        },
        { url }
      );
    
      fs.writeFileSync(fullpath, data, { encoding: 'binary' });
    }
    
    

    【讨论】:

      【解决方案2】:

      使用 puppeteer-extra 节点模块。

      Puppeteer-extra

      const puppeteer = require('puppeteer-extra');
      ...
      ...
      puppeteer.use(require('puppeteer-extra-plugin-user-preferences')({userPrefs: {
         download: {
           prompt_for_download: false,
           open_pdf_in_system_reader: true
        },
        plugins: {
          always_open_pdf_externally: true // this should do the trick
        }
      }}))
      
      const browser = await puppeteer.launch();
      
      browser.on('targetcreated', async (target) => {
         console.log('targetcreated');
         if (target.type() !== 'page') {
           return;
         }
         try {
           const pageList = await browser.pages();
           pageList.forEach((page) => {
             page._client.send('Page.setDownloadBehavior', {
               behavior: 'allow',
               downloadPath: './pdfDownloaded/',
             });
           });
         } catch (e) {
           console.log("targetcreated", e);
         }
      });
      ...
      ...
      

      但是当我设置always_open_pdf_externally: true chrome 崩溃时。

      如果它适合你,请尝试,如果你找到任何答案,请回复

      【讨论】:

      • 这个解决方案对我有用。谢谢@Mallikarjun!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 2021-09-09
      • 2021-12-02
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多