使用木偶(https://github.com/GoogleChrome/puppeteer),我的页面是 application / pdf 。使用headless: false
时,页面是通过Chromium PDF查看器加载的,但是我想使用headless。如何下载原始.pdf文件或如何与其他库(例如(pdf-parse https://www.npmjs.com/package/pdf-parse))一起使用?
答案 0 :(得分:1)
由于page.goto()
,由于Puppeteer当前不支持通过upstream issue以无头模式导航到PDF文档,因此您可以使用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();
})();
答案 1 :(得分:0)
Grant Miller的解决方案对我不起作用,因为我已登录网站。但是,如果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();
}
});