Кукловод - Как я могу получить текущую страницу (application / pdf) в виде буфера или файла? - PullRequest
0 голосов
/ 26 ноября 2018

Использование Puppeteer (https://github.com/GoogleChrome/puppeteer), У меня есть страница, которая application / pdf . При headless: false страница загружается через Chromium PDF Viewer, ноЯ хочу использовать безголовый. Как я могу скачать оригинальный файл .pdf или использовать в качестве большого двоичного объекта с другой библиотекой, такой как (pdf-parse https://www.npmjs.com/package/pdf-parse)?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Решение Гранта Миллера у меня не сработало, потому что я зашел на сайт.Но если PDF-файл является общедоступным, это решение работает хорошо.

Решение для моего случая заключалось в добавлении файлов cookie

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

0 голосов
/ 27 ноября 2018

Поскольку Puppeteer в настоящее время не поддерживает навигацию к документу PDF в режиме без заголовка с помощью page.goto() из-за проблемы в восходящем направлении , вы можете использовать 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();
})();
...