@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 +53 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +53 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +67 -7
- package/dist/index.mjs +66 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -3
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
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/logger.ts","../src/playwright-pdf.service.ts"],"sourcesContent":[],"mappings":"
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/logger.ts","../src/playwright-pdf.service.ts"],"sourcesContent":[],"mappings":"
|
|
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
|
|
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
|
-
}
|
|
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
|
|
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
|
|
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
|
|
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
|
-
}
|
|
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
|
|
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
|
|
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);
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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",
|