Puppeteer PDF Download funktioniert nicht richtig?
Moin,
ich versuche von einer Webseite mit Puppeteer eine Pdf herunterzuladen, aber es werden immer die Google Chrom Toolbar usw. mit angezeigt in dem gedownloadeten PDF-File. Mein Code:
public async downloadPdfUrl() {
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);
}
Und hier die PDF die herauskommt
1 Antwort
Die .pdf() Funktion speichert die Webseite so, wie sie dargestellt ist, als pdf (etwa wie im Browser mit strg+p).
Anscheinend ist die Funktion, eine Ressource herunterzuladen, in Puppeteer noch nicht ganz ausgereift: https://github.com/puppeteer/puppeteer/issues/299.
Hier einen Browser einzusetzen, macht aber auch wenig Sinn, wenn nicht Sicherheitsmechanismen wie Captchas vor dem Download stehen. Du kannst diese Ressource direkt mit einem http Request anfragen; dazu können Pakete wie urllib oder requests verwendet werden.
public downloadPDf() {
const url = "https://notability.com/n/download/pdf/1_tGACBM45Y8SBARa88w_J/Note%203.%20Oct%202024.pdf"
axios.get(url, {
responseType: 'arraybuffer'
}).then((response) => {
const blob = new Blob([response.data], {type: 'application/pdf'})
/*
.............
*/
})
}
Fehler in der Console:
Access to XMLHttpRequest at 'https://notability.com/n/download/pdf/1_tGACBM45Y8SBARa88w_J/Note%203.%20Oct%202024.pdf' from origin 'app://obsidian.md' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Laut pypi ist das axios Paket nicht dafür geeignet, jegliche Dateien herunterzuladen, sondern nur von einem bestimmten Cloud-Service: https://pypi.org/project/axios/
Von dort aus kannst du die Datei natürlich nicht erreichen.
Mit node.js bekomme ich folgende Ausgabe:
const axios = require("./axios.min.js").default;
const url =
"https://notability.com/n/download/pdf/1_tGACBM45Y8SBARa88w_J/Note%203.%20Oct%202024.pdf";
axios
.get(url, {
responseType: "arraybuffer",
})
.then((response) => {
const blob = new Blob([response.data], { type: "application/pdf" });
console.log(blob);
});
=>
Blob { size: 67921, type: 'application/pdf' }
Danke für den Hinweis! Bezüglich der HTTP Anfrage, gibt es aber ein Problem. Wenn ich die PDF so anfrage gibt es einen cors error: access-control-allow-origin