Skip to content

Commit

Permalink
refactor: drop pagedjs
Browse files Browse the repository at this point in the history
  • Loading branch information
condorheroblog committed Apr 22, 2023
1 parent ed04b06 commit a16a3ed
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 230 deletions.
11 changes: 5 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "html-export-pdf-cli",
"type": "module",
"version": "0.3.4",
"packageManager": "pnpm@8.3.0",
"packageManager": "pnpm@8.3.1",
"description": "Render Html to PDFs using Pagedjs and Puppeteer.",
"author": "CondorHero",
"license": "MIT",
Expand Down Expand Up @@ -72,17 +72,16 @@
"commander": "^10.0.1",
"fast-glob": "^3.2.12",
"html-entities": "^2.3.3",
"pagedjs": "^0.4.1",
"pdf-lib": "1.17.1",
"puppeteer": "^19.9.1"
"puppeteer": "^19.10.1"
},
"devDependencies": {
"@antfu/eslint-config-ts": "^0.38.4",
"@antfu/eslint-config-ts": "^0.38.5",
"@types/cli-progress": "^3.11.0",
"@types/node": "^18.15.11",
"@types/node": "^18.15.13",
"bumpp": "^9.1.0",
"colorette": "^2.0.20",
"eslint": "^8.38.0",
"eslint": "^8.39.0",
"jiti": "^1.18.2",
"lint-staged": "^13.2.1",
"simple-git-hooks": "^2.8.1",
Expand Down
39 changes: 0 additions & 39 deletions src/browser/paged.ts

This file was deleted.

4 changes: 3 additions & 1 deletion src/commands/htmlExportPdf/htmlExportPdf.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ export async function htmlExportPdf(args: undefined | string[], options: HtmlExp
if (file && output) {
const isWrite = await writeFileSafe(output, file);
if (isWrite) {
progress.updateNumber(1);
progress.increment(1);
isSingleFile && process.stdout.write(`\n\n ${green(" ✓ ")}${dim("Saved to ")} ${output}\n\n`);
}
else { process.exit(1); }
Expand All @@ -156,7 +156,9 @@ export async function htmlExportPdf(args: undefined | string[], options: HtmlExp
}
return true;
});

await Promise.all(promises);
await printer.close();
progress.stop();
process.exit(0);
}
Expand Down
22 changes: 0 additions & 22 deletions src/core/postprocesser.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import type { PDFDocument } from "pdf-lib";
import pkg from "../../package.json";
import type { Page } from "../types";

interface Meta {
title?: string
Expand All @@ -14,27 +13,6 @@ interface Meta {
metadataDate?: Date | string
}

export function setTrimBoxes(pdfDoc: PDFDocument, pages: Page[]) {
const pdfPages = pdfDoc.getPages();

pdfPages.forEach((pdfPage, index) => {
const page = pages[index];

if (!page)
return; // page was not rendered

const { boxes } = page;

if (Object.is(boxes.media, boxes.crop))
return; // No bleed set

pdfPage.setTrimBox(boxes.crop.x,
boxes.crop.y,
boxes.crop.width + boxes.crop.x,
boxes.crop.height + boxes.crop.y);
});
}

export function setMetadata(pdfDoc: PDFDocument, meta: Meta) {
if (meta.keywords && typeof meta.keywords === "string")
meta.keywords = meta.keywords.split(",");
Expand Down
90 changes: 18 additions & 72 deletions src/core/printer.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,15 @@
import EventEmitter from "node:events";
import path from "node:path";

import type { Browser, Page as BrowserPage, PDFMargin, PDFOptions } from "puppeteer";
import type { Browser, PDFMargin, PDFOptions, Page } from "puppeteer";
import { PDFDocument } from "pdf-lib";
import puppeteer from "puppeteer";

import { getDirname } from "../utils";
import type { Page } from "../types";
import type { HtmlExportPdfOptions } from "../";
import { getOutline, setOutline } from "./outline";
import { setMetadata, setTrimBoxes } from "./postprocesser";
import { setMetadata } from "./postprocesser";

const scriptPath = path.resolve(getDirname(), "./paged.global.js");

interface PrinterOptions {
debug?: boolean
headless?: boolean
allowLocal?: boolean
allowRemote?: boolean
additionalScripts?: string[]
allowedPaths?: string[]
allowedDomains?: string[]
ignoreHTTPSErrors?: boolean
browserEndpoint?: string
browserArgs?: string[]
timeout?: number
closeAfter?: boolean
emulateMedia?: string
additionalStyles?: string[]
enableWarnings?: boolean
}
interface PrinterOptions {
export interface PrinterOptions {
debug?: boolean
headless?: boolean
allowLocal?: boolean
Expand Down Expand Up @@ -64,8 +43,7 @@ export class Printer extends EventEmitter {
private emulateMedia: string;
private additionalStyles: string[];
private enableWarnings: boolean;
private pages: Page[];
private page?: BrowserPage;
private pages: Map<string, Page>;
private browser?: Browser;
public content?: string;

Expand All @@ -88,7 +66,7 @@ export class Printer extends EventEmitter {
this.additionalStyles = options.additionalStyles ?? [];
this.enableWarnings = options.enableWarnings ?? false;

this.pages = [];
this.pages = new Map();

if (this.debug) {
this.headless = false;
Expand All @@ -98,6 +76,8 @@ export class Printer extends EventEmitter {

async setup() {
const puppeteerOptions = {
// https://github.com/puppeteer/puppeteer/issues/2735#issuecomment-470309033
// pipe: true,
headless: this.headless,
args: ["--disable-dev-shm-usage", "--export-tagged-pdf"],
ignoreHTTPSErrors: this.ignoreHTTPSErrors,
Expand All @@ -122,47 +102,13 @@ export class Printer extends EventEmitter {
return this.browser;
}

async renderPagedjs(options: HtmlExportPdfOptions) {
const page = this.page!;
if (options.pageSize)
await page.addStyleTag({ content: `@page { size: ${options.pageSize}; }` });

else if (options.width || options.height)
await page.addStyleTag({ content: `@page { size: ${options.width}; ${options.height}; }` });

await page.evaluate(() => {
window.PagedConfig = window.PagedConfig ?? {};
window.PagedConfig.auto = false;
});

await page.addScriptTag({
path: scriptPath,
});

await page.evaluate(async () => {
// tsup.config.ts format IIFE
const { previewer } = window.PagedPolyfill;

if (window.PagedConfig.before)
await window.PagedConfig.before();

const done = await previewer.preview();

if (window.PagedConfig.after)
await window.PagedConfig.after(done);
}).catch((error) => {
throw error;
});

await page.waitForSelector(".pagedjs_pages");
}

async render(input: string) {
if (!this.browser)
await this.setup();

try {
const page = this.page = await this.browser!.newPage();
const page = await this.browser!.newPage();
this.pages.set(input, page);
page.setDefaultTimeout(this.timeout);
await page.emulateMediaType(this.emulateMedia);

Expand Down Expand Up @@ -226,10 +172,13 @@ export class Printer extends EventEmitter {
}

async pdf(input: string, options: HtmlExportPdfOptions) {
const page = await this.render(input)
.catch((e) => {
throw e;
});
let page = this.pages.get(input);
if (!page) {
page = await this.render(input)
.catch((e) => {
throw e;
});
}

try {
// Get metatags
Expand Down Expand Up @@ -282,24 +231,21 @@ export class Printer extends EventEmitter {
if (options.headerTemplate || options.footerTemplate)
pdfExportOptions.displayHeaderFooter = true;

const outline = await getOutline(page, options.outlineTags ?? []);
const pdf = await page.pdf(pdfExportOptions)
.catch((e) => {
throw e;
});

await this.renderPagedjs(options);
const outline = await getOutline(page, options.outlineTags ?? []);

this.closeAfter && page.close();
this.pages.delete(input);

this.emit("postprocessing");

const pdfDoc = await PDFDocument.load(pdf);

setMetadata(pdfDoc, meta);
setTrimBoxes(pdfDoc, this.pages);
setOutline(pdfDoc, outline, this.enableWarnings);

return await pdfDoc.save();
}
catch (error) {
Expand Down
71 changes: 0 additions & 71 deletions src/types/index.d.ts

This file was deleted.

7 changes: 5 additions & 2 deletions src/utils/cliProgress.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,15 @@ export function createProgress(indeterminate = false) {
progress.start(total, 0, { spin: getSpinner(spinner), text });
timer = setInterval(() => {
spinner += 1;
progress.update(current, { spin: getSpinner(spinner), text });
progress.update({ spin: getSpinner(spinner), text });
}, 200);
},
updateNumber(v: number) {
current = v;
progress.update(v, { spin: getSpinner(spinner), text });
progress.update(1, { spin: getSpinner(spinner), text });
},
increment(step: number) {
progress.increment(step, { spin: getSpinner(spinner), text });
},
updateText(t: string) {
text = t;
Expand Down

0 comments on commit a16a3ed

Please sign in to comment.