使用 Puppeteer (https://github.com/GoogleChrome/puppeteer https://github.com/GoogleChrome/puppeteer),我有一个页面是申请/pdf. With headless: false
,页面是通过 Chromium PDF 查看器加载的,但我想使用 headless。如何下载原始 .pdf 文件或将其用作另一个库的 blob,例如 (pdf-parsehttps://www.npmjs.com/package/pdf-parse https://www.npmjs.com/package/pdf-parse)?
由于 Puppeteer 目前不支持通过无头模式导航到 PDF 文档page.goto() https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagegotourl-options因为上游问题 https://bugs.chromium.org/p/chromium/issues/detail?id=761295, 您可以使用page.setRequestInterception() https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagesetrequestinterceptionvalue启用请求拦截,然后就可以监听'request' https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#event-request事件并在使用请求客户端获取PDF缓冲区之前检测资源是否为PDF。
获得PDF缓冲区后,可以使用request.abort() https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#requestaborterrorcode要中止原始 Puppeteer 请求,或者如果请求不是 PDF,您可以使用request.continue() https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#requestcontinueoverrides正常继续请求。
这是一个完整的工作示例:
'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();
})();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)