@pdfme/manipulator 5.3.8-dev.9 → 5.3.9-dev.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/cjs/__tests__/index.test.js +170 -149
- package/dist/cjs/__tests__/index.test.js.map +1 -1
- package/dist/cjs/__tests__/utils.js.map +1 -1
- package/dist/cjs/src/index.js +4 -3
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/esm/__tests__/index.test.js +34 -13
- package/dist/esm/__tests__/index.test.js.map +1 -1
- package/dist/esm/__tests__/utils.js.map +1 -1
- package/dist/esm/src/index.js +4 -3
- package/dist/esm/src/index.js.map +1 -1
- package/dist/types/__tests__/utils.d.ts +3 -5
- package/dist/types/src/index.d.ts +19 -19
- package/eslint.config.mjs +22 -0
- package/package.json +13 -6
- package/src/index.ts +32 -32
- package/tsconfig.cjs.json +1 -1
- package/tsconfig.esm.json +2 -1
- package/.eslintrc.cjs +0 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pdfme/manipulator",
|
|
3
|
-
"version": "5.3.
|
|
3
|
+
"version": "5.3.9-dev.1",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"author": "hand-dot",
|
|
6
6
|
"license": "MIT",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"build:cjs": "tsc -p tsconfig.cjs.json",
|
|
38
38
|
"build:esm": "tsc -p tsconfig.esm.json",
|
|
39
39
|
"clean": "rimraf dist",
|
|
40
|
-
"lint": "eslint --ext .ts src",
|
|
40
|
+
"lint": "eslint --ext .ts src --config eslint.config.mjs",
|
|
41
41
|
"test": "jest",
|
|
42
42
|
"test:update-snapshots": "jest --updateSnapshot",
|
|
43
43
|
"prune": "ts-prune src",
|
|
@@ -54,21 +54,28 @@
|
|
|
54
54
|
"@types/estree": "^1.0.6"
|
|
55
55
|
},
|
|
56
56
|
"jest": {
|
|
57
|
-
"preset": "ts-jest",
|
|
57
|
+
"preset": "ts-jest/presets/default-esm",
|
|
58
58
|
"testEnvironment": "node",
|
|
59
|
+
"testMatch": [
|
|
60
|
+
"**/__tests__/**/*.test.ts"
|
|
61
|
+
],
|
|
59
62
|
"setupFilesAfterEnv": [
|
|
60
63
|
"<rootDir>/jest.setup.js"
|
|
61
64
|
],
|
|
62
|
-
"
|
|
63
|
-
"
|
|
65
|
+
"extensionsToTreatAsEsm": [
|
|
66
|
+
".ts"
|
|
64
67
|
],
|
|
65
68
|
"transform": {
|
|
66
69
|
"^.+\\.tsx?$": [
|
|
67
70
|
"ts-jest",
|
|
68
71
|
{
|
|
69
|
-
"tsconfig": "./tsconfig.json"
|
|
72
|
+
"tsconfig": "./tsconfig.json",
|
|
73
|
+
"useESM": true
|
|
70
74
|
}
|
|
71
75
|
]
|
|
76
|
+
},
|
|
77
|
+
"moduleNameMapper": {
|
|
78
|
+
"^(\\.{1,2}/(?:src|__tests__)/.*)\\.js$": "$1.ts"
|
|
72
79
|
}
|
|
73
80
|
}
|
|
74
81
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PDFDocument, RotationTypes } from '@pdfme/pdf-lib';
|
|
2
2
|
|
|
3
|
-
export const merge = async (pdfs: ArrayBuffer[]): Promise<
|
|
3
|
+
export const merge = async (pdfs: (ArrayBuffer | Uint8Array)[]): Promise<Uint8Array> => {
|
|
4
4
|
if (!pdfs.length) {
|
|
5
5
|
throw new Error('[@pdfme/manipulator] At least one PDF is required for merging');
|
|
6
6
|
}
|
|
@@ -15,28 +15,28 @@ export const merge = async (pdfs: ArrayBuffer[]): Promise<ArrayBuffer> => {
|
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export const split = async (
|
|
18
|
-
pdf: ArrayBuffer,
|
|
19
|
-
ranges: { start?: number; end?: number }[]
|
|
20
|
-
): Promise<
|
|
18
|
+
pdf: ArrayBuffer | Uint8Array,
|
|
19
|
+
ranges: { start?: number; end?: number }[],
|
|
20
|
+
): Promise<Uint8Array[]> => {
|
|
21
21
|
if (!ranges.length) {
|
|
22
22
|
throw new Error('[@pdfme/manipulator] At least one range is required for splitting');
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
const originalPdf = await PDFDocument.load(pdf);
|
|
26
26
|
const numPages = originalPdf.getPages().length;
|
|
27
|
-
const result:
|
|
27
|
+
const result: Uint8Array[] = [];
|
|
28
28
|
|
|
29
29
|
for (const { start = 0, end = numPages - 1 } of ranges) {
|
|
30
30
|
if (start < 0 || end >= numPages || start > end) {
|
|
31
31
|
throw new Error(
|
|
32
|
-
`[@pdfme/manipulator] Invalid range: start=${start}, end=${end}, total pages=${numPages}
|
|
32
|
+
`[@pdfme/manipulator] Invalid range: start=${start}, end=${end}, total pages=${numPages}`,
|
|
33
33
|
);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
const newPdf = await PDFDocument.create();
|
|
37
37
|
const pages = await newPdf.copyPages(
|
|
38
38
|
originalPdf,
|
|
39
|
-
Array.from({ length: end - start + 1 }, (_, i) => i + start)
|
|
39
|
+
Array.from({ length: end - start + 1 }, (_, i) => i + start),
|
|
40
40
|
);
|
|
41
41
|
pages.forEach((page) => newPdf.addPage(page));
|
|
42
42
|
result.push(await newPdf.save());
|
|
@@ -44,7 +44,7 @@ export const split = async (
|
|
|
44
44
|
return result;
|
|
45
45
|
};
|
|
46
46
|
|
|
47
|
-
export const remove = async (pdf: ArrayBuffer, pages: number[]): Promise<
|
|
47
|
+
export const remove = async (pdf: ArrayBuffer | Uint8Array, pages: number[]): Promise<Uint8Array> => {
|
|
48
48
|
if (!pages.length) {
|
|
49
49
|
throw new Error('[@pdfme/manipulator] At least one page number is required for removal');
|
|
50
50
|
}
|
|
@@ -54,7 +54,7 @@ export const remove = async (pdf: ArrayBuffer, pages: number[]): Promise<ArrayBu
|
|
|
54
54
|
|
|
55
55
|
if (pages.some((page) => page < 0 || page >= numPages)) {
|
|
56
56
|
throw new Error(
|
|
57
|
-
`[@pdfme/manipulator] Invalid page number: pages must be between 0 and ${numPages - 1}
|
|
57
|
+
`[@pdfme/manipulator] Invalid page number: pages must be between 0 and ${numPages - 1}`,
|
|
58
58
|
);
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -63,9 +63,9 @@ export const remove = async (pdf: ArrayBuffer, pages: number[]): Promise<ArrayBu
|
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
export const insert = async (
|
|
66
|
-
basePdf: ArrayBuffer,
|
|
67
|
-
inserts: { pdf: ArrayBuffer; position: number }[]
|
|
68
|
-
): Promise<
|
|
66
|
+
basePdf: ArrayBuffer | Uint8Array,
|
|
67
|
+
inserts: { pdf: ArrayBuffer | Uint8Array; position: number }[],
|
|
68
|
+
): Promise<Uint8Array> => {
|
|
69
69
|
inserts.sort((a, b) => a.position - b.position);
|
|
70
70
|
|
|
71
71
|
let currentPdf = basePdf;
|
|
@@ -88,7 +88,7 @@ export const insert = async (
|
|
|
88
88
|
if (actualPos > 0) {
|
|
89
89
|
const beforePages = await newPdfDoc.copyPages(
|
|
90
90
|
basePdfDoc,
|
|
91
|
-
Array.from({ length: actualPos }, (_, idx) => idx)
|
|
91
|
+
Array.from({ length: actualPos }, (_, idx) => idx),
|
|
92
92
|
);
|
|
93
93
|
beforePages.forEach((page) => newPdfDoc.addPage(page));
|
|
94
94
|
}
|
|
@@ -99,7 +99,7 @@ export const insert = async (
|
|
|
99
99
|
if (actualPos < numPages) {
|
|
100
100
|
const afterPages = await newPdfDoc.copyPages(
|
|
101
101
|
basePdfDoc,
|
|
102
|
-
Array.from({ length: numPages - actualPos }, (_, idx) => idx + actualPos)
|
|
102
|
+
Array.from({ length: numPages - actualPos }, (_, idx) => idx + actualPos),
|
|
103
103
|
);
|
|
104
104
|
afterPages.forEach((page) => newPdfDoc.addPage(page));
|
|
105
105
|
}
|
|
@@ -109,14 +109,15 @@ export const insert = async (
|
|
|
109
109
|
offset += insertDoc.getPageCount();
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
const pdfDoc = await PDFDocument.load(currentPdf);
|
|
113
|
+
return pdfDoc.save();
|
|
113
114
|
};
|
|
114
115
|
|
|
115
116
|
export const rotate = async (
|
|
116
|
-
pdf: ArrayBuffer,
|
|
117
|
+
pdf: ArrayBuffer | Uint8Array,
|
|
117
118
|
degrees: 0 | 90 | 180 | 270 | 360,
|
|
118
|
-
pageNumbers?: number[]
|
|
119
|
-
): Promise<
|
|
119
|
+
pageNumbers?: number[],
|
|
120
|
+
): Promise<Uint8Array> => {
|
|
120
121
|
if (!Number.isInteger(degrees) || degrees % 90 !== 0) {
|
|
121
122
|
throw new Error('[@pdfme/manipulator] Rotation degrees must be a multiple of 90');
|
|
122
123
|
}
|
|
@@ -137,7 +138,7 @@ export const rotate = async (
|
|
|
137
138
|
if (pageNumbers) {
|
|
138
139
|
if (pageNumbers.some((page) => page < 0 || page >= pages.length)) {
|
|
139
140
|
throw new Error(
|
|
140
|
-
`[@pdfme/manipulator] Invalid page number: pages must be between 0 and ${pages.length - 1}
|
|
141
|
+
`[@pdfme/manipulator] Invalid page number: pages must be between 0 and ${pages.length - 1}`,
|
|
141
142
|
);
|
|
142
143
|
}
|
|
143
144
|
}
|
|
@@ -156,21 +157,21 @@ export const rotate = async (
|
|
|
156
157
|
};
|
|
157
158
|
|
|
158
159
|
export const move = async (
|
|
159
|
-
pdf: ArrayBuffer,
|
|
160
|
-
operation: { from: number; to: number }
|
|
161
|
-
): Promise<
|
|
160
|
+
pdf: ArrayBuffer | Uint8Array,
|
|
161
|
+
operation: { from: number; to: number },
|
|
162
|
+
): Promise<Uint8Array> => {
|
|
162
163
|
const { from, to } = operation;
|
|
163
164
|
const pdfDoc = await PDFDocument.load(pdf);
|
|
164
165
|
const currentPageCount = pdfDoc.getPageCount();
|
|
165
166
|
|
|
166
167
|
if (from < 0 || from >= currentPageCount || to < 0 || to >= currentPageCount) {
|
|
167
168
|
throw new Error(
|
|
168
|
-
`[@pdfme/manipulator] Invalid page number: from=${from}, to=${to}, total pages=${currentPageCount}
|
|
169
|
+
`[@pdfme/manipulator] Invalid page number: from=${from}, to=${to}, total pages=${currentPageCount}`,
|
|
169
170
|
);
|
|
170
171
|
}
|
|
171
172
|
|
|
172
173
|
if (from === to) {
|
|
173
|
-
return
|
|
174
|
+
return pdfDoc.save();
|
|
174
175
|
}
|
|
175
176
|
|
|
176
177
|
const page = pdfDoc.getPage(from);
|
|
@@ -182,17 +183,16 @@ export const move = async (
|
|
|
182
183
|
return pdfDoc.save();
|
|
183
184
|
};
|
|
184
185
|
|
|
185
|
-
|
|
186
186
|
export const organize = async (
|
|
187
|
-
pdf: ArrayBuffer,
|
|
187
|
+
pdf: ArrayBuffer | Uint8Array,
|
|
188
188
|
actions: Array<
|
|
189
189
|
| { type: 'remove'; data: { position: number } }
|
|
190
|
-
| { type: 'insert'; data: { pdf: ArrayBuffer; position: number } }
|
|
191
|
-
| { type: 'replace'; data: { pdf: ArrayBuffer; position: number } }
|
|
190
|
+
| { type: 'insert'; data: { pdf: ArrayBuffer | Uint8Array; position: number } }
|
|
191
|
+
| { type: 'replace'; data: { pdf: ArrayBuffer | Uint8Array; position: number } }
|
|
192
192
|
| { type: 'rotate'; data: { position: number; degrees: 0 | 90 | 180 | 270 | 360 } }
|
|
193
193
|
| { type: 'move'; data: { from: number; to: number } }
|
|
194
|
-
|
|
195
|
-
): Promise<
|
|
194
|
+
>,
|
|
195
|
+
): Promise<Uint8Array> => {
|
|
196
196
|
if (!actions.length) {
|
|
197
197
|
throw new Error('[@pdfme/manipulator] At least one action is required');
|
|
198
198
|
}
|
|
@@ -200,7 +200,7 @@ export const organize = async (
|
|
|
200
200
|
let currentPdf = await PDFDocument.load(pdf);
|
|
201
201
|
|
|
202
202
|
for (const action of actions) {
|
|
203
|
-
const currentBuffer =
|
|
203
|
+
const currentBuffer = await currentPdf.save();
|
|
204
204
|
|
|
205
205
|
switch (action.type) {
|
|
206
206
|
case 'remove':
|
|
@@ -219,7 +219,7 @@ export const organize = async (
|
|
|
219
219
|
|
|
220
220
|
case 'rotate':
|
|
221
221
|
currentPdf = await PDFDocument.load(
|
|
222
|
-
await rotate(currentBuffer, action.data.degrees, [action.data.position])
|
|
222
|
+
await rotate(currentBuffer, action.data.degrees, [action.data.position]),
|
|
223
223
|
);
|
|
224
224
|
break;
|
|
225
225
|
|
package/tsconfig.cjs.json
CHANGED
package/tsconfig.esm.json
CHANGED
package/.eslintrc.cjs
DELETED