@ahmedrowaihi/pdf-forge-printer 1.0.0-canary.0 → 1.0.0-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,3 +1,5 @@
1
+ import { ResizeOptions } from "sharp";
2
+
1
3
  //#region src/logger.d.ts
2
4
  interface PdfLogger {
3
5
  debug(message: string): void;
@@ -13,6 +15,52 @@ declare class ConsoleLogger implements PdfLogger {
13
15
  }
14
16
  //#endregion
15
17
  //#region src/playwright-pdf.service.d.ts
18
+ interface RenderContextOptions {
19
+ viewport?: {
20
+ width: number;
21
+ height: number;
22
+ };
23
+ deviceScaleFactor?: number;
24
+ locale?: string;
25
+ colorScheme?: 'light' | 'dark';
26
+ isMobile?: boolean;
27
+ hasTouch?: boolean;
28
+ reducedMotion?: 'reduce' | 'no-preference';
29
+ bypassCSP?: boolean;
30
+ }
31
+ interface RenderScreenshotOptions {
32
+ fullPage?: boolean;
33
+ type?: 'png' | 'jpeg';
34
+ quality?: number;
35
+ scale?: 'css' | 'device';
36
+ animations?: 'disabled' | 'allow';
37
+ caret?: 'hide' | 'initial';
38
+ omitBackground?: boolean;
39
+ clip?: {
40
+ x: number;
41
+ y: number;
42
+ width: number;
43
+ height: number;
44
+ };
45
+ }
46
+ interface RenderPdfOptions {
47
+ format?: 'A4' | 'Letter' | 'Legal' | 'Tabloid' | 'Ledger';
48
+ width?: number;
49
+ height?: number;
50
+ printBackground?: boolean;
51
+ preferCSSPageSize?: boolean;
52
+ displayHeaderFooter?: boolean;
53
+ headerTemplate?: string;
54
+ footerTemplate?: string;
55
+ outline?: boolean;
56
+ scale?: number;
57
+ margin?: {
58
+ top?: string;
59
+ right?: string;
60
+ bottom?: string;
61
+ left?: string;
62
+ };
63
+ }
16
64
  declare class PlaywrightPdfService {
17
65
  private readonly logger;
18
66
  constructor(logger?: PdfLogger);
@@ -22,8 +70,12 @@ declare class PlaywrightPdfService {
22
70
  url?: string;
23
71
  outputType: 'pdf' | 'screenshot';
24
72
  darkMode?: boolean;
73
+ contextOptions?: Partial<RenderContextOptions>;
74
+ screenshotOptions?: Partial<RenderScreenshotOptions>;
75
+ pdfOptions?: Partial<RenderPdfOptions>;
76
+ sharpResizeOptions?: ResizeOptions;
25
77
  }): Promise<Uint8Array>;
26
78
  }
27
79
  //#endregion
28
- export { ConsoleLogger, type PdfLogger, PlaywrightPdfService };
80
+ export { ConsoleLogger, type PdfLogger, PlaywrightPdfService, type RenderContextOptions, type RenderPdfOptions, type RenderScreenshotOptions };
29
81
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/logger.ts","../src/playwright-pdf.service.ts"],"sourcesContent":[],"mappings":";UAAiB,SAAA;EAAA,KAAA,CAAA,OAAS,EAAA,MAAA,CAAA,EAAA,IAAA;EAOb,GAAA,CAAA,OAAA,EAAA,MAAc,CAAA,EAAA,IAAA;;;;ACGd,cDHA,aAAA,YAAyB,SCGL,CAAA;EAGX,KAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAwCR,GAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAR,IAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAO,KAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,OAAA,CAAA,EAAA,IAAA;;;;ADrDI,cCUJ,oBAAA,CDVa;EAOb,iBAAc,MAAA;uBCML;;;IAHT,IAAA,CAAA,EAAA,MAAA;IAGS,GAAA,CAAA,EAAA,MAAA;IAwCR,UAAA,EAAA,KAAA,GAAA,YAAA;IAAR,QAAA,CAAA,EAAA,OAAA;EAAO,CAAA,CAAA,EAAP,OAAO,CAAC,UAAD,CAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/logger.ts","../src/playwright-pdf.service.ts"],"sourcesContent":[],"mappings":";;;UAAiB,SAAA;;;EAAA,IAAA,CAAA,OAAS,EAAA,MAAA,CAAA,EAAA,IAAA;EAOb,KAAA,CAAA,OAAA,EAAA,MAAc,EAAA,KAAoB,CAAT,EAAA,OAAS,CAAA,EAAA,IAAA;;cAAlC,aAAA,YAAyB;;ECOrB,GAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAoB;EAcpB,IAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAuB;EAgBvB,KAAA,CAAA,OAAA,EAAA,MAAgB,EAAA,KAAA,CAAA,EAAA,OAAA,CAAA,EAAA,IAAA;AAuCjC;;;UArEiB,oBAAA;EDdA,QAAA,CAAA,EAAA;IAOJ,KAAA,EAAA,MAAc;;;;ECOV,MAAA,CAAA,EAAA,MAAA;EAcA,WAAA,CAAA,EAAA,OAAA,GAAA,MAAuB;EAgBvB,QAAA,CAAA,EAAA,OAAA;EAuCJ,QAAA,CAAA,EAAA,OAAA;EAGS,aAAA,CAAA,EAAA,QAAA,GAAA,eAAA;EAwCO,SAAA,CAAA,EAAA,OAAA;;AACG,UAnGf,uBAAA,CAmGe;EAAR,QAAA,CAAA,EAAA,OAAA;EACC,IAAA,CAAA,EAAA,KAAA,GAAA,MAAA;EAAR,OAAA,CAAA,EAAA,MAAA;EACQ,KAAA,CAAA,EAAA,KAAA,GAAA,QAAA;EACX,UAAA,CAAA,EAAA,UAAA,GAAA,OAAA;EAAR,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAAO,cAAA,CAAA,EAAA,OAAA;;;;;;;;UAtFI,gBAAA;;;;;;;;;;;;;;;;;;cAuCJ,oBAAA;;uBAGS;;;;;;;qBAwCD,QAAQ;wBACL,QAAQ;iBACf,QAAQ;yBACA;MACnB,QAAQ"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { ResizeOptions } from "sharp";
2
+
1
3
  //#region src/logger.d.ts
2
4
  interface PdfLogger {
3
5
  debug(message: string): void;
@@ -13,6 +15,52 @@ declare class ConsoleLogger implements PdfLogger {
13
15
  }
14
16
  //#endregion
15
17
  //#region src/playwright-pdf.service.d.ts
18
+ interface RenderContextOptions {
19
+ viewport?: {
20
+ width: number;
21
+ height: number;
22
+ };
23
+ deviceScaleFactor?: number;
24
+ locale?: string;
25
+ colorScheme?: 'light' | 'dark';
26
+ isMobile?: boolean;
27
+ hasTouch?: boolean;
28
+ reducedMotion?: 'reduce' | 'no-preference';
29
+ bypassCSP?: boolean;
30
+ }
31
+ interface RenderScreenshotOptions {
32
+ fullPage?: boolean;
33
+ type?: 'png' | 'jpeg';
34
+ quality?: number;
35
+ scale?: 'css' | 'device';
36
+ animations?: 'disabled' | 'allow';
37
+ caret?: 'hide' | 'initial';
38
+ omitBackground?: boolean;
39
+ clip?: {
40
+ x: number;
41
+ y: number;
42
+ width: number;
43
+ height: number;
44
+ };
45
+ }
46
+ interface RenderPdfOptions {
47
+ format?: 'A4' | 'Letter' | 'Legal' | 'Tabloid' | 'Ledger';
48
+ width?: number;
49
+ height?: number;
50
+ printBackground?: boolean;
51
+ preferCSSPageSize?: boolean;
52
+ displayHeaderFooter?: boolean;
53
+ headerTemplate?: string;
54
+ footerTemplate?: string;
55
+ outline?: boolean;
56
+ scale?: number;
57
+ margin?: {
58
+ top?: string;
59
+ right?: string;
60
+ bottom?: string;
61
+ left?: string;
62
+ };
63
+ }
16
64
  declare class PlaywrightPdfService {
17
65
  private readonly logger;
18
66
  constructor(logger?: PdfLogger);
@@ -22,8 +70,12 @@ declare class PlaywrightPdfService {
22
70
  url?: string;
23
71
  outputType: 'pdf' | 'screenshot';
24
72
  darkMode?: boolean;
73
+ contextOptions?: Partial<RenderContextOptions>;
74
+ screenshotOptions?: Partial<RenderScreenshotOptions>;
75
+ pdfOptions?: Partial<RenderPdfOptions>;
76
+ sharpResizeOptions?: ResizeOptions;
25
77
  }): Promise<Uint8Array>;
26
78
  }
27
79
  //#endregion
28
- export { ConsoleLogger, type PdfLogger, PlaywrightPdfService };
80
+ export { ConsoleLogger, type PdfLogger, PlaywrightPdfService, type RenderContextOptions, type RenderPdfOptions, type RenderScreenshotOptions };
29
81
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/logger.ts","../src/playwright-pdf.service.ts"],"sourcesContent":[],"mappings":";UAAiB,SAAA;EAAA,KAAA,CAAA,OAAS,EAAA,MAAA,CAAA,EAAA,IAAA;EAOb,GAAA,CAAA,OAAA,EAAA,MAAc,CAAA,EAAA,IAAA;;;;ACGd,cDHA,aAAA,YAAyB,SCGL,CAAA;EAGX,KAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAwCR,GAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAR,IAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAO,KAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,OAAA,CAAA,EAAA,IAAA;;;;ADrDI,cCUJ,oBAAA,CDVa;EAOb,iBAAc,MAAA;uBCML;;;IAHT,IAAA,CAAA,EAAA,MAAA;IAGS,GAAA,CAAA,EAAA,MAAA;IAwCR,UAAA,EAAA,KAAA,GAAA,YAAA;IAAR,QAAA,CAAA,EAAA,OAAA;EAAO,CAAA,CAAA,EAAP,OAAO,CAAC,UAAD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/logger.ts","../src/playwright-pdf.service.ts"],"sourcesContent":[],"mappings":";;;UAAiB,SAAA;;;EAAA,IAAA,CAAA,OAAS,EAAA,MAAA,CAAA,EAAA,IAAA;EAOb,KAAA,CAAA,OAAA,EAAA,MAAc,EAAA,KAAoB,CAAT,EAAA,OAAS,CAAA,EAAA,IAAA;;cAAlC,aAAA,YAAyB;;ECOrB,GAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAoB;EAcpB,IAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAuB;EAgBvB,KAAA,CAAA,OAAA,EAAA,MAAgB,EAAA,KAAA,CAAA,EAAA,OAAA,CAAA,EAAA,IAAA;AAuCjC;;;UArEiB,oBAAA;EDdA,QAAA,CAAA,EAAA;IAOJ,KAAA,EAAA,MAAc;;;;ECOV,MAAA,CAAA,EAAA,MAAA;EAcA,WAAA,CAAA,EAAA,OAAA,GAAA,MAAuB;EAgBvB,QAAA,CAAA,EAAA,OAAA;EAuCJ,QAAA,CAAA,EAAA,OAAA;EAGS,aAAA,CAAA,EAAA,QAAA,GAAA,eAAA;EAwCO,SAAA,CAAA,EAAA,OAAA;;AACG,UAnGf,uBAAA,CAmGe;EAAR,QAAA,CAAA,EAAA,OAAA;EACC,IAAA,CAAA,EAAA,KAAA,GAAA,MAAA;EAAR,OAAA,CAAA,EAAA,MAAA;EACQ,KAAA,CAAA,EAAA,KAAA,GAAA,QAAA;EACX,UAAA,CAAA,EAAA,UAAA,GAAA,OAAA;EAAR,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAAO,cAAA,CAAA,EAAA,OAAA;;;;;;;;UAtFI,gBAAA;;;;;;;;;;;;;;;;;;cAuCJ,oBAAA;;uBAGS;;;;;;;qBAwCD,QAAQ;wBACL,QAAQ;iBACf,QAAQ;yBACA;MACnB,QAAQ"}
package/dist/index.js CHANGED
@@ -25,6 +25,8 @@ let node_fs_promises = require("node:fs/promises");
25
25
  node_fs_promises = __toESM(node_fs_promises);
26
26
  let playwright = require("playwright");
27
27
  playwright = __toESM(playwright);
28
+ let sharp = require("sharp");
29
+ sharp = __toESM(sharp);
28
30
 
29
31
  //#region src/logger.ts
30
32
  var ConsoleLogger = class {
@@ -46,6 +48,13 @@ var ConsoleLogger = class {
46
48
  //#region src/playwright-pdf.service.ts
47
49
  const A4_WIDTH = 794;
48
50
  const A4_HEIGHT = 1123;
51
+ async function upscaleImage(inputBuffer, resizeOptions) {
52
+ return await (0, sharp.default)(inputBuffer).resize(resizeOptions ?? {
53
+ width: 1920,
54
+ kernel: "lanczos3",
55
+ fastShrinkOnLoad: false
56
+ }).toBuffer();
57
+ }
49
58
  var PlaywrightPdfService = class {
50
59
  constructor(logger = new ConsoleLogger()) {
51
60
  this.logger = logger;
@@ -75,7 +84,7 @@ var PlaywrightPdfService = class {
75
84
  let browser = null;
76
85
  try {
77
86
  browser = await this.launchBrowser();
78
- const page = await (await browser.newContext({
87
+ const defaultContextOptions = {
79
88
  colorScheme: input.darkMode ? "dark" : "light",
80
89
  locale: "en-US",
81
90
  reducedMotion: "reduce",
@@ -87,7 +96,23 @@ var PlaywrightPdfService = class {
87
96
  hasTouch: false,
88
97
  deviceScaleFactor: 2,
89
98
  bypassCSP: true
90
- })).newPage();
99
+ };
100
+ const mergedContextOptions = {
101
+ ...defaultContextOptions,
102
+ ...input.contextOptions,
103
+ viewport: input.contextOptions?.viewport ?? defaultContextOptions.viewport
104
+ };
105
+ const playwrightContextOptions = {
106
+ colorScheme: mergedContextOptions.colorScheme,
107
+ locale: mergedContextOptions.locale,
108
+ reducedMotion: mergedContextOptions.reducedMotion,
109
+ viewport: mergedContextOptions.viewport,
110
+ isMobile: mergedContextOptions.isMobile,
111
+ hasTouch: mergedContextOptions.hasTouch,
112
+ deviceScaleFactor: mergedContextOptions.deviceScaleFactor,
113
+ bypassCSP: mergedContextOptions.bypassCSP
114
+ };
115
+ const page = await (await browser.newContext(playwrightContextOptions)).newPage();
91
116
  page.on("console", (msg) => this.logger.debug(`[Browser Log] ${msg.text()}`));
92
117
  page.on("requestfailed", (request) => {
93
118
  this.logger.error(`[Browser Error] Failed to load resource: ${request.url()} - ${request.failure()?.errorText}`);
@@ -112,17 +137,33 @@ var PlaywrightPdfService = class {
112
137
  if (input.outputType === "pdf") await page.emulateMedia({ media: "print" });
113
138
  this.logger.log(`Page content loaded, generating ${input.outputType}...`);
114
139
  if (input.outputType === "screenshot") {
115
- const screenshotBuffer = await page.screenshot({
140
+ const mergedScreenshotOptions = {
116
141
  fullPage: true,
117
142
  type: "png",
118
143
  scale: "css",
119
144
  animations: "disabled",
120
145
  caret: "hide",
121
- omitBackground: true
122
- });
146
+ omitBackground: true,
147
+ ...input.screenshotOptions
148
+ };
149
+ const playwrightScreenshotOptions = {
150
+ fullPage: mergedScreenshotOptions.fullPage,
151
+ type: mergedScreenshotOptions.type,
152
+ quality: mergedScreenshotOptions.quality,
153
+ scale: mergedScreenshotOptions.scale,
154
+ animations: mergedScreenshotOptions.animations,
155
+ caret: mergedScreenshotOptions.caret,
156
+ omitBackground: mergedScreenshotOptions.omitBackground,
157
+ clip: mergedScreenshotOptions.clip
158
+ };
159
+ const screenshotBuffer = await page.screenshot(playwrightScreenshotOptions);
160
+ if (input.sharpResizeOptions) {
161
+ const upscaledBuffer = await upscaleImage(Buffer.from(screenshotBuffer), input.sharpResizeOptions);
162
+ return new Uint8Array(upscaledBuffer);
163
+ }
123
164
  return new Uint8Array(screenshotBuffer);
124
165
  }
125
- const pdfBuffer = await page.pdf({
166
+ const defaultPdfOptions = {
126
167
  format: "A4",
127
168
  printBackground: true,
128
169
  preferCSSPageSize: true,
@@ -135,7 +176,26 @@ var PlaywrightPdfService = class {
135
176
  bottom: "0px",
136
177
  left: "0px"
137
178
  }
138
- });
179
+ };
180
+ const mergedPdfOptions = {
181
+ ...defaultPdfOptions,
182
+ ...input.pdfOptions,
183
+ margin: input.pdfOptions?.margin ?? defaultPdfOptions.margin
184
+ };
185
+ const playwrightPdfOptions = {
186
+ format: mergedPdfOptions.format,
187
+ width: mergedPdfOptions.width,
188
+ height: mergedPdfOptions.height,
189
+ printBackground: mergedPdfOptions.printBackground,
190
+ preferCSSPageSize: mergedPdfOptions.preferCSSPageSize,
191
+ displayHeaderFooter: mergedPdfOptions.displayHeaderFooter,
192
+ headerTemplate: mergedPdfOptions.headerTemplate,
193
+ footerTemplate: mergedPdfOptions.footerTemplate,
194
+ outline: mergedPdfOptions.outline,
195
+ scale: mergedPdfOptions.scale,
196
+ margin: mergedPdfOptions.margin
197
+ };
198
+ const pdfBuffer = await page.pdf(playwrightPdfOptions);
139
199
  return new Uint8Array(pdfBuffer);
140
200
  } catch (error) {
141
201
  this.logger.error("Playwright error:", error);
package/dist/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { access } from "node:fs/promises";
2
2
  import { chromium } from "playwright";
3
+ import sharp from "sharp";
3
4
 
4
5
  //#region src/logger.ts
5
6
  var ConsoleLogger = class {
@@ -21,6 +22,13 @@ var ConsoleLogger = class {
21
22
  //#region src/playwright-pdf.service.ts
22
23
  const A4_WIDTH = 794;
23
24
  const A4_HEIGHT = 1123;
25
+ async function upscaleImage(inputBuffer, resizeOptions) {
26
+ return await sharp(inputBuffer).resize(resizeOptions ?? {
27
+ width: 1920,
28
+ kernel: "lanczos3",
29
+ fastShrinkOnLoad: false
30
+ }).toBuffer();
31
+ }
24
32
  var PlaywrightPdfService = class {
25
33
  constructor(logger = new ConsoleLogger()) {
26
34
  this.logger = logger;
@@ -50,7 +58,7 @@ var PlaywrightPdfService = class {
50
58
  let browser = null;
51
59
  try {
52
60
  browser = await this.launchBrowser();
53
- const page = await (await browser.newContext({
61
+ const defaultContextOptions = {
54
62
  colorScheme: input.darkMode ? "dark" : "light",
55
63
  locale: "en-US",
56
64
  reducedMotion: "reduce",
@@ -62,7 +70,23 @@ var PlaywrightPdfService = class {
62
70
  hasTouch: false,
63
71
  deviceScaleFactor: 2,
64
72
  bypassCSP: true
65
- })).newPage();
73
+ };
74
+ const mergedContextOptions = {
75
+ ...defaultContextOptions,
76
+ ...input.contextOptions,
77
+ viewport: input.contextOptions?.viewport ?? defaultContextOptions.viewport
78
+ };
79
+ const playwrightContextOptions = {
80
+ colorScheme: mergedContextOptions.colorScheme,
81
+ locale: mergedContextOptions.locale,
82
+ reducedMotion: mergedContextOptions.reducedMotion,
83
+ viewport: mergedContextOptions.viewport,
84
+ isMobile: mergedContextOptions.isMobile,
85
+ hasTouch: mergedContextOptions.hasTouch,
86
+ deviceScaleFactor: mergedContextOptions.deviceScaleFactor,
87
+ bypassCSP: mergedContextOptions.bypassCSP
88
+ };
89
+ const page = await (await browser.newContext(playwrightContextOptions)).newPage();
66
90
  page.on("console", (msg) => this.logger.debug(`[Browser Log] ${msg.text()}`));
67
91
  page.on("requestfailed", (request) => {
68
92
  this.logger.error(`[Browser Error] Failed to load resource: ${request.url()} - ${request.failure()?.errorText}`);
@@ -87,17 +111,33 @@ var PlaywrightPdfService = class {
87
111
  if (input.outputType === "pdf") await page.emulateMedia({ media: "print" });
88
112
  this.logger.log(`Page content loaded, generating ${input.outputType}...`);
89
113
  if (input.outputType === "screenshot") {
90
- const screenshotBuffer = await page.screenshot({
114
+ const mergedScreenshotOptions = {
91
115
  fullPage: true,
92
116
  type: "png",
93
117
  scale: "css",
94
118
  animations: "disabled",
95
119
  caret: "hide",
96
- omitBackground: true
97
- });
120
+ omitBackground: true,
121
+ ...input.screenshotOptions
122
+ };
123
+ const playwrightScreenshotOptions = {
124
+ fullPage: mergedScreenshotOptions.fullPage,
125
+ type: mergedScreenshotOptions.type,
126
+ quality: mergedScreenshotOptions.quality,
127
+ scale: mergedScreenshotOptions.scale,
128
+ animations: mergedScreenshotOptions.animations,
129
+ caret: mergedScreenshotOptions.caret,
130
+ omitBackground: mergedScreenshotOptions.omitBackground,
131
+ clip: mergedScreenshotOptions.clip
132
+ };
133
+ const screenshotBuffer = await page.screenshot(playwrightScreenshotOptions);
134
+ if (input.sharpResizeOptions) {
135
+ const upscaledBuffer = await upscaleImage(Buffer.from(screenshotBuffer), input.sharpResizeOptions);
136
+ return new Uint8Array(upscaledBuffer);
137
+ }
98
138
  return new Uint8Array(screenshotBuffer);
99
139
  }
100
- const pdfBuffer = await page.pdf({
140
+ const defaultPdfOptions = {
101
141
  format: "A4",
102
142
  printBackground: true,
103
143
  preferCSSPageSize: true,
@@ -110,7 +150,26 @@ var PlaywrightPdfService = class {
110
150
  bottom: "0px",
111
151
  left: "0px"
112
152
  }
113
- });
153
+ };
154
+ const mergedPdfOptions = {
155
+ ...defaultPdfOptions,
156
+ ...input.pdfOptions,
157
+ margin: input.pdfOptions?.margin ?? defaultPdfOptions.margin
158
+ };
159
+ const playwrightPdfOptions = {
160
+ format: mergedPdfOptions.format,
161
+ width: mergedPdfOptions.width,
162
+ height: mergedPdfOptions.height,
163
+ printBackground: mergedPdfOptions.printBackground,
164
+ preferCSSPageSize: mergedPdfOptions.preferCSSPageSize,
165
+ displayHeaderFooter: mergedPdfOptions.displayHeaderFooter,
166
+ headerTemplate: mergedPdfOptions.headerTemplate,
167
+ footerTemplate: mergedPdfOptions.footerTemplate,
168
+ outline: mergedPdfOptions.outline,
169
+ scale: mergedPdfOptions.scale,
170
+ margin: mergedPdfOptions.margin
171
+ };
172
+ const pdfBuffer = await page.pdf(playwrightPdfOptions);
114
173
  return new Uint8Array(pdfBuffer);
115
174
  } catch (error) {
116
175
  this.logger.error("Playwright error:", error);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["launchOptions: Parameters<typeof chromium.launch>[0]","browser: Browser | null"],"sources":["../src/logger.ts","../src/playwright-pdf.service.ts"],"sourcesContent":["export interface PdfLogger {\n debug(message: string): void;\n log(message: string): void;\n warn(message: string): void;\n error(message: string, error?: unknown): void;\n}\n\nexport class ConsoleLogger implements PdfLogger {\n debug(message: string): void {\n if (process.env.NODE_ENV === 'development') {\n console.debug(`[PDF Printer] ${message}`);\n }\n }\n\n log(message: string): void {\n console.log(`[PDF Printer] ${message}`);\n }\n\n warn(message: string): void {\n console.warn(`[PDF Printer] ${message}`);\n }\n\n error(message: string, error?: unknown): void {\n console.error(`[PDF Printer] ${message}`, error);\n }\n}\n","import { access } from 'node:fs/promises';\nimport { type Browser, chromium } from 'playwright';\nimport type { PdfLogger } from './logger';\nimport { ConsoleLogger } from './logger';\n\n// A4 dimensions in pixels at 96 DPI (standard web resolution)\n// A4 = 210mm × 297mm = 8.27\" × 11.69\" = 794px × 1123px at 96 DPI\nconst A4_WIDTH = 794;\nconst A4_HEIGHT = 1123;\n\nexport class PlaywrightPdfService {\n private readonly logger: PdfLogger;\n\n constructor(logger: PdfLogger = new ConsoleLogger()) {\n this.logger = logger;\n }\n\n private async launchBrowser(): Promise<Browser> {\n const launchOptions: Parameters<typeof chromium.launch>[0] = {\n headless: true,\n args: [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-web-security',\n '--disable-dev-shm-usage',\n '--disable-blink-features=AutomationControlled',\n // Bypass CSP (Content Security Policy)\n '--disable-features=IsolateOrigins,site-per-process',\n ],\n };\n\n if (process.env.CHROMIUM_EXECUTABLE_PATH) {\n try {\n await access(process.env.CHROMIUM_EXECUTABLE_PATH);\n launchOptions.executablePath = process.env.CHROMIUM_EXECUTABLE_PATH;\n this.logger.debug(\n `Using system Chromium at: ${process.env.CHROMIUM_EXECUTABLE_PATH}`,\n );\n } catch {\n this.logger.warn(\n `Chromium path specified but not found: ${process.env.CHROMIUM_EXECUTABLE_PATH}, using Playwright's bundled browser`,\n );\n }\n }\n\n return chromium.launch(launchOptions);\n }\n\n async render(input: {\n html?: string;\n url?: string;\n outputType: 'pdf' | 'screenshot';\n darkMode?: boolean;\n }): Promise<Uint8Array> {\n let browser: Browser | null = null;\n\n try {\n browser = await this.launchBrowser();\n\n const context = await browser.newContext({\n colorScheme: input.darkMode ? 'dark' : 'light',\n locale: 'en-US',\n reducedMotion: 'reduce',\n viewport: { width: A4_WIDTH, height: A4_HEIGHT },\n // Mobile and touch settings\n isMobile: false,\n hasTouch: false,\n // Best quality with device scale factor\n deviceScaleFactor: 2, // High DPI for crisp rendering\n // Bypass CSP\n bypassCSP: true,\n });\n\n const page = await context.newPage();\n\n page.on('console', (msg) =>\n this.logger.debug(`[Browser Log] ${msg.text()}`),\n );\n page.on('requestfailed', (request) => {\n this.logger.error(\n `[Browser Error] Failed to load resource: ${request.url()} - ${request.failure()?.errorText}`,\n );\n });\n\n if (input.url) {\n await page.goto(input.url, {\n waitUntil: 'load',\n timeout: 60000,\n });\n // Wait for network to be idle to ensure all resources are loaded\n await page.waitForLoadState('networkidle', { timeout: 60000 });\n } else if (input.html) {\n await page.setContent(input.html, {\n waitUntil: 'load',\n timeout: 60000,\n });\n // Wait for network to be idle (for any resources in the HTML)\n await page.waitForLoadState('networkidle', { timeout: 60000 });\n }\n\n // Apply dark mode class for Theme component system\n // (Playwright's colorScheme already handles @media (prefers-color-scheme: dark))\n if (input.darkMode) {\n await page.evaluate(() => {\n document.documentElement.classList.add('dark');\n document.body.classList.add('dark');\n });\n }\n\n // For PDF generation, emulate print media to apply @media print styles\n if (input.outputType === 'pdf') {\n await page.emulateMedia({ media: 'print' });\n }\n\n this.logger.log(`Page content loaded, generating ${input.outputType}...`);\n\n if (input.outputType === 'screenshot') {\n const screenshotBuffer = await page.screenshot({\n fullPage: true,\n type: 'png',\n scale: 'css',\n animations: 'disabled',\n caret: 'hide',\n omitBackground: true, // Transparent background\n });\n return new Uint8Array(screenshotBuffer);\n }\n const pdfBuffer = await page.pdf({\n format: 'A4',\n printBackground: true,\n preferCSSPageSize: true,\n displayHeaderFooter: false,\n outline: false,\n scale: 1,\n margin: {\n top: '0px',\n right: '0px',\n bottom: '0px',\n left: '0px',\n },\n });\n return new Uint8Array(pdfBuffer);\n } catch (error) {\n this.logger.error('Playwright error:', error);\n if (error instanceof Error && error.message.includes('browser')) {\n this.logger.error('\\n💡 Troubleshooting tips:');\n this.logger.error(' 1. Make sure Chromium is installed');\n this.logger.error(\n ' 2. Try running: bunx playwright install chromium',\n );\n this.logger.error(' 3. Check system permissions');\n }\n throw error;\n } finally {\n if (browser) await browser.close();\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["launchOptions: Parameters<typeof chromium.launch>[0]","browser: Browser | null","defaultContextOptions: RenderContextOptions","mergedContextOptions: RenderContextOptions","playwrightContextOptions: BrowserContextOptions","mergedScreenshotOptions: RenderScreenshotOptions","playwrightScreenshotOptions: PageScreenshotOptions","defaultPdfOptions: RenderPdfOptions","mergedPdfOptions: RenderPdfOptions","playwrightPdfOptions: PDFOptions"],"sources":["../src/logger.ts","../src/playwright-pdf.service.ts"],"sourcesContent":["export interface PdfLogger {\n debug(message: string): void;\n log(message: string): void;\n warn(message: string): void;\n error(message: string, error?: unknown): void;\n}\n\nexport class ConsoleLogger implements PdfLogger {\n debug(message: string): void {\n if (process.env.NODE_ENV === 'development') {\n console.debug(`[PDF Printer] ${message}`);\n }\n }\n\n log(message: string): void {\n console.log(`[PDF Printer] ${message}`);\n }\n\n warn(message: string): void {\n console.warn(`[PDF Printer] ${message}`);\n }\n\n error(message: string, error?: unknown): void {\n console.error(`[PDF Printer] ${message}`, error);\n }\n}\n","import { access } from 'node:fs/promises';\nimport type { PageScreenshotOptions } from 'playwright';\nimport {\n type Browser,\n type BrowserContextOptions,\n chromium,\n type Page,\n} from 'playwright';\nimport sharp, { type ResizeOptions } from 'sharp';\nimport type { PdfLogger } from './logger';\nimport { ConsoleLogger } from './logger';\n\ntype PDFOptions = Parameters<Page['pdf']>[0];\n\nexport interface RenderContextOptions {\n viewport?: {\n width: number;\n height: number;\n };\n deviceScaleFactor?: number;\n locale?: string;\n colorScheme?: 'light' | 'dark';\n isMobile?: boolean;\n hasTouch?: boolean;\n reducedMotion?: 'reduce' | 'no-preference';\n bypassCSP?: boolean;\n}\n\nexport interface RenderScreenshotOptions {\n fullPage?: boolean;\n type?: 'png' | 'jpeg';\n quality?: number;\n scale?: 'css' | 'device';\n animations?: 'disabled' | 'allow';\n caret?: 'hide' | 'initial';\n omitBackground?: boolean;\n clip?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n}\n\nexport interface RenderPdfOptions {\n format?: 'A4' | 'Letter' | 'Legal' | 'Tabloid' | 'Ledger';\n width?: number;\n height?: number;\n printBackground?: boolean;\n preferCSSPageSize?: boolean;\n displayHeaderFooter?: boolean;\n headerTemplate?: string;\n footerTemplate?: string;\n outline?: boolean;\n scale?: number;\n margin?: {\n top?: string;\n right?: string;\n bottom?: string;\n left?: string;\n };\n}\n\n// A4 dimensions in pixels at 96 DPI (standard web resolution)\n// A4 = 210mm × 297mm = 8.27\" × 11.69\" = 794px × 1123px at 96 DPI\nconst A4_WIDTH = 794;\nconst A4_HEIGHT = 1123;\n\nasync function upscaleImage(\n inputBuffer: Buffer,\n resizeOptions?: ResizeOptions,\n): Promise<Buffer> {\n const defaultOptions: ResizeOptions = {\n width: 1920,\n kernel: 'lanczos3' as const,\n fastShrinkOnLoad: false,\n };\n\n return await sharp(inputBuffer)\n .resize(resizeOptions ?? defaultOptions)\n .toBuffer();\n}\n\nexport class PlaywrightPdfService {\n private readonly logger: PdfLogger;\n\n constructor(logger: PdfLogger = new ConsoleLogger()) {\n this.logger = logger;\n }\n\n private async launchBrowser(): Promise<Browser> {\n const launchOptions: Parameters<typeof chromium.launch>[0] = {\n headless: true,\n args: [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-web-security',\n '--disable-dev-shm-usage',\n '--disable-blink-features=AutomationControlled',\n // Bypass CSP (Content Security Policy)\n '--disable-features=IsolateOrigins,site-per-process',\n ],\n };\n\n if (process.env.CHROMIUM_EXECUTABLE_PATH) {\n try {\n await access(process.env.CHROMIUM_EXECUTABLE_PATH);\n launchOptions.executablePath = process.env.CHROMIUM_EXECUTABLE_PATH;\n this.logger.debug(\n `Using system Chromium at: ${process.env.CHROMIUM_EXECUTABLE_PATH}`,\n );\n } catch {\n this.logger.warn(\n `Chromium path specified but not found: ${process.env.CHROMIUM_EXECUTABLE_PATH}, using Playwright's bundled browser`,\n );\n }\n }\n\n return chromium.launch(launchOptions);\n }\n\n async render(input: {\n html?: string;\n url?: string;\n outputType: 'pdf' | 'screenshot';\n darkMode?: boolean;\n contextOptions?: Partial<RenderContextOptions>;\n screenshotOptions?: Partial<RenderScreenshotOptions>;\n pdfOptions?: Partial<RenderPdfOptions>;\n sharpResizeOptions?: ResizeOptions;\n }): Promise<Uint8Array> {\n let browser: Browser | null = null;\n\n try {\n browser = await this.launchBrowser();\n\n const defaultContextOptions: RenderContextOptions = {\n colorScheme: input.darkMode ? 'dark' : 'light',\n locale: 'en-US',\n reducedMotion: 'reduce',\n viewport: { width: A4_WIDTH, height: A4_HEIGHT },\n isMobile: false,\n hasTouch: false,\n deviceScaleFactor: 2,\n bypassCSP: true,\n };\n\n const mergedContextOptions: RenderContextOptions = {\n ...defaultContextOptions,\n ...input.contextOptions,\n viewport:\n input.contextOptions?.viewport ?? defaultContextOptions.viewport,\n };\n\n const playwrightContextOptions: BrowserContextOptions = {\n colorScheme: mergedContextOptions.colorScheme,\n locale: mergedContextOptions.locale,\n reducedMotion: mergedContextOptions.reducedMotion,\n viewport: mergedContextOptions.viewport,\n isMobile: mergedContextOptions.isMobile,\n hasTouch: mergedContextOptions.hasTouch,\n deviceScaleFactor: mergedContextOptions.deviceScaleFactor,\n bypassCSP: mergedContextOptions.bypassCSP,\n };\n\n const context = await browser.newContext(playwrightContextOptions);\n\n const page = await context.newPage();\n\n page.on('console', (msg) =>\n this.logger.debug(`[Browser Log] ${msg.text()}`),\n );\n page.on('requestfailed', (request) => {\n this.logger.error(\n `[Browser Error] Failed to load resource: ${request.url()} - ${request.failure()?.errorText}`,\n );\n });\n\n if (input.url) {\n await page.goto(input.url, {\n waitUntil: 'load',\n timeout: 60000,\n });\n await page.waitForLoadState('networkidle', { timeout: 60000 });\n } else if (input.html) {\n await page.setContent(input.html, {\n waitUntil: 'load',\n timeout: 60000,\n });\n await page.waitForLoadState('networkidle', { timeout: 60000 });\n }\n\n if (input.darkMode) {\n await page.evaluate(() => {\n document.documentElement.classList.add('dark');\n document.body.classList.add('dark');\n });\n }\n\n if (input.outputType === 'pdf') {\n await page.emulateMedia({ media: 'print' });\n }\n\n this.logger.log(`Page content loaded, generating ${input.outputType}...`);\n\n if (input.outputType === 'screenshot') {\n const defaultScreenshotOptions: RenderScreenshotOptions = {\n fullPage: true,\n type: 'png',\n scale: 'css',\n animations: 'disabled',\n caret: 'hide',\n omitBackground: true,\n };\n\n const mergedScreenshotOptions: RenderScreenshotOptions = {\n ...defaultScreenshotOptions,\n ...input.screenshotOptions,\n };\n\n const playwrightScreenshotOptions: PageScreenshotOptions = {\n fullPage: mergedScreenshotOptions.fullPage,\n type: mergedScreenshotOptions.type,\n quality: mergedScreenshotOptions.quality,\n scale: mergedScreenshotOptions.scale,\n animations: mergedScreenshotOptions.animations,\n caret: mergedScreenshotOptions.caret,\n omitBackground: mergedScreenshotOptions.omitBackground,\n clip: mergedScreenshotOptions.clip,\n };\n\n const screenshotBuffer = await page.screenshot(\n playwrightScreenshotOptions,\n );\n\n if (input.sharpResizeOptions) {\n const upscaledBuffer = await upscaleImage(\n Buffer.from(screenshotBuffer),\n input.sharpResizeOptions,\n );\n return new Uint8Array(upscaledBuffer);\n }\n\n return new Uint8Array(screenshotBuffer);\n }\n\n const defaultPdfOptions: RenderPdfOptions = {\n format: 'A4',\n printBackground: true,\n preferCSSPageSize: true,\n displayHeaderFooter: false,\n outline: false,\n scale: 1,\n margin: {\n top: '0px',\n right: '0px',\n bottom: '0px',\n left: '0px',\n },\n };\n\n const mergedPdfOptions: RenderPdfOptions = {\n ...defaultPdfOptions,\n ...input.pdfOptions,\n margin: input.pdfOptions?.margin ?? defaultPdfOptions.margin,\n };\n\n const playwrightPdfOptions: PDFOptions = {\n format: mergedPdfOptions.format,\n width: mergedPdfOptions.width,\n height: mergedPdfOptions.height,\n printBackground: mergedPdfOptions.printBackground,\n preferCSSPageSize: mergedPdfOptions.preferCSSPageSize,\n displayHeaderFooter: mergedPdfOptions.displayHeaderFooter,\n headerTemplate: mergedPdfOptions.headerTemplate,\n footerTemplate: mergedPdfOptions.footerTemplate,\n outline: mergedPdfOptions.outline,\n scale: mergedPdfOptions.scale,\n margin: mergedPdfOptions.margin,\n };\n\n const pdfBuffer = await page.pdf(playwrightPdfOptions);\n return new Uint8Array(pdfBuffer);\n } catch (error) {\n this.logger.error('Playwright error:', error);\n if (error instanceof Error && error.message.includes('browser')) {\n this.logger.error('\\n💡 Troubleshooting tips:');\n this.logger.error(' 1. Make sure Chromium is installed');\n this.logger.error(\n ' 2. Try running: bunx playwright install chromium',\n );\n this.logger.error(' 3. Check system permissions');\n }\n throw error;\n } finally {\n if (browser) await browser.close();\n }\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ahmedrowaihi/pdf-forge-printer",
3
- "version": "1.0.0-canary.0",
3
+ "version": "1.0.0-canary.1",
4
4
  "description": "Playwright-based PDF and screenshot rendering service",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -10,14 +10,15 @@
10
10
  ],
11
11
  "license": "MIT",
12
12
  "dependencies": {
13
- "playwright": "^1.57.0"
13
+ "playwright": "^1.57.0",
14
+ "sharp": "^0.34.5"
14
15
  },
15
16
  "peerDependencies": {},
16
17
  "devDependencies": {
17
18
  "@types/node": "22.14.1",
18
19
  "typescript": "5.9.3",
19
20
  "tsdown": "0.15.12",
20
- "tsconfig": "1.0.0-canary.0"
21
+ "tsconfig": "1.0.0-canary.1"
21
22
  },
22
23
  "scripts": {
23
24
  "build": "tsdown src/index.ts --format esm,cjs --dts --external playwright",