Puppeteer PDF-下载在下载的文件中显示 Chrome 工具栏

问题描述 投票:0回答:1

我尝试使用 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);
    }

输出如下所示:

Output

但它应该看起来像这样:

Expected result

有没有办法只下载文件而不使用工具栏?

node.js typescript web-scraping puppeteer
1个回答
0
投票

这是浏览器自动化的误用。如果您有一个简单的文件 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 的屏幕截图一样。

© www.soinside.com 2019 - 2024. All rights reserved.