@pdfme/converter 5.3.0-beta.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/.eslintrc.cjs ADDED
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ extends: ['../../eslint.base.js'],
3
+ };
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ ## @pdfme/converter
2
+
3
+ This library provides utility functions for converting PDFs to other formats or converting data—such as Markdown—into PDF(WIP).
4
+
5
+ For the complete pdfme documentation, see [this link](https://pdfme.com/docs/converter).
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // @ts-ignore
4
+ const generator_1 = require("@pdfme/generator");
5
+ const index_node_1 = require("../src/index.node");
6
+ describe('pdf2img tests', () => {
7
+ let pdfArrayBuffer;
8
+ beforeAll(async () => {
9
+ const pdf = await (0, generator_1.generate)({
10
+ template: {
11
+ schemas: [
12
+ [
13
+ {
14
+ name: 'field1',
15
+ type: 'text',
16
+ content: 'Type Something...',
17
+ position: { x: 10, y: 20 },
18
+ width: 45,
19
+ height: 10,
20
+ },
21
+ ],
22
+ ],
23
+ basePdf: { width: 210, height: 297, padding: [20, 10, 20, 10] },
24
+ pdfmeVersion: '5.2.16',
25
+ },
26
+ inputs: [{}, {}, {}, {}],
27
+ });
28
+ pdfArrayBuffer = pdf.buffer;
29
+ });
30
+ test('Node.js version - returns array of images', async () => {
31
+ const images = await (0, index_node_1.pdf2img)(pdfArrayBuffer, { scale: 1 });
32
+ expect(Array.isArray(images)).toBe(true);
33
+ expect(images.length).toBe(4);
34
+ expect(images[0]).toBeInstanceOf(ArrayBuffer);
35
+ expect(images[0].byteLength).toBeGreaterThan(0);
36
+ });
37
+ test('pageNumbers option - should render only specified pages', async () => {
38
+ const images = await (0, index_node_1.pdf2img)(pdfArrayBuffer, {
39
+ scale: 1,
40
+ range: { start: 0, end: 1 },
41
+ });
42
+ expect(Array.isArray(images)).toBe(true);
43
+ expect(images.length).toBe(2);
44
+ images.forEach((img) => {
45
+ expect(img).toBeInstanceOf(ArrayBuffer);
46
+ expect(img.byteLength).toBeGreaterThan(0);
47
+ });
48
+ });
49
+ test('invalid PDF input - should throw error', async () => {
50
+ const invalidBuffer = new ArrayBuffer(10);
51
+ await expect((0, index_node_1.pdf2img)(invalidBuffer, { scale: 1 })).rejects.toThrow('Invalid PDF');
52
+ });
53
+ test('empty buffer input - should throw error', async () => {
54
+ const emptyBuffer = new ArrayBuffer(0);
55
+ await expect((0, index_node_1.pdf2img)(emptyBuffer, { scale: 1 })).rejects.toThrow('The PDF file is empty, i.e. its size is zero by');
56
+ });
57
+ });
58
+ describe('pdf2size tests', () => {
59
+ let pdfArrayBuffer;
60
+ beforeAll(async () => {
61
+ const pdf = await (0, generator_1.generate)({
62
+ template: {
63
+ schemas: [
64
+ [
65
+ {
66
+ name: 'field1',
67
+ type: 'text',
68
+ content: 'Type Something...',
69
+ position: { x: 10, y: 20 },
70
+ width: 45,
71
+ height: 10,
72
+ },
73
+ ],
74
+ ],
75
+ basePdf: { width: 210, height: 297, padding: [20, 10, 20, 10] },
76
+ pdfmeVersion: '5.2.16',
77
+ },
78
+ inputs: [{}, {}, {}, {}],
79
+ });
80
+ pdfArrayBuffer = pdf.buffer;
81
+ });
82
+ test('returns array of page sizes', async () => {
83
+ const sizes = await (0, index_node_1.pdf2size)(pdfArrayBuffer, { scale: 1 });
84
+ expect(Array.isArray(sizes)).toBe(true);
85
+ expect(sizes.length).toBe(4);
86
+ sizes.forEach((size) => {
87
+ expect(typeof size.width).toBe('number');
88
+ expect(typeof size.height).toBe('number');
89
+ expect(size.width).toBeGreaterThan(0);
90
+ expect(size.height).toBeGreaterThan(0);
91
+ });
92
+ });
93
+ test('scale option - properly adjusts size', async () => {
94
+ const scale = 0.5;
95
+ const sizes = await (0, index_node_1.pdf2size)(pdfArrayBuffer, { scale });
96
+ sizes.forEach((size) => {
97
+ expect(size.width).toBeLessThan(200);
98
+ expect(size.height).toBeLessThan(300);
99
+ });
100
+ });
101
+ test('invalid PDF input - should throw error', async () => {
102
+ const invalidBuffer = new ArrayBuffer(10);
103
+ await expect((0, index_node_1.pdf2size)(invalidBuffer, { scale: 1 })).rejects.toThrow('Invalid PDF');
104
+ });
105
+ test('empty buffer input - should throw error', async () => {
106
+ const emptyBuffer = new ArrayBuffer(0);
107
+ await expect((0, index_node_1.pdf2size)(emptyBuffer, { scale: 1 })).rejects.toThrow('The PDF file is empty, i.e. its size is zero by');
108
+ });
109
+ });
110
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../__tests__/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.pdf2size = exports.pdf2img = void 0;
30
+ const pdfjsLib = __importStar(require("pdfjs-dist"));
31
+ // @ts-expect-error
32
+ const pdf_worker_js_1 = __importDefault(require("pdfjs-dist/legacy/build/pdf.worker.js"));
33
+ const pdf2img_js_1 = require("./pdf2img.js");
34
+ const pdf2size_js_1 = require("./pdf2size.js");
35
+ // @ts-ignore
36
+ pdfjsLib.GlobalWorkerOptions.workerSrc = pdf_worker_js_1.default;
37
+ function dataURLToArrayBuffer(dataURL) {
38
+ // Split out the actual base64 string from the data URL scheme
39
+ const base64String = dataURL.split(',')[1];
40
+ // Decode the Base64 string to get the binary data
41
+ const byteString = atob(base64String);
42
+ // Create a typed array from the binary string
43
+ const arrayBuffer = new ArrayBuffer(byteString.length);
44
+ const uintArray = new Uint8Array(arrayBuffer);
45
+ for (let i = 0; i < byteString.length; i++) {
46
+ uintArray[i] = byteString.charCodeAt(i);
47
+ }
48
+ return arrayBuffer;
49
+ }
50
+ const pdf2img = async (pdf, options = {}) => (0, pdf2img_js_1.pdf2img)(pdf, options, {
51
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
52
+ createCanvas: (width, height) => {
53
+ const canvas = document.createElement('canvas');
54
+ canvas.width = width;
55
+ canvas.height = height;
56
+ return canvas;
57
+ },
58
+ canvasToArrayBuffer: (canvas, imageType) =>
59
+ // @ts-ignore
60
+ dataURLToArrayBuffer(canvas.toDataURL(`image/${imageType}`)),
61
+ });
62
+ exports.pdf2img = pdf2img;
63
+ const pdf2size = async (pdf, options = {}) => (0, pdf2size_js_1.pdf2size)(pdf, options, {
64
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
65
+ });
66
+ exports.pdf2size = pdf2size;
67
+ //# sourceMappingURL=index.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../../src/index.browser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAuC;AACvC,mBAAmB;AACnB,0FAAgE;AAChE,6CAAmE;AACnE,+CAAuE;AAEvE,aAAa;AACb,QAAQ,CAAC,mBAAmB,CAAC,SAAS,GAAG,uBAAW,CAAC;AAErD,SAAS,oBAAoB,CAAC,OAAe;IAC3C,8DAA8D;IAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,kDAAkD;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAEtC,8CAA8C;IAC9C,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC1C,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACzC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAGM,MAAM,OAAO,GAAG,KAAK,EAAE,GAAgB,EAAE,UAA0B,EAAE,EAAE,EAAE,CAC9E,IAAA,oBAAQ,EAAC,GAAG,EAAE,OAAO,EAAE;IACrB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO;IACvD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,mBAAmB,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;IACzC,aAAa;IACb,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;CAC/D,CAAC,CAAC;AAZQ,QAAA,OAAO,WAYf;AAEE,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAgB,EAAE,UAA2B,EAAE,EAAE,EAAE,CAChF,IAAA,sBAAS,EAAC,GAAG,EAAE,OAAO,EAAE;IACtB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO;CACxD,CAAC,CAAC;AAHQ,QAAA,QAAQ,YAGhB"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.pdf2size = exports.pdf2img = void 0;
30
+ const canvas_1 = require("canvas");
31
+ const pdf2img_js_1 = require("./pdf2img.js");
32
+ const pdf2size_js_1 = require("./pdf2size.js");
33
+ const pdfjsLib = __importStar(require("pdfjs-dist/legacy/build/pdf"));
34
+ // @ts-expect-error
35
+ const pdf_worker_1 = __importDefault(require("pdfjs-dist/build/pdf.worker"));
36
+ // @ts-ignore
37
+ pdfjsLib.GlobalWorkerOptions.workerSrc = pdf_worker_1.default;
38
+ const pdf2img = async (pdf, options = {}) => (0, pdf2img_js_1.pdf2img)(pdf, options, {
39
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
40
+ createCanvas: (width, height) => (0, canvas_1.createCanvas)(width, height),
41
+ canvasToArrayBuffer: (canvas, imageType) => {
42
+ // @ts-ignore
43
+ const buffer = canvas.toBuffer(`image/${imageType}`);
44
+ // @ts-ignore
45
+ return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
46
+ },
47
+ });
48
+ exports.pdf2img = pdf2img;
49
+ const pdf2size = async (pdf, options = {}) => (0, pdf2size_js_1.pdf2size)(pdf, options, {
50
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
51
+ });
52
+ exports.pdf2size = pdf2size;
53
+ //# sourceMappingURL=index.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.node.js","sourceRoot":"","sources":["../../../src/index.node.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAsC;AACtC,6CAAmE;AACnE,+CAAuE;AACvE,sEAAwD;AACxD,mBAAmB;AACnB,6EAAsD;AAEtD,aAAa;AACb,QAAQ,CAAC,mBAAmB,CAAC,SAAS,GAAG,oBAAW,CAAC;AAE9C,MAAM,OAAO,GAAG,KAAK,EAAE,GAAgB,EAAE,UAA0B,EAAE,EAAE,EAAE,CAC9E,IAAA,oBAAQ,EAAC,GAAG,EAAE,OAAO,EAAE;IACrB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO;IACvD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAA,qBAAY,EAAC,KAAK,EAAE,MAAM,CAAiC;IAC5F,mBAAmB,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;QACzC,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;QACrD,aAAa;QACb,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACvF,CAAC;CACF,CAAC,CAAC;AAVQ,QAAA,OAAO,WAUf;AAEE,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAgB,EAAE,UAA2B,EAAE,EAAE,EAAE,CAChF,IAAA,sBAAS,EAAC,GAAG,EAAE,OAAO,EAAE;IACtB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO;CACxD,CAAC,CAAC;AAHQ,QAAA,QAAQ,YAGhB"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pdf2img = void 0;
4
+ async function pdf2img(pdf, options = {}, env) {
5
+ try {
6
+ const { scale = 1, imageType = 'jpeg', range = {} } = options;
7
+ const { start = 0, end = Infinity } = range;
8
+ const { getDocument, createCanvas, canvasToArrayBuffer } = env;
9
+ const pdfDoc = await getDocument(pdf);
10
+ const numPages = pdfDoc.numPages;
11
+ const startPage = Math.max(start + 1, 1);
12
+ const endPage = Math.min(end + 1, numPages);
13
+ const results = [];
14
+ for (let pageNum = startPage; pageNum <= endPage; pageNum++) {
15
+ const page = await pdfDoc.getPage(pageNum);
16
+ const viewport = page.getViewport({ scale });
17
+ const canvas = createCanvas(viewport.width, viewport.height);
18
+ if (!canvas) {
19
+ throw new Error('Failed to create canvas');
20
+ }
21
+ const context = canvas.getContext('2d');
22
+ if (!context) {
23
+ throw new Error('Failed to get canvas context');
24
+ }
25
+ await page.render({ canvasContext: context, viewport }).promise;
26
+ const arrayBuffer = canvasToArrayBuffer(canvas, imageType);
27
+ results.push(arrayBuffer);
28
+ }
29
+ return results;
30
+ }
31
+ catch (error) {
32
+ throw new Error(`[@pdfme/converter] pdf2img failed: ${error.message}`);
33
+ }
34
+ }
35
+ exports.pdf2img = pdf2img;
36
+ //# sourceMappingURL=pdf2img.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf2img.js","sourceRoot":"","sources":["../../../src/pdf2img.ts"],"names":[],"mappings":";;;AAsBO,KAAK,UAAU,OAAO,CAC3B,GAAgB,EAChB,UAA0B,EAAE,EAC5B,GAAgB;IAEhB,IAAI;QACF,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,GAAG,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;QAC9D,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC;QAE5C,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,GAAG,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAE5C,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,IAAI,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE;YAC3D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;aAC5C;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAA6B,CAAC;YACpE,IAAI,CAAC,OAAO,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;aACjD;YAED,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC;YAChE,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC3B;QAED,OAAO,OAAO,CAAC;KAChB;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,sCAAuC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;KACnF;AACH,CAAC;AA1CD,0BA0CC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pdf2size = void 0;
4
+ const common_1 = require("@pdfme/common");
5
+ async function pdf2size(pdf, options = {}, env) {
6
+ const { scale = 1 } = options;
7
+ const { getDocument } = env;
8
+ const pdfDoc = await getDocument(pdf);
9
+ const promises = Promise.all(new Array(pdfDoc.numPages).fill('').map(async (_, i) => {
10
+ return await pdfDoc.getPage(i + 1).then((page) => {
11
+ const { height, width } = page.getViewport({ scale, rotation: 0 });
12
+ return { height: (0, common_1.pt2mm)(height), width: (0, common_1.pt2mm)(width) };
13
+ });
14
+ }));
15
+ return promises;
16
+ }
17
+ exports.pdf2size = pdf2size;
18
+ //# sourceMappingURL=pdf2size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf2size.js","sourceRoot":"","sources":["../../../src/pdf2size.ts"],"names":[],"mappings":";;;AACA,0CAA4C;AAUrC,KAAK,UAAU,QAAQ,CAC5B,GAAgB,EAChB,UAA2B,EAAE,EAC7B,GAAgB;IAEhB,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAC9B,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAE5B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAC1B,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QACrD,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAEnE,OAAO,EAAE,MAAM,EAAE,IAAA,cAAK,EAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAA,cAAK,EAAC,KAAK,CAAC,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AArBD,4BAqBC"}
@@ -0,0 +1,108 @@
1
+ // @ts-ignore
2
+ import { generate } from '@pdfme/generator';
3
+ import { pdf2img as nodePdf2Img, pdf2size as nodePdf2Size } from '../src/index.node';
4
+ describe('pdf2img tests', () => {
5
+ let pdfArrayBuffer;
6
+ beforeAll(async () => {
7
+ const pdf = await generate({
8
+ template: {
9
+ schemas: [
10
+ [
11
+ {
12
+ name: 'field1',
13
+ type: 'text',
14
+ content: 'Type Something...',
15
+ position: { x: 10, y: 20 },
16
+ width: 45,
17
+ height: 10,
18
+ },
19
+ ],
20
+ ],
21
+ basePdf: { width: 210, height: 297, padding: [20, 10, 20, 10] },
22
+ pdfmeVersion: '5.2.16',
23
+ },
24
+ inputs: [{}, {}, {}, {}],
25
+ });
26
+ pdfArrayBuffer = pdf.buffer;
27
+ });
28
+ test('Node.js version - returns array of images', async () => {
29
+ const images = await nodePdf2Img(pdfArrayBuffer, { scale: 1 });
30
+ expect(Array.isArray(images)).toBe(true);
31
+ expect(images.length).toBe(4);
32
+ expect(images[0]).toBeInstanceOf(ArrayBuffer);
33
+ expect(images[0].byteLength).toBeGreaterThan(0);
34
+ });
35
+ test('pageNumbers option - should render only specified pages', async () => {
36
+ const images = await nodePdf2Img(pdfArrayBuffer, {
37
+ scale: 1,
38
+ range: { start: 0, end: 1 },
39
+ });
40
+ expect(Array.isArray(images)).toBe(true);
41
+ expect(images.length).toBe(2);
42
+ images.forEach((img) => {
43
+ expect(img).toBeInstanceOf(ArrayBuffer);
44
+ expect(img.byteLength).toBeGreaterThan(0);
45
+ });
46
+ });
47
+ test('invalid PDF input - should throw error', async () => {
48
+ const invalidBuffer = new ArrayBuffer(10);
49
+ await expect(nodePdf2Img(invalidBuffer, { scale: 1 })).rejects.toThrow('Invalid PDF');
50
+ });
51
+ test('empty buffer input - should throw error', async () => {
52
+ const emptyBuffer = new ArrayBuffer(0);
53
+ await expect(nodePdf2Img(emptyBuffer, { scale: 1 })).rejects.toThrow('The PDF file is empty, i.e. its size is zero by');
54
+ });
55
+ });
56
+ describe('pdf2size tests', () => {
57
+ let pdfArrayBuffer;
58
+ beforeAll(async () => {
59
+ const pdf = await generate({
60
+ template: {
61
+ schemas: [
62
+ [
63
+ {
64
+ name: 'field1',
65
+ type: 'text',
66
+ content: 'Type Something...',
67
+ position: { x: 10, y: 20 },
68
+ width: 45,
69
+ height: 10,
70
+ },
71
+ ],
72
+ ],
73
+ basePdf: { width: 210, height: 297, padding: [20, 10, 20, 10] },
74
+ pdfmeVersion: '5.2.16',
75
+ },
76
+ inputs: [{}, {}, {}, {}],
77
+ });
78
+ pdfArrayBuffer = pdf.buffer;
79
+ });
80
+ test('returns array of page sizes', async () => {
81
+ const sizes = await nodePdf2Size(pdfArrayBuffer, { scale: 1 });
82
+ expect(Array.isArray(sizes)).toBe(true);
83
+ expect(sizes.length).toBe(4);
84
+ sizes.forEach((size) => {
85
+ expect(typeof size.width).toBe('number');
86
+ expect(typeof size.height).toBe('number');
87
+ expect(size.width).toBeGreaterThan(0);
88
+ expect(size.height).toBeGreaterThan(0);
89
+ });
90
+ });
91
+ test('scale option - properly adjusts size', async () => {
92
+ const scale = 0.5;
93
+ const sizes = await nodePdf2Size(pdfArrayBuffer, { scale });
94
+ sizes.forEach((size) => {
95
+ expect(size.width).toBeLessThan(200);
96
+ expect(size.height).toBeLessThan(300);
97
+ });
98
+ });
99
+ test('invalid PDF input - should throw error', async () => {
100
+ const invalidBuffer = new ArrayBuffer(10);
101
+ await expect(nodePdf2Size(invalidBuffer, { scale: 1 })).rejects.toThrow('Invalid PDF');
102
+ });
103
+ test('empty buffer input - should throw error', async () => {
104
+ const emptyBuffer = new ArrayBuffer(0);
105
+ await expect(nodePdf2Size(emptyBuffer, { scale: 1 })).rejects.toThrow('The PDF file is empty, i.e. its size is zero by');
106
+ });
107
+ });
108
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../__tests__/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import * as pdfjsLib from 'pdfjs-dist';
2
+ // @ts-expect-error
3
+ import PDFJSWorker from 'pdfjs-dist/legacy/build/pdf.worker.js';
4
+ import { pdf2img as _pdf2img } from './pdf2img.js';
5
+ import { pdf2size as _pdf2size } from './pdf2size.js';
6
+ // @ts-ignore
7
+ pdfjsLib.GlobalWorkerOptions.workerSrc = PDFJSWorker;
8
+ function dataURLToArrayBuffer(dataURL) {
9
+ // Split out the actual base64 string from the data URL scheme
10
+ const base64String = dataURL.split(',')[1];
11
+ // Decode the Base64 string to get the binary data
12
+ const byteString = atob(base64String);
13
+ // Create a typed array from the binary string
14
+ const arrayBuffer = new ArrayBuffer(byteString.length);
15
+ const uintArray = new Uint8Array(arrayBuffer);
16
+ for (let i = 0; i < byteString.length; i++) {
17
+ uintArray[i] = byteString.charCodeAt(i);
18
+ }
19
+ return arrayBuffer;
20
+ }
21
+ export const pdf2img = async (pdf, options = {}) => _pdf2img(pdf, options, {
22
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
23
+ createCanvas: (width, height) => {
24
+ const canvas = document.createElement('canvas');
25
+ canvas.width = width;
26
+ canvas.height = height;
27
+ return canvas;
28
+ },
29
+ canvasToArrayBuffer: (canvas, imageType) =>
30
+ // @ts-ignore
31
+ dataURLToArrayBuffer(canvas.toDataURL(`image/${imageType}`)),
32
+ });
33
+ export const pdf2size = async (pdf, options = {}) => _pdf2size(pdf, options, {
34
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
35
+ });
36
+ //# sourceMappingURL=index.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../../src/index.browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,mBAAmB;AACnB,OAAO,WAAW,MAAM,uCAAuC,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAkB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAmB,MAAM,eAAe,CAAC;AAEvE,aAAa;AACb,QAAQ,CAAC,mBAAmB,CAAC,SAAS,GAAG,WAAW,CAAC;AAErD,SAAS,oBAAoB,CAAC,OAAe;IAC3C,8DAA8D;IAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,kDAAkD;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAEtC,8CAA8C;IAC9C,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC1C,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACzC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAGD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,GAAgB,EAAE,UAA0B,EAAE,EAAE,EAAE,CAC9E,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE;IACrB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO;IACvD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,mBAAmB,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;IACzC,aAAa;IACb,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;CAC/D,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAgB,EAAE,UAA2B,EAAE,EAAE,EAAE,CAChF,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE;IACtB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO;CACxD,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { createCanvas } from 'canvas';
2
+ import { pdf2img as _pdf2img } from './pdf2img.js';
3
+ import { pdf2size as _pdf2size } from './pdf2size.js';
4
+ import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf';
5
+ // @ts-expect-error
6
+ import PDFJSWorker from 'pdfjs-dist/build/pdf.worker';
7
+ // @ts-ignore
8
+ pdfjsLib.GlobalWorkerOptions.workerSrc = PDFJSWorker;
9
+ export const pdf2img = async (pdf, options = {}) => _pdf2img(pdf, options, {
10
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
11
+ createCanvas: (width, height) => createCanvas(width, height),
12
+ canvasToArrayBuffer: (canvas, imageType) => {
13
+ // @ts-ignore
14
+ const buffer = canvas.toBuffer(`image/${imageType}`);
15
+ // @ts-ignore
16
+ return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
17
+ },
18
+ });
19
+ export const pdf2size = async (pdf, options = {}) => _pdf2size(pdf, options, {
20
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
21
+ });
22
+ //# sourceMappingURL=index.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.node.js","sourceRoot":"","sources":["../../../src/index.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAkB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAmB,MAAM,eAAe,CAAC;AACvE,OAAO,KAAK,QAAQ,MAAM,6BAA6B,CAAC;AACxD,mBAAmB;AACnB,OAAO,WAAW,MAAM,6BAA6B,CAAC;AAEtD,aAAa;AACb,QAAQ,CAAC,mBAAmB,CAAC,SAAS,GAAG,WAAW,CAAC;AAErD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,GAAgB,EAAE,UAA0B,EAAE,EAAE,EAAE,CAC9E,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE;IACrB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO;IACvD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAiC;IAC5F,mBAAmB,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;QACzC,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;QACrD,aAAa;QACb,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACvF,CAAC;CACF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAgB,EAAE,UAA2B,EAAE,EAAE,EAAE,CAChF,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE;IACtB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO;CACxD,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ export async function pdf2img(pdf, options = {}, env) {
2
+ try {
3
+ const { scale = 1, imageType = 'jpeg', range = {} } = options;
4
+ const { start = 0, end = Infinity } = range;
5
+ const { getDocument, createCanvas, canvasToArrayBuffer } = env;
6
+ const pdfDoc = await getDocument(pdf);
7
+ const numPages = pdfDoc.numPages;
8
+ const startPage = Math.max(start + 1, 1);
9
+ const endPage = Math.min(end + 1, numPages);
10
+ const results = [];
11
+ for (let pageNum = startPage; pageNum <= endPage; pageNum++) {
12
+ const page = await pdfDoc.getPage(pageNum);
13
+ const viewport = page.getViewport({ scale });
14
+ const canvas = createCanvas(viewport.width, viewport.height);
15
+ if (!canvas) {
16
+ throw new Error('Failed to create canvas');
17
+ }
18
+ const context = canvas.getContext('2d');
19
+ if (!context) {
20
+ throw new Error('Failed to get canvas context');
21
+ }
22
+ await page.render({ canvasContext: context, viewport }).promise;
23
+ const arrayBuffer = canvasToArrayBuffer(canvas, imageType);
24
+ results.push(arrayBuffer);
25
+ }
26
+ return results;
27
+ }
28
+ catch (error) {
29
+ throw new Error(`[@pdfme/converter] pdf2img failed: ${error.message}`);
30
+ }
31
+ }
32
+ //# sourceMappingURL=pdf2img.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf2img.js","sourceRoot":"","sources":["../../../src/pdf2img.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAgB,EAChB,UAA0B,EAAE,EAC5B,GAAgB;IAEhB,IAAI;QACF,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,GAAG,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;QAC9D,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC;QAE5C,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,GAAG,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAE5C,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,IAAI,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE;YAC3D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;aAC5C;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAA6B,CAAC;YACpE,IAAI,CAAC,OAAO,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;aACjD;YAED,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC;YAChE,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC3B;QAED,OAAO,OAAO,CAAC;KAChB;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,sCAAuC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;KACnF;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { pt2mm } from '@pdfme/common';
2
+ export async function pdf2size(pdf, options = {}, env) {
3
+ const { scale = 1 } = options;
4
+ const { getDocument } = env;
5
+ const pdfDoc = await getDocument(pdf);
6
+ const promises = Promise.all(new Array(pdfDoc.numPages).fill('').map(async (_, i) => {
7
+ return await pdfDoc.getPage(i + 1).then((page) => {
8
+ const { height, width } = page.getViewport({ scale, rotation: 0 });
9
+ return { height: pt2mm(height), width: pt2mm(width) };
10
+ });
11
+ }));
12
+ return promises;
13
+ }
14
+ //# sourceMappingURL=pdf2size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf2size.js","sourceRoot":"","sources":["../../../src/pdf2size.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,EAAE,MAAM,eAAe,CAAC;AAU5C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAgB,EAChB,UAA2B,EAAE,EAC7B,GAAgB;IAEhB,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAC9B,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAE5B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAC1B,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QACrD,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAEnE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { Pdf2ImgOptions } from './pdf2img.js';
2
+ import { Pdf2SizeOptions } from './pdf2size.js';
3
+ export declare const pdf2img: (pdf: ArrayBuffer, options?: Pdf2ImgOptions) => Promise<ArrayBuffer[]>;
4
+ export declare const pdf2size: (pdf: ArrayBuffer, options?: Pdf2SizeOptions) => Promise<{
5
+ width: number;
6
+ height: number;
7
+ }[]>;
@@ -0,0 +1,7 @@
1
+ import { Pdf2ImgOptions } from './pdf2img.js';
2
+ import { Pdf2SizeOptions } from './pdf2size.js';
3
+ export declare const pdf2img: (pdf: ArrayBuffer, options?: Pdf2ImgOptions) => Promise<ArrayBuffer[]>;
4
+ export declare const pdf2size: (pdf: ArrayBuffer, options?: Pdf2SizeOptions) => Promise<{
5
+ width: number;
6
+ height: number;
7
+ }[]>;
@@ -0,0 +1,17 @@
1
+ import type { PDFDocumentProxy } from 'pdfjs-dist';
2
+ type ImageType = 'jpeg' | 'png';
3
+ interface Environment {
4
+ getDocument: (pdf: ArrayBuffer) => Promise<PDFDocumentProxy>;
5
+ createCanvas: (width: number, height: number) => HTMLCanvasElement | OffscreenCanvas;
6
+ canvasToArrayBuffer: (canvas: HTMLCanvasElement | OffscreenCanvas, imageType: ImageType) => ArrayBuffer;
7
+ }
8
+ export interface Pdf2ImgOptions {
9
+ scale?: number;
10
+ imageType?: ImageType;
11
+ range?: {
12
+ start?: number;
13
+ end?: number;
14
+ };
15
+ }
16
+ export declare function pdf2img(pdf: ArrayBuffer, options: Pdf2ImgOptions | undefined, env: Environment): Promise<ArrayBuffer[]>;
17
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { PDFDocumentProxy } from 'pdfjs-dist';
2
+ import { Size } from '@pdfme/common';
3
+ interface Environment {
4
+ getDocument: (pdf: ArrayBuffer) => Promise<PDFDocumentProxy>;
5
+ }
6
+ export interface Pdf2SizeOptions {
7
+ scale?: number;
8
+ }
9
+ export declare function pdf2size(pdf: ArrayBuffer, options: Pdf2SizeOptions | undefined, env: Environment): Promise<Size[]>;
10
+ export {};
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@pdfme/converter",
3
+ "version": "5.3.0-beta.0",
4
+ "sideEffects": false,
5
+ "author": "hand-dot",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "pdf",
9
+ "pdf-generation",
10
+ "pdf-designer",
11
+ "pdf-viewer",
12
+ "typescript",
13
+ "react"
14
+ ],
15
+ "description": "TypeScript base PDF generator and React base UI. Open source, developed by the community, and completely free to use under the MIT license!",
16
+ "homepage": "https://pdfme.com",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git@github.com:pdfme/pdfme.git"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/pdfme/pdfme/issues"
23
+ },
24
+ "main": "dist/cjs/src/index.js",
25
+ "module": "dist/esm/src/index.js",
26
+ "types": "dist/types/src/index.node.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "browser": "./dist/esm/src/index.browser.js",
30
+ "node": "./dist/cjs/src/index.node.js",
31
+ "default": "./dist/esm/src/index.browser.js",
32
+ "types": "./dist/types/src/index.node.d.ts"
33
+ }
34
+ },
35
+ "scripts": {
36
+ "dev": "tsc -p tsconfig.esm.json -w",
37
+ "build": "npm-run-all --parallel build:cjs build:esm",
38
+ "build:cjs": "tsc -p tsconfig.cjs.json",
39
+ "build:esm": "tsc -p tsconfig.esm.json",
40
+ "clean": "rimraf dist",
41
+ "lint": "eslint --ext .ts src",
42
+ "test": "jest",
43
+ "prune": "ts-prune src",
44
+ "prettier": "prettier --write 'src/**/*.ts'"
45
+ },
46
+ "dependencies": {
47
+ "@pdfme/common": "file:../common",
48
+ "pdfjs-dist": "^3.11.174"
49
+ },
50
+ "devDependencies": {
51
+ "@pdfme/generator": "file:../generator",
52
+ "@types/estree": "^1.0.6"
53
+ },
54
+ "optionalDependencies": {
55
+ "canvas": "^2.11.0"
56
+ },
57
+ "jest": {
58
+ "resolver": "ts-jest-resolver",
59
+ "moduleFileExtensions": [
60
+ "js",
61
+ "ts"
62
+ ],
63
+ "transform": {
64
+ "^.+\\.ts?$": [
65
+ "ts-jest",
66
+ {
67
+ "tsconfig": "tsconfig.esm.json"
68
+ }
69
+ ]
70
+ },
71
+ "testMatch": [
72
+ "**/*.test.ts"
73
+ ]
74
+ },
75
+ "publishConfig": {
76
+ "access": "public"
77
+ }
78
+ }
@@ -0,0 +1,46 @@
1
+ import * as pdfjsLib from 'pdfjs-dist';
2
+ // @ts-expect-error
3
+ import PDFJSWorker from 'pdfjs-dist/legacy/build/pdf.worker.js';
4
+ import { pdf2img as _pdf2img, Pdf2ImgOptions } from './pdf2img.js';
5
+ import { pdf2size as _pdf2size, Pdf2SizeOptions } from './pdf2size.js';
6
+
7
+ // @ts-ignore
8
+ pdfjsLib.GlobalWorkerOptions.workerSrc = PDFJSWorker;
9
+
10
+ function dataURLToArrayBuffer(dataURL: string): ArrayBuffer {
11
+ // Split out the actual base64 string from the data URL scheme
12
+ const base64String = dataURL.split(',')[1];
13
+
14
+ // Decode the Base64 string to get the binary data
15
+ const byteString = atob(base64String);
16
+
17
+ // Create a typed array from the binary string
18
+ const arrayBuffer = new ArrayBuffer(byteString.length);
19
+ const uintArray = new Uint8Array(arrayBuffer);
20
+
21
+ for (let i = 0; i < byteString.length; i++) {
22
+ uintArray[i] = byteString.charCodeAt(i);
23
+ }
24
+
25
+ return arrayBuffer;
26
+ }
27
+
28
+
29
+ export const pdf2img = async (pdf: ArrayBuffer, options: Pdf2ImgOptions = {}) =>
30
+ _pdf2img(pdf, options, {
31
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
32
+ createCanvas: (width, height) => {
33
+ const canvas = document.createElement('canvas');
34
+ canvas.width = width;
35
+ canvas.height = height;
36
+ return canvas;
37
+ },
38
+ canvasToArrayBuffer: (canvas, imageType) =>
39
+ // @ts-ignore
40
+ dataURLToArrayBuffer(canvas.toDataURL(`image/${imageType}`)),
41
+ });
42
+
43
+ export const pdf2size = async (pdf: ArrayBuffer, options: Pdf2SizeOptions = {}) =>
44
+ _pdf2size(pdf, options, {
45
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
46
+ });
@@ -0,0 +1,26 @@
1
+ import { createCanvas } from 'canvas';
2
+ import { pdf2img as _pdf2img, Pdf2ImgOptions } from './pdf2img.js';
3
+ import { pdf2size as _pdf2size, Pdf2SizeOptions } from './pdf2size.js';
4
+ import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf';
5
+ // @ts-expect-error
6
+ import PDFJSWorker from 'pdfjs-dist/build/pdf.worker';
7
+
8
+ // @ts-ignore
9
+ pdfjsLib.GlobalWorkerOptions.workerSrc = PDFJSWorker;
10
+
11
+ export const pdf2img = async (pdf: ArrayBuffer, options: Pdf2ImgOptions = {}) =>
12
+ _pdf2img(pdf, options, {
13
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
14
+ createCanvas: (width, height) => createCanvas(width, height) as unknown as HTMLCanvasElement,
15
+ canvasToArrayBuffer: (canvas, imageType) => {
16
+ // @ts-ignore
17
+ const buffer = canvas.toBuffer(`image/${imageType}`);
18
+ // @ts-ignore
19
+ return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
20
+ },
21
+ });
22
+
23
+ export const pdf2size = async (pdf: ArrayBuffer, options: Pdf2SizeOptions = {}) =>
24
+ _pdf2size(pdf, options, {
25
+ getDocument: (pdf) => pdfjsLib.getDocument(pdf).promise,
26
+ });
package/src/pdf2img.ts ADDED
@@ -0,0 +1,65 @@
1
+ import type { PDFDocumentProxy } from 'pdfjs-dist';
2
+
3
+ type ImageType = 'jpeg' | 'png';
4
+
5
+ interface Environment {
6
+ getDocument: (pdf: ArrayBuffer) => Promise<PDFDocumentProxy>;
7
+ createCanvas: (width: number, height: number) => HTMLCanvasElement | OffscreenCanvas;
8
+ canvasToArrayBuffer: (
9
+ canvas: HTMLCanvasElement | OffscreenCanvas,
10
+ imageType: ImageType
11
+ ) => ArrayBuffer;
12
+ }
13
+
14
+ export interface Pdf2ImgOptions {
15
+ scale?: number;
16
+ imageType?: ImageType;
17
+ range?: {
18
+ start?: number;
19
+ end?: number;
20
+ };
21
+ }
22
+
23
+ export async function pdf2img(
24
+ pdf: ArrayBuffer,
25
+ options: Pdf2ImgOptions = {},
26
+ env: Environment
27
+ ): Promise<ArrayBuffer[]> {
28
+ try {
29
+ const { scale = 1, imageType = 'jpeg', range = {} } = options;
30
+ const { start = 0, end = Infinity } = range;
31
+
32
+ const { getDocument, createCanvas, canvasToArrayBuffer } = env;
33
+
34
+ const pdfDoc = await getDocument(pdf);
35
+ const numPages = pdfDoc.numPages;
36
+
37
+ const startPage = Math.max(start + 1, 1);
38
+ const endPage = Math.min(end + 1, numPages);
39
+
40
+ const results: ArrayBuffer[] = [];
41
+
42
+ for (let pageNum = startPage; pageNum <= endPage; pageNum++) {
43
+ const page = await pdfDoc.getPage(pageNum);
44
+ const viewport = page.getViewport({ scale });
45
+
46
+ const canvas = createCanvas(viewport.width, viewport.height);
47
+ if (!canvas) {
48
+ throw new Error('Failed to create canvas');
49
+ }
50
+
51
+ const context = canvas.getContext('2d') as CanvasRenderingContext2D;
52
+ if (!context) {
53
+ throw new Error('Failed to get canvas context');
54
+ }
55
+
56
+ await page.render({ canvasContext: context, viewport }).promise;
57
+ const arrayBuffer = canvasToArrayBuffer(canvas, imageType);
58
+ results.push(arrayBuffer);
59
+ }
60
+
61
+ return results;
62
+ } catch (error) {
63
+ throw new Error(`[@pdfme/converter] pdf2img failed: ${(error as Error).message}`);
64
+ }
65
+ }
@@ -0,0 +1,33 @@
1
+ import type { PDFDocumentProxy } from 'pdfjs-dist';
2
+ import { Size, pt2mm } from '@pdfme/common';
3
+
4
+ interface Environment {
5
+ getDocument: (pdf: ArrayBuffer) => Promise<PDFDocumentProxy>;
6
+ }
7
+
8
+ export interface Pdf2SizeOptions {
9
+ scale?: number;
10
+ }
11
+
12
+ export async function pdf2size(
13
+ pdf: ArrayBuffer,
14
+ options: Pdf2SizeOptions = {},
15
+ env: Environment
16
+ ): Promise<Size[]> {
17
+ const { scale = 1 } = options;
18
+ const { getDocument } = env;
19
+
20
+ const pdfDoc = await getDocument(pdf);
21
+
22
+ const promises = Promise.all(
23
+ new Array(pdfDoc.numPages).fill('').map(async (_, i) => {
24
+ return await pdfDoc.getPage(i + 1).then((page) => {
25
+ const { height, width } = page.getViewport({ scale, rotation: 0 });
26
+
27
+ return { height: pt2mm(height), width: pt2mm(width) };
28
+ });
29
+ })
30
+ );
31
+
32
+ return promises;
33
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.base",
3
+ "compilerOptions": {
4
+ "module": "commonjs",
5
+ "outDir": "./dist/cjs",
6
+ "declaration": true,
7
+ "declarationDir": "dist/types",
8
+ "skipLibCheck": true,
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.base",
3
+ "compilerOptions": {
4
+ "module": "ESNext",
5
+ "outDir": "./dist/esm",
6
+ "declaration": true,
7
+ "declarationDir": "dist/types",
8
+ "skipLibCheck": true,
9
+ }
10
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "extends": "./tsconfig.esm",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ }
6
+ }