69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
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();
|
|
} |