import puppeteer from "https://deno.land/x/puppeteer@9.0.2/mod.ts"; import { parse as argParse } from "https://deno.land/std@0.136.0/flags/mod.ts"; import {join as pathJoin} from "https://deno.land/std@0.136.0/path/mod.ts"; const executablePathMap = { windows: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", //"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", darwin: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", linux: "/usr/bin/chromium-browser", }; function findChromeDir(){ const dir = executablePathMap[Deno.build.os]; if (Deno.build.os === "linux"){ const pathes = Deno.env.get("PATH")?.split(";"); if(!pathes){ return dir; } for (const path of pathes){ const entries = [...Deno.readDirSync(path)]; const chrome = entries.find((entry) => entry.name === "chrome"); if(chrome) { return pathJoin(path, chrome.name); } } } return dir; } async function main() { const args = argParse(Deno.args); let { url, outDir, chromeDir } = args; if (!url) { console.error("No url provided."); Deno.exit(1); } outDir = outDir ?? "out.pdf"; if(!chromeDir) { console.log("No chromeDir provided. Try to find chrome."); chromeDir = findChromeDir(); console.log(`chromeDir: ${chromeDir}`); } const browser = await puppeteer.launch({ product: "chrome", headless: true, executablePath: chromeDir, }); const page = await browser.newPage(); console.log(`goto url ${url}`); await page.goto(url, { waitUntil: "networkidle2", }); await page.pdf({ path: outDir, margin: { bottom: "1cm", left: "1cm", right: "1cm", top: "1cm", } }); await browser.close(); } if (import.meta.main) { main(); }