screenitshot 0.1.0 → 0.5.0
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/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/detector.d.ts.map +1 -1
- package/dist/detector.js +2 -0
- package/dist/detector.js.map +1 -1
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +56 -15
- package/dist/renderer.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -2
- package/src/cli.ts +5 -0
- package/src/detector.ts +2 -0
- package/src/renderer.ts +64 -17
- package/src/types.ts +1 -1
package/dist/cli.js
CHANGED
|
@@ -48,6 +48,11 @@ program
|
|
|
48
48
|
}
|
|
49
49
|
else if (err.message.includes('page')) {
|
|
50
50
|
console.error(`Error: Invalid page number or page not found`);
|
|
51
|
+
// Show stack trace in debug mode
|
|
52
|
+
if (process.env.DEBUG) {
|
|
53
|
+
console.error('Full error:', err.message);
|
|
54
|
+
console.error(err.stack);
|
|
55
|
+
}
|
|
51
56
|
}
|
|
52
57
|
else {
|
|
53
58
|
console.error(`Error: ${err.message}`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/detector.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA4BxE"}
|
package/dist/detector.js
CHANGED
package/dist/detector.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAE5C,kCAAkC;IAClC,MAAM,YAAY,GAA+B;QAC/C,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,MAAM;KAChB,CAAC;IAEF,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,KAAK,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC,CAAE,OAAO;QAChD,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC,CAAE,YAAY;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAE5C,kCAAkC;IAClC,MAAM,YAAY,GAA+B;QAC/C,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,MAAM;KAChB,CAAC;IAEF,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,KAAK,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC,CAAE,OAAO;QAChD,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC,CAAE,YAAY;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/renderer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKlF,qBAAa,QAAQ;IACnB,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKlF,qBAAa,QAAQ;IACnB,OAAO,CAAC,eAAe;YAiBT,kBAAkB;IAa1B,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;CAmH7B"}
|
package/dist/renderer.js
CHANGED
|
@@ -10,6 +10,8 @@ export class Renderer {
|
|
|
10
10
|
pdf: resolve(__dirname, '../templates/pdf.html'),
|
|
11
11
|
epub: resolve(__dirname, '../templates/epub.html'),
|
|
12
12
|
docx: resolve(__dirname, '../templates/docx.html'),
|
|
13
|
+
xlsx: resolve(__dirname, '../templates/xlsx.html'),
|
|
14
|
+
pptx: resolve(__dirname, '../templates/pptx.html'),
|
|
13
15
|
unknown: '',
|
|
14
16
|
};
|
|
15
17
|
const path = templateMap[format];
|
|
@@ -27,15 +29,22 @@ export class Renderer {
|
|
|
27
29
|
}, { fileBase64, pageNum: pageNumber });
|
|
28
30
|
}
|
|
29
31
|
async render(inputPath, format, options = {}) {
|
|
30
|
-
const { output, format: imageFormat = 'png', width
|
|
32
|
+
const { output, format: imageFormat = 'png', width, height, page: pageNumber = 1, } = options;
|
|
33
|
+
// Use small initial viewport - content will determine final size
|
|
34
|
+
// For formats like XLSX, large viewport causes table to expand to fill it
|
|
35
|
+
const initialWidth = width || 800;
|
|
36
|
+
const initialHeight = height || 600;
|
|
31
37
|
const outputPath = output || inputPath.replace(/\.[^.]+$/, `.${imageFormat}`);
|
|
32
38
|
// Launch browser
|
|
33
39
|
const browser = await chromium.launch({
|
|
34
40
|
headless: true,
|
|
35
41
|
});
|
|
36
42
|
try {
|
|
43
|
+
// Use deviceScaleFactor for high-quality rendering (2x = retina quality)
|
|
44
|
+
const deviceScaleFactor = 2;
|
|
37
45
|
const page = await browser.newPage({
|
|
38
|
-
viewport: { width, height },
|
|
46
|
+
viewport: { width: initialWidth, height: initialHeight },
|
|
47
|
+
deviceScaleFactor,
|
|
39
48
|
});
|
|
40
49
|
// Read and encode file as base64
|
|
41
50
|
const fileData = await readFile(inputPath);
|
|
@@ -54,23 +63,55 @@ export class Renderer {
|
|
|
54
63
|
// Await the promise to get metadata
|
|
55
64
|
return await renderComplete;
|
|
56
65
|
});
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
// Check if we need to clip (for EPUB content cropping)
|
|
67
|
+
const clipX = metadata.clipX;
|
|
68
|
+
const clipY = metadata.clipY;
|
|
69
|
+
if (clipX !== undefined && clipY !== undefined) {
|
|
70
|
+
// Resize viewport to ensure clip area is fully visible
|
|
71
|
+
const requiredWidth = clipX + metadata.width;
|
|
72
|
+
const requiredHeight = clipY + metadata.height;
|
|
73
|
+
await page.setViewportSize({
|
|
74
|
+
width: Math.max(requiredWidth, initialWidth),
|
|
75
|
+
height: Math.max(requiredHeight, initialHeight),
|
|
76
|
+
});
|
|
77
|
+
// Wait for layout to stabilize
|
|
78
|
+
await page.waitForTimeout(100);
|
|
79
|
+
// Use clip to capture just the content area
|
|
80
|
+
await page.screenshot({
|
|
81
|
+
path: outputPath,
|
|
82
|
+
type: imageFormat,
|
|
83
|
+
clip: {
|
|
84
|
+
x: clipX,
|
|
85
|
+
y: clipY,
|
|
86
|
+
width: metadata.width,
|
|
87
|
+
height: metadata.height
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Resize viewport to match actual rendered content
|
|
93
|
+
await page.setViewportSize({
|
|
94
|
+
width: metadata.width,
|
|
95
|
+
height: metadata.height,
|
|
96
|
+
});
|
|
97
|
+
// Wait for layout to stabilize after viewport resize
|
|
98
|
+
await page.waitForTimeout(100);
|
|
99
|
+
// Take screenshot at exact rendered size
|
|
100
|
+
await page.screenshot({
|
|
101
|
+
path: outputPath,
|
|
102
|
+
type: imageFormat,
|
|
103
|
+
fullPage: false,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
68
106
|
await browser.close();
|
|
107
|
+
// Actual image size is viewport * deviceScaleFactor
|
|
108
|
+
const actualWidth = metadata.width * deviceScaleFactor;
|
|
109
|
+
const actualHeight = metadata.height * deviceScaleFactor;
|
|
69
110
|
return {
|
|
70
111
|
path: outputPath,
|
|
71
112
|
format: imageFormat,
|
|
72
|
-
width:
|
|
73
|
-
height:
|
|
113
|
+
width: actualWidth,
|
|
114
|
+
height: actualHeight,
|
|
74
115
|
};
|
|
75
116
|
}
|
|
76
117
|
catch (error) {
|
package/dist/renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,OAAO,QAAQ;IACX,eAAe,CAAC,MAAkB;QACxC,MAAM,WAAW,GAA+B;YAC9C,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC;YAChD,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,wBAAwB,CAAC;YAClD,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,wBAAwB,CAAC;YAClD,OAAO,EAAE,EAAE;SACZ,CAAC;QAEF,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,IAAU,EACV,UAAkB,EAClB,aAAqB,CAAC;QAEtB,sDAAsD;QACtD,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAA2C,EAAE,EAAE;YAClG,kCAAkC;YACjC,UAAkB,CAAC,UAAU,GAAG,IAAI,CAAC;YACrC,UAAkB,CAAC,UAAU,GAAG,OAAO,CAAC;QAC3C,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,MAAkB,EAClB,UAA6B,EAAE;QAE/B,MAAM,EACJ,MAAM,EACN,MAAM,EAAE,WAAW,GAAG,KAAK,EAC3B,KAAK,
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -18,5 +18,5 @@ export interface RenderMetadata {
|
|
|
18
18
|
pageNumber: number;
|
|
19
19
|
scale: number;
|
|
20
20
|
}
|
|
21
|
-
export type FileFormat = 'pdf' | 'epub' | 'docx' | 'unknown';
|
|
21
|
+
export type FileFormat = 'pdf' | 'epub' | 'docx' | 'xlsx' | 'pptx' | 'unknown';
|
|
22
22
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "screenitshot",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Convert various file formats to high-quality screenshots",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -10,8 +10,9 @@
|
|
|
10
10
|
"type": "module",
|
|
11
11
|
"scripts": {
|
|
12
12
|
"build": "tsc && npm run copy-templates",
|
|
13
|
-
"copy-templates": "mkdir -p templates && cp ../render/dist/pdf.html templates/",
|
|
13
|
+
"copy-templates": "mkdir -p templates && cp ../render/dist/pdf.html ../render/dist/docx.html ../render/dist/xlsx.html ../render/dist/pptx.html ../render/dist/epub.html templates/",
|
|
14
14
|
"dev": "tsc --watch",
|
|
15
|
+
"start": "npm run build && node dist/cli.js",
|
|
15
16
|
"lint": "eslint \"src/**/*.ts\"",
|
|
16
17
|
"lint:fix": "eslint \"src/**/*.ts\" --fix",
|
|
17
18
|
"prepublishOnly": "npm run build"
|
|
@@ -25,6 +26,10 @@
|
|
|
25
26
|
],
|
|
26
27
|
"author": "",
|
|
27
28
|
"license": "MIT",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/xiaoyuanzhu-com/screenitshot"
|
|
32
|
+
},
|
|
28
33
|
"dependencies": {
|
|
29
34
|
"playwright": "^1.40.1",
|
|
30
35
|
"commander": "^11.1.0"
|
package/src/cli.ts
CHANGED
|
@@ -54,6 +54,11 @@ program
|
|
|
54
54
|
console.error('Currently supported: PDF');
|
|
55
55
|
} else if (err.message.includes('page')) {
|
|
56
56
|
console.error(`Error: Invalid page number or page not found`);
|
|
57
|
+
// Show stack trace in debug mode
|
|
58
|
+
if (process.env.DEBUG) {
|
|
59
|
+
console.error('Full error:', err.message);
|
|
60
|
+
console.error(err.stack);
|
|
61
|
+
}
|
|
57
62
|
} else {
|
|
58
63
|
console.error(`Error: ${err.message}`);
|
|
59
64
|
|
package/src/detector.ts
CHANGED
package/src/renderer.ts
CHANGED
|
@@ -13,6 +13,8 @@ export class Renderer {
|
|
|
13
13
|
pdf: resolve(__dirname, '../templates/pdf.html'),
|
|
14
14
|
epub: resolve(__dirname, '../templates/epub.html'),
|
|
15
15
|
docx: resolve(__dirname, '../templates/docx.html'),
|
|
16
|
+
xlsx: resolve(__dirname, '../templates/xlsx.html'),
|
|
17
|
+
pptx: resolve(__dirname, '../templates/pptx.html'),
|
|
16
18
|
unknown: '',
|
|
17
19
|
};
|
|
18
20
|
|
|
@@ -44,11 +46,16 @@ export class Renderer {
|
|
|
44
46
|
const {
|
|
45
47
|
output,
|
|
46
48
|
format: imageFormat = 'png',
|
|
47
|
-
width
|
|
48
|
-
height
|
|
49
|
+
width,
|
|
50
|
+
height,
|
|
49
51
|
page: pageNumber = 1,
|
|
50
52
|
} = options;
|
|
51
53
|
|
|
54
|
+
// Use small initial viewport - content will determine final size
|
|
55
|
+
// For formats like XLSX, large viewport causes table to expand to fill it
|
|
56
|
+
const initialWidth = width || 800;
|
|
57
|
+
const initialHeight = height || 600;
|
|
58
|
+
|
|
52
59
|
const outputPath = output || inputPath.replace(/\.[^.]+$/, `.${imageFormat}`);
|
|
53
60
|
|
|
54
61
|
// Launch browser
|
|
@@ -57,8 +64,12 @@ export class Renderer {
|
|
|
57
64
|
});
|
|
58
65
|
|
|
59
66
|
try {
|
|
67
|
+
// Use deviceScaleFactor for high-quality rendering (2x = retina quality)
|
|
68
|
+
const deviceScaleFactor = 2;
|
|
69
|
+
|
|
60
70
|
const page = await browser.newPage({
|
|
61
|
-
viewport: { width, height },
|
|
71
|
+
viewport: { width: initialWidth, height: initialHeight },
|
|
72
|
+
deviceScaleFactor,
|
|
62
73
|
});
|
|
63
74
|
|
|
64
75
|
// Read and encode file as base64
|
|
@@ -84,26 +95,62 @@ export class Renderer {
|
|
|
84
95
|
return await renderComplete;
|
|
85
96
|
});
|
|
86
97
|
|
|
87
|
-
//
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
98
|
+
// Check if we need to clip (for EPUB content cropping)
|
|
99
|
+
const clipX = (metadata as any).clipX;
|
|
100
|
+
const clipY = (metadata as any).clipY;
|
|
101
|
+
|
|
102
|
+
if (clipX !== undefined && clipY !== undefined) {
|
|
103
|
+
// Resize viewport to ensure clip area is fully visible
|
|
104
|
+
const requiredWidth = clipX + metadata.width;
|
|
105
|
+
const requiredHeight = clipY + metadata.height;
|
|
106
|
+
await page.setViewportSize({
|
|
107
|
+
width: Math.max(requiredWidth, initialWidth),
|
|
108
|
+
height: Math.max(requiredHeight, initialHeight),
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// Wait for layout to stabilize
|
|
112
|
+
await page.waitForTimeout(100);
|
|
113
|
+
|
|
114
|
+
// Use clip to capture just the content area
|
|
115
|
+
await page.screenshot({
|
|
116
|
+
path: outputPath,
|
|
117
|
+
type: imageFormat as 'png' | 'jpeg',
|
|
118
|
+
clip: {
|
|
119
|
+
x: clipX,
|
|
120
|
+
y: clipY,
|
|
121
|
+
width: metadata.width,
|
|
122
|
+
height: metadata.height
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
} else {
|
|
126
|
+
// Resize viewport to match actual rendered content
|
|
127
|
+
await page.setViewportSize({
|
|
128
|
+
width: metadata.width,
|
|
129
|
+
height: metadata.height,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Wait for layout to stabilize after viewport resize
|
|
133
|
+
await page.waitForTimeout(100);
|
|
134
|
+
|
|
135
|
+
// Take screenshot at exact rendered size
|
|
136
|
+
await page.screenshot({
|
|
137
|
+
path: outputPath,
|
|
138
|
+
type: imageFormat as 'png' | 'jpeg',
|
|
139
|
+
fullPage: false,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
99
142
|
|
|
100
143
|
await browser.close();
|
|
101
144
|
|
|
145
|
+
// Actual image size is viewport * deviceScaleFactor
|
|
146
|
+
const actualWidth = metadata.width * deviceScaleFactor;
|
|
147
|
+
const actualHeight = metadata.height * deviceScaleFactor;
|
|
148
|
+
|
|
102
149
|
return {
|
|
103
150
|
path: outputPath,
|
|
104
151
|
format: imageFormat,
|
|
105
|
-
width:
|
|
106
|
-
height:
|
|
152
|
+
width: actualWidth,
|
|
153
|
+
height: actualHeight,
|
|
107
154
|
};
|
|
108
155
|
} catch (error) {
|
|
109
156
|
await browser.close();
|
package/src/types.ts
CHANGED