我尝试使用 puppeteer 下载 PDF 文件,但每次 Google Chrome 工具栏出现时,即使我使用纯 PDF 下载链接。
我尝试使用此代码下载 PDF:
public async downloadPdf() {
const browser = await puppeteer.launch(
{
headless: true, args: [
'--no-sandbox', '--disable-setuid-sandbox']
}
);
const url = "https://notability.com/n/download/pdf/1_tGACBM45Y8SBARa88w_J/Note%203.%20Oct%202024.pdf"
const page = await browser.newPage();
await page.goto(url, {waitUntil: "networkidle2"});
const pdf = await page.pdf()
await browser.close();
return Buffer.from(pdf);
}
输出如下所示:
但它应该看起来像这样:
有没有办法只下载文件而不使用工具栏?
这是浏览器自动化的误用。如果您有一个简单的文件 URL,只需使用 Node 内置的
fetch
下载即可:
const fs = require("fs");
const {Readable} = require("stream");
const {finished} = require("stream/promises");
const url =
"https://notability.com/n/download/pdf/1_tGACBM45Y8SBARa88w_J/Note%203.%20Oct%202024.pdf";
const stream = fs.createWriteStream("output.pdf");
(async () => {
const {body} = await fetch(url);
await finished(Readable.fromWeb(body).pipe(stream));
})();
这是此代码的 URL 插入。我通常会将其标记为欺骗,但在这种情况下它可能很有用,因为 Puppeteer 经常被误用于此。
如果您需要在访问 PDF 之前完成登录流程,您可以从浏览器运行提取或将必要的标头和 cookie 拉入 Node,从浏览器提取格式复制,仍然避免使用
page.pdf()
,主要用于将 HTML 视图转换为 PDF。 PDF 已经是 PDF,因此 page.pdf()
绝对是最后的手段,就像截取 jpeg 的屏幕截图一样。