javascript - Puppeteer - 如何获取当前页面(应用程序/pdf)作为缓冲区或文件?
问题描述
使用 Puppeteer ( https://github.com/GoogleChrome/puppeteer ),我有一个页面是application/pdf。使用headless: false
,页面是通过 Chromium PDF 查看器加载的,但我想使用无头。如何下载原始 .pdf 文件或作为 blob 与另一个库一起使用,例如 (pdf-parse https://www.npmjs.com/package/pdf-parse )?
解决方案
page.goto()
由于上游问题, Puppeteer 目前不支持通过无头模式导航到 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();
})();
推荐阅读
- angular - Typescript 如何从嵌套对象获取器返回类函数引用
- spring - 使用 BeanPostProcessor 将 RequestResponseBodyMethodProcessor 替换为 CustomMethodProcessor
- php - 希望循环遍历一组变量,如果它们存在则显示它们,然后用逗号分隔它们
- qt - 如何在应用程序启动时将 QML TableView 列的大小调整为其内容?
- python - 如何为 Pandas 中的每个行子集运行相关性?
- python - Python子进程回显未将引用的文本传递到文件末尾
- reactjs - 无法读取 null reactjs 的属性名称
- java - Android 位置管理器崩溃
- node.js - 快速更新某个html字段
- amazon-s3 - 在 S3 存储桶上附加文件