2 votes

Puppeteer - Comment puis-je obtenir la page actuelle (application/pdf) en tant que tampon ou fichier ?

Utilisation de Puppeteer ( https://github.com/GoogleChrome/puppeteer ), j'ai une page qui est une application/pdf . Avec headless: false La page est chargée par le visualisateur PDF de Chromium, mais je veux utiliser le système sans tête. Comment puis-je télécharger le fichier .pdf original ou l'utiliser en tant que blob avec une autre bibliothèque, telle que (pdf-parse) ? https://www.npmjs.com/package/pdf-parse )?

2voto

Grant Miller Points 6261

Puisque Puppeteer ne supporte pas actuellement la navigation vers un document PDF en mode sans tête via page.goto() en raison de la problème en amont vous pouvez utiliser page.setRequestInterception() pour activer l'interception des requêtes, et ensuite vous pouvez écouter pour le 'request' et détecter si la ressource est un PDF avant d'utiliser le client de demande pour obtenir le tampon PDF.

Après avoir obtenu le tampon PDF, vous pouvez utiliser request.abort() pour interrompre la demande originale de Puppeteer, ou si la demande n'est pas pour un PDF, vous pouvez utiliser request.continue() pour poursuivre la demande normalement.

Voici un exemple complet et fonctionnel :

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

1voto

Eduardo Conte Points 857

La solution de Grant Miller n'a pas fonctionné pour moi car j'étais connecté au site web. Mais si le pdf est public, cette solution fonctionne bien.

La solution pour mon cas a été d'ajouter les cookies

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X