@pdfme/manipulator 0.0.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.
Files changed (98) hide show
  1. package/README.md +5 -0
  2. package/dist/cjs/__tests__/e2e/insert.e2e.test.js +32 -0
  3. package/dist/cjs/__tests__/e2e/insert.e2e.test.js.map +1 -0
  4. package/dist/cjs/__tests__/e2e/merge.e2e.test.js +20 -0
  5. package/dist/cjs/__tests__/e2e/merge.e2e.test.js.map +1 -0
  6. package/dist/cjs/__tests__/e2e/move.e2e.test.js +18 -0
  7. package/dist/cjs/__tests__/e2e/move.e2e.test.js.map +1 -0
  8. package/dist/cjs/__tests__/e2e/organize-complex.e2e.test.js +96 -0
  9. package/dist/cjs/__tests__/e2e/organize-complex.e2e.test.js.map +1 -0
  10. package/dist/cjs/__tests__/e2e/organize-single.e2e.test.js +68 -0
  11. package/dist/cjs/__tests__/e2e/organize-single.e2e.test.js.map +1 -0
  12. package/dist/cjs/__tests__/e2e/remove.e2e.test.js +28 -0
  13. package/dist/cjs/__tests__/e2e/remove.e2e.test.js.map +1 -0
  14. package/dist/cjs/__tests__/e2e/rotate.e2e.test.js +38 -0
  15. package/dist/cjs/__tests__/e2e/rotate.e2e.test.js.map +1 -0
  16. package/dist/cjs/__tests__/e2e/split.e2e.test.js +27 -0
  17. package/dist/cjs/__tests__/e2e/split.e2e.test.js.map +1 -0
  18. package/dist/cjs/__tests__/insert.test.js +18 -0
  19. package/dist/cjs/__tests__/insert.test.js.map +1 -0
  20. package/dist/cjs/__tests__/merge.test.js +16 -0
  21. package/dist/cjs/__tests__/merge.test.js.map +1 -0
  22. package/dist/cjs/__tests__/move.test.js +16 -0
  23. package/dist/cjs/__tests__/move.test.js.map +1 -0
  24. package/dist/cjs/__tests__/organize.test.js +75 -0
  25. package/dist/cjs/__tests__/organize.test.js.map +1 -0
  26. package/dist/cjs/__tests__/remove.test.js +20 -0
  27. package/dist/cjs/__tests__/remove.test.js.map +1 -0
  28. package/dist/cjs/__tests__/rotate.test.js +17 -0
  29. package/dist/cjs/__tests__/rotate.test.js.map +1 -0
  30. package/dist/cjs/__tests__/split.test.js +21 -0
  31. package/dist/cjs/__tests__/split.test.js.map +1 -0
  32. package/dist/cjs/__tests__/test-helpers.js +44 -0
  33. package/dist/cjs/__tests__/test-helpers.js.map +1 -0
  34. package/dist/cjs/__tests__/utils.js +29 -0
  35. package/dist/cjs/__tests__/utils.js.map +1 -0
  36. package/dist/cjs/src/index.js +161 -0
  37. package/dist/cjs/src/index.js.map +1 -0
  38. package/dist/esm/__tests__/e2e/insert.e2e.test.js +30 -0
  39. package/dist/esm/__tests__/e2e/insert.e2e.test.js.map +1 -0
  40. package/dist/esm/__tests__/e2e/merge.e2e.test.js +18 -0
  41. package/dist/esm/__tests__/e2e/merge.e2e.test.js.map +1 -0
  42. package/dist/esm/__tests__/e2e/move.e2e.test.js +16 -0
  43. package/dist/esm/__tests__/e2e/move.e2e.test.js.map +1 -0
  44. package/dist/esm/__tests__/e2e/organize-complex.e2e.test.js +94 -0
  45. package/dist/esm/__tests__/e2e/organize-complex.e2e.test.js.map +1 -0
  46. package/dist/esm/__tests__/e2e/organize-single.e2e.test.js +66 -0
  47. package/dist/esm/__tests__/e2e/organize-single.e2e.test.js.map +1 -0
  48. package/dist/esm/__tests__/e2e/remove.e2e.test.js +26 -0
  49. package/dist/esm/__tests__/e2e/remove.e2e.test.js.map +1 -0
  50. package/dist/esm/__tests__/e2e/rotate.e2e.test.js +36 -0
  51. package/dist/esm/__tests__/e2e/rotate.e2e.test.js.map +1 -0
  52. package/dist/esm/__tests__/e2e/split.e2e.test.js +25 -0
  53. package/dist/esm/__tests__/e2e/split.e2e.test.js.map +1 -0
  54. package/dist/esm/__tests__/insert.test.js +16 -0
  55. package/dist/esm/__tests__/insert.test.js.map +1 -0
  56. package/dist/esm/__tests__/merge.test.js +14 -0
  57. package/dist/esm/__tests__/merge.test.js.map +1 -0
  58. package/dist/esm/__tests__/move.test.js +14 -0
  59. package/dist/esm/__tests__/move.test.js.map +1 -0
  60. package/dist/esm/__tests__/organize.test.js +73 -0
  61. package/dist/esm/__tests__/organize.test.js.map +1 -0
  62. package/dist/esm/__tests__/remove.test.js +18 -0
  63. package/dist/esm/__tests__/remove.test.js.map +1 -0
  64. package/dist/esm/__tests__/rotate.test.js +15 -0
  65. package/dist/esm/__tests__/rotate.test.js.map +1 -0
  66. package/dist/esm/__tests__/split.test.js +19 -0
  67. package/dist/esm/__tests__/split.test.js.map +1 -0
  68. package/dist/esm/__tests__/test-helpers.js +32 -0
  69. package/dist/esm/__tests__/test-helpers.js.map +1 -0
  70. package/dist/esm/__tests__/utils.js +23 -0
  71. package/dist/esm/__tests__/utils.js.map +1 -0
  72. package/dist/esm/src/index.js +152 -0
  73. package/dist/esm/src/index.js.map +1 -0
  74. package/dist/types/__tests__/e2e/insert.e2e.test.d.ts +1 -0
  75. package/dist/types/__tests__/e2e/merge.e2e.test.d.ts +1 -0
  76. package/dist/types/__tests__/e2e/move.e2e.test.d.ts +1 -0
  77. package/dist/types/__tests__/e2e/organize-complex.e2e.test.d.ts +1 -0
  78. package/dist/types/__tests__/e2e/organize-single.e2e.test.d.ts +1 -0
  79. package/dist/types/__tests__/e2e/remove.e2e.test.d.ts +1 -0
  80. package/dist/types/__tests__/e2e/rotate.e2e.test.d.ts +1 -0
  81. package/dist/types/__tests__/e2e/split.e2e.test.d.ts +1 -0
  82. package/dist/types/__tests__/insert.test.d.ts +1 -0
  83. package/dist/types/__tests__/merge.test.d.ts +1 -0
  84. package/dist/types/__tests__/move.test.d.ts +1 -0
  85. package/dist/types/__tests__/organize.test.d.ts +1 -0
  86. package/dist/types/__tests__/remove.test.d.ts +1 -0
  87. package/dist/types/__tests__/rotate.test.d.ts +1 -0
  88. package/dist/types/__tests__/split.test.d.ts +1 -0
  89. package/dist/types/__tests__/test-helpers.d.ts +6 -0
  90. package/dist/types/__tests__/utils.d.ts +3 -0
  91. package/dist/types/src/index.d.ts +46 -0
  92. package/eslint.config.mjs +22 -0
  93. package/jest.setup.js +2 -0
  94. package/package.json +81 -0
  95. package/src/index.ts +240 -0
  96. package/tsconfig.cjs.json +10 -0
  97. package/tsconfig.esm.json +11 -0
  98. package/tsconfig.json +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.test.js","sourceRoot":"","sources":["../../../__tests__/split.test.ts"],"names":[],"mappings":";;AAAA,wCAAqC;AACrC,iDAAgE;AAEhE,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,IAAI,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,IAAA,4BAAa,EAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAA,aAAK,EAAC,GAAG,EAAE;YAC9B,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;YACpB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,IAAA,8BAAe,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,IAAA,8BAAe,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,GAAG,GAAG,MAAM,IAAA,4BAAa,EAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,IAAA,aAAK,EAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC9D,oCAAoC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadTestPDF = exports.assetPath = exports.getPDFPageCount = exports.pdfToImages = exports.createTestPDF = void 0;
7
+ exports.toArrayBuffer = toArrayBuffer;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const pdf_lib_1 = require("@pdfme/pdf-lib");
11
+ const converter_1 = require("@pdfme/converter");
12
+ const createTestPDF = async (pageCount) => {
13
+ const pdfDoc = await pdf_lib_1.PDFDocument.create();
14
+ for (let i = 0; i < pageCount; i++) {
15
+ const page = pdfDoc.addPage([500, 500]);
16
+ page.drawText(`Page ${i + 1}`, {
17
+ x: 50,
18
+ y: 450,
19
+ size: 20,
20
+ });
21
+ }
22
+ return pdfDoc.save();
23
+ };
24
+ exports.createTestPDF = createTestPDF;
25
+ const pdfToImages = async (pdf) => {
26
+ const arrayBuffers = await (0, converter_1.pdf2img)(pdf, { imageType: 'png' });
27
+ return arrayBuffers.map((buf) => Buffer.from(new Uint8Array(buf)));
28
+ };
29
+ exports.pdfToImages = pdfToImages;
30
+ const getPDFPageCount = async (pdf) => {
31
+ const pdfDoc = await pdf_lib_1.PDFDocument.load(pdf);
32
+ return pdfDoc.getPageCount();
33
+ };
34
+ exports.getPDFPageCount = getPDFPageCount;
35
+ const assetPath = (fileName) => path_1.default.join(__dirname, 'assets/pdfs', fileName);
36
+ exports.assetPath = assetPath;
37
+ function toArrayBuffer(buf) {
38
+ return new Uint8Array(buf);
39
+ }
40
+ const loadTestPDF = (fileName) => {
41
+ return toArrayBuffer(fs_1.default.readFileSync((0, exports.assetPath)(fileName)));
42
+ };
43
+ exports.loadTestPDF = loadTestPDF;
44
+ //# sourceMappingURL=test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../__tests__/test-helpers.ts"],"names":[],"mappings":";;;;;;AA8BA,sCAEC;AAhCD,4CAAoB;AACpB,gDAAwB;AACxB,4CAA6C;AAC7C,gDAA2C;AAEpC,MAAM,aAAa,GAAG,KAAK,EAAE,SAAiB,EAAuB,EAAE;IAC5E,MAAM,MAAM,GAAG,MAAM,qBAAW,CAAC,MAAM,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE;YAC7B,CAAC,EAAE,EAAE;YACL,CAAC,EAAE,GAAG;YACN,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAXW,QAAA,aAAa,iBAWxB;AAEK,MAAM,WAAW,GAAG,KAAK,EAAE,GAA6B,EAAqB,EAAE;IACpF,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAO,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC,CAAC;AAHW,QAAA,WAAW,eAGtB;AAEK,MAAM,eAAe,GAAG,KAAK,EAAE,GAA6B,EAAmB,EAAE;IACtF,MAAM,MAAM,GAAG,MAAM,qBAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC;AAC/B,CAAC,CAAC;AAHW,QAAA,eAAe,mBAG1B;AAEK,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AAAhF,QAAA,SAAS,aAAuE;AAE7F,SAAgB,aAAa,CAAC,GAAW;IACvC,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAEM,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAc,EAAE;IAC1D,OAAO,aAAa,CAAC,YAAE,CAAC,YAAY,CAAC,IAAA,iBAAS,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPDFPageCount = exports.pdfToImages = exports.createTestPDF = void 0;
4
+ const pdf_lib_1 = require("@pdfme/pdf-lib");
5
+ const converter_1 = require("@pdfme/converter");
6
+ const createTestPDF = async (pageCount) => {
7
+ const pdfDoc = await pdf_lib_1.PDFDocument.create();
8
+ for (let i = 0; i < pageCount; i++) {
9
+ const page = pdfDoc.addPage([500, 500]);
10
+ page.drawText(`Page ${i + 1}`, {
11
+ x: 50,
12
+ y: 450,
13
+ size: 20,
14
+ });
15
+ }
16
+ return pdfDoc.save();
17
+ };
18
+ exports.createTestPDF = createTestPDF;
19
+ const pdfToImages = async (pdf) => {
20
+ const arrayBuffers = await (0, converter_1.pdf2img)(pdf, { imageType: 'png' });
21
+ return arrayBuffers.map((buf) => Buffer.from(new Uint8Array(buf)));
22
+ };
23
+ exports.pdfToImages = pdfToImages;
24
+ const getPDFPageCount = async (pdf) => {
25
+ const pdfDoc = await pdf_lib_1.PDFDocument.load(pdf);
26
+ return pdfDoc.getPageCount();
27
+ };
28
+ exports.getPDFPageCount = getPDFPageCount;
29
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../__tests__/utils.ts"],"names":[],"mappings":";;;AAAA,4CAA6C;AAC7C,gDAA2C;AAEpC,MAAM,aAAa,GAAG,KAAK,EAAE,SAAiB,EAAuB,EAAE;IAC5E,MAAM,MAAM,GAAG,MAAM,qBAAW,CAAC,MAAM,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE;YAC7B,CAAC,EAAE,EAAE;YACL,CAAC,EAAE,GAAG;YACN,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAXW,QAAA,aAAa,iBAWxB;AAEK,MAAM,WAAW,GAAG,KAAK,EAAE,GAA6B,EAAqB,EAAE;IACpF,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAO,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC,CAAC;AAHW,QAAA,WAAW,eAGtB;AAEK,MAAM,eAAe,GAAG,KAAK,EAAE,GAA6B,EAAmB,EAAE;IACtF,MAAM,MAAM,GAAG,MAAM,qBAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC;AAC/B,CAAC,CAAC;AAHW,QAAA,eAAe,mBAG1B"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.organize = exports.move = exports.rotate = exports.insert = exports.remove = exports.split = exports.merge = void 0;
4
+ const pdf_lib_1 = require("@pdfme/pdf-lib");
5
+ const merge = async (pdfs) => {
6
+ if (!pdfs.length) {
7
+ throw new Error('[@pdfme/manipulator] At least one PDF is required for merging');
8
+ }
9
+ const mergedPdf = await pdf_lib_1.PDFDocument.create();
10
+ for (const buffer of pdfs) {
11
+ const srcDoc = await pdf_lib_1.PDFDocument.load(buffer);
12
+ const copiedPages = await mergedPdf.copyPages(srcDoc, srcDoc.getPageIndices());
13
+ copiedPages.forEach((page) => mergedPdf.addPage(page));
14
+ }
15
+ return mergedPdf.save();
16
+ };
17
+ exports.merge = merge;
18
+ const split = async (pdf, ranges) => {
19
+ if (!ranges.length) {
20
+ throw new Error('[@pdfme/manipulator] At least one range is required for splitting');
21
+ }
22
+ const originalPdf = await pdf_lib_1.PDFDocument.load(pdf);
23
+ const numPages = originalPdf.getPages().length;
24
+ const result = [];
25
+ for (const { start = 0, end = numPages - 1 } of ranges) {
26
+ if (start < 0 || end >= numPages || start > end) {
27
+ throw new Error(`[@pdfme/manipulator] Invalid range: start=${start}, end=${end}, total pages=${numPages}`);
28
+ }
29
+ const newPdf = await pdf_lib_1.PDFDocument.create();
30
+ const pages = await newPdf.copyPages(originalPdf, Array.from({ length: end - start + 1 }, (_, i) => i + start));
31
+ pages.forEach((page) => newPdf.addPage(page));
32
+ result.push(await newPdf.save());
33
+ }
34
+ return result;
35
+ };
36
+ exports.split = split;
37
+ const remove = async (pdf, pages) => {
38
+ if (!pages.length) {
39
+ throw new Error('[@pdfme/manipulator] At least one page number is required for removal');
40
+ }
41
+ const pdfDoc = await pdf_lib_1.PDFDocument.load(pdf);
42
+ const numPages = pdfDoc.getPageCount();
43
+ if (pages.some((page) => page < 0 || page >= numPages)) {
44
+ throw new Error(`[@pdfme/manipulator] Invalid page number: pages must be between 0 and ${numPages - 1}`);
45
+ }
46
+ pages.sort((a, b) => b - a).forEach((pageIndex) => pdfDoc.removePage(pageIndex));
47
+ return pdfDoc.save();
48
+ };
49
+ exports.remove = remove;
50
+ const insert = async (basePdf, inserts) => {
51
+ inserts.sort((a, b) => a.position - b.position);
52
+ let currentPdf = basePdf;
53
+ let offset = 0;
54
+ for (let i = 0; i < inserts.length; i++) {
55
+ const { pdf, position } = inserts[i];
56
+ const actualPos = position + offset;
57
+ const basePdfDoc = await pdf_lib_1.PDFDocument.load(currentPdf);
58
+ const insertDoc = await pdf_lib_1.PDFDocument.load(pdf);
59
+ const numPages = basePdfDoc.getPageCount();
60
+ if (actualPos < 0 || actualPos > numPages) {
61
+ throw new Error(`[@pdfme/manipulator] Invalid position: must be between 0 and ${numPages}`);
62
+ }
63
+ const newPdfDoc = await pdf_lib_1.PDFDocument.create();
64
+ if (actualPos > 0) {
65
+ const beforePages = await newPdfDoc.copyPages(basePdfDoc, Array.from({ length: actualPos }, (_, idx) => idx));
66
+ beforePages.forEach((page) => newPdfDoc.addPage(page));
67
+ }
68
+ const insertPages = await newPdfDoc.copyPages(insertDoc, insertDoc.getPageIndices());
69
+ insertPages.forEach((page) => newPdfDoc.addPage(page));
70
+ if (actualPos < numPages) {
71
+ const afterPages = await newPdfDoc.copyPages(basePdfDoc, Array.from({ length: numPages - actualPos }, (_, idx) => idx + actualPos));
72
+ afterPages.forEach((page) => newPdfDoc.addPage(page));
73
+ }
74
+ currentPdf = await newPdfDoc.save();
75
+ offset += insertDoc.getPageCount();
76
+ }
77
+ const pdfDoc = await pdf_lib_1.PDFDocument.load(currentPdf);
78
+ return pdfDoc.save();
79
+ };
80
+ exports.insert = insert;
81
+ const rotate = async (pdf, degrees, pageNumbers) => {
82
+ if (!Number.isInteger(degrees) || degrees % 90 !== 0) {
83
+ throw new Error('[@pdfme/manipulator] Rotation degrees must be a multiple of 90');
84
+ }
85
+ const pdfDoc = await pdf_lib_1.PDFDocument.load(pdf);
86
+ const pages = pdfDoc.getPages();
87
+ if (!pages.length) {
88
+ throw new Error('[@pdfme/manipulator] PDF has no pages to rotate');
89
+ }
90
+ const normalizedDegrees = ((degrees % 360) + 360) % 360;
91
+ if (normalizedDegrees % 90 !== 0) {
92
+ throw new Error('[@pdfme/manipulator] Rotation degrees must be a multiple of 90');
93
+ }
94
+ if (pageNumbers) {
95
+ if (pageNumbers.some((page) => page < 0 || page >= pages.length)) {
96
+ throw new Error(`[@pdfme/manipulator] Invalid page number: pages must be between 0 and ${pages.length - 1}`);
97
+ }
98
+ }
99
+ const pagesToRotate = pageNumbers || pages.map((_, i) => i);
100
+ pagesToRotate.forEach((pageNum) => {
101
+ const page = pages[pageNum];
102
+ if (page) {
103
+ page.setRotation({
104
+ type: pdf_lib_1.RotationTypes.Degrees,
105
+ angle: normalizedDegrees % 360,
106
+ });
107
+ }
108
+ });
109
+ return pdfDoc.save();
110
+ };
111
+ exports.rotate = rotate;
112
+ const move = async (pdf, operation) => {
113
+ const { from, to } = operation;
114
+ const pdfDoc = await pdf_lib_1.PDFDocument.load(pdf);
115
+ const currentPageCount = pdfDoc.getPageCount();
116
+ if (from < 0 || from >= currentPageCount || to < 0 || to >= currentPageCount) {
117
+ throw new Error(`[@pdfme/manipulator] Invalid page number: from=${from}, to=${to}, total pages=${currentPageCount}`);
118
+ }
119
+ if (from === to) {
120
+ return pdfDoc.save();
121
+ }
122
+ const page = pdfDoc.getPage(from);
123
+ pdfDoc.removePage(from);
124
+ const adjustedTo = from < to ? to - 1 : to;
125
+ pdfDoc.insertPage(adjustedTo, page);
126
+ return pdfDoc.save();
127
+ };
128
+ exports.move = move;
129
+ const organize = async (pdf, actions) => {
130
+ if (!actions.length) {
131
+ throw new Error('[@pdfme/manipulator] At least one action is required');
132
+ }
133
+ let currentPdf = await pdf_lib_1.PDFDocument.load(pdf);
134
+ for (const action of actions) {
135
+ const currentBuffer = await currentPdf.save();
136
+ switch (action.type) {
137
+ case 'remove':
138
+ currentPdf = await pdf_lib_1.PDFDocument.load(await remove(currentBuffer, [action.data.position]));
139
+ break;
140
+ case 'insert':
141
+ currentPdf = await pdf_lib_1.PDFDocument.load(await insert(currentBuffer, [action.data]));
142
+ break;
143
+ case 'replace': {
144
+ const withoutTarget = await remove(currentBuffer, [action.data.position]);
145
+ currentPdf = await pdf_lib_1.PDFDocument.load(await insert(withoutTarget, [action.data]));
146
+ break;
147
+ }
148
+ case 'rotate':
149
+ currentPdf = await pdf_lib_1.PDFDocument.load(await rotate(currentBuffer, action.data.degrees, [action.data.position]));
150
+ break;
151
+ case 'move':
152
+ currentPdf = await pdf_lib_1.PDFDocument.load(await move(currentBuffer, action.data));
153
+ break;
154
+ default:
155
+ throw new Error(`[@pdfme/manipulator] Unknown action type: ${action.type}`);
156
+ }
157
+ }
158
+ return currentPdf.save();
159
+ };
160
+ exports.organize = organize;
161
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { insert } from '../../src/index';
2
+ import { pdfToImages, loadTestPDF } from '../test-helpers';
3
+ import 'jest-image-snapshot';
4
+ describe('E2E: insert', () => {
5
+ const fiveP = loadTestPDF('5p.pdf');
6
+ const aPdf = loadTestPDF('a.pdf');
7
+ test('insert: insert a.pdf at position 0 in 5p.pdf', async () => {
8
+ const inserted = await insert(fiveP, [{ pdf: aPdf, position: 0 }]);
9
+ const images = await pdfToImages(inserted);
10
+ for (let i = 0; i < images.length; i++) {
11
+ expect(images[i]).toMatchImageSnapshot({
12
+ customSnapshotIdentifier: `insert-5p-a-at-0-result-page${i + 1}`,
13
+ });
14
+ }
15
+ });
16
+ test('insert: insert a.pdf at position 0 and 2 in 5p.pdf', async () => {
17
+ // Note: the second insert is done in the same buffer, so the offset changes after the first insert
18
+ const inserted = await insert(fiveP, [
19
+ { pdf: aPdf, position: 0 },
20
+ { pdf: aPdf, position: 2 }, // The PDF is 6 pages after the first insert
21
+ ]);
22
+ const images = await pdfToImages(inserted);
23
+ for (let i = 0; i < images.length; i++) {
24
+ expect(images[i]).toMatchImageSnapshot({
25
+ customSnapshotIdentifier: `insert-5p-a-at-0-and-2-result-page${i + 1}`,
26
+ });
27
+ }
28
+ });
29
+ });
30
+ //# sourceMappingURL=insert.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert.e2e.test.js","sourceRoot":"","sources":["../../../../__tests__/e2e/insert.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACrC,wBAAwB,EAAE,+BAA+B,CAAC,GAAG,CAAC,EAAE;aACjE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QACpE,mGAAmG;QACnG,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE;YACnC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC1B,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,4CAA4C;SACzE,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACrC,wBAAwB,EAAE,qCAAqC,CAAC,GAAG,CAAC,EAAE;aACvE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { merge } from '../../src/index';
2
+ import { pdfToImages, loadTestPDF } from '../test-helpers';
3
+ import 'jest-image-snapshot';
4
+ describe('E2E: merge', () => {
5
+ const aPdf = loadTestPDF('a.pdf');
6
+ const bPdf = loadTestPDF('b.pdf');
7
+ const cPdf = loadTestPDF('c.pdf');
8
+ test('merge: merge a.pdf, b.pdf, c.pdf in order', async () => {
9
+ const mergedBuffer = await merge([aPdf, bPdf, cPdf]);
10
+ const images = await pdfToImages(mergedBuffer);
11
+ for (let i = 0; i < images.length; i++) {
12
+ expect(images[i]).toMatchImageSnapshot({
13
+ customSnapshotIdentifier: `merge-abc-page${i + 1}`,
14
+ });
15
+ }
16
+ });
17
+ });
18
+ //# sourceMappingURL=merge.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.e2e.test.js","sourceRoot":"","sources":["../../../../__tests__/e2e/merge.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACrC,wBAAwB,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { move } from '../../src/index';
2
+ import { pdfToImages, loadTestPDF } from '../test-helpers';
3
+ import 'jest-image-snapshot';
4
+ describe('E2E: move', () => {
5
+ const fiveP = loadTestPDF('5p.pdf');
6
+ test('move: move the 1st page (index:0) of 5p.pdf to the 3rd position (index:2)', async () => {
7
+ const moved = await move(fiveP, { from: 0, to: 2 });
8
+ const images = await pdfToImages(moved);
9
+ for (let i = 0; i < images.length; i++) {
10
+ expect(images[i]).toMatchImageSnapshot({
11
+ customSnapshotIdentifier: `move-5p-page0-to-2-result-page${i + 1}`,
12
+ });
13
+ }
14
+ });
15
+ });
16
+ //# sourceMappingURL=move.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.e2e.test.js","sourceRoot":"","sources":["../../../../__tests__/e2e/move.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACrC,wBAAwB,EAAE,iCAAiC,CAAC,GAAG,CAAC,EAAE;aACnE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { organize } from '../../src/index';
2
+ import { pdfToImages, loadTestPDF } from '../test-helpers';
3
+ import 'jest-image-snapshot';
4
+ describe('E2E: organize (complex operations)', () => {
5
+ const fiveP = loadTestPDF('5p.pdf');
6
+ const aPdf = loadTestPDF('a.pdf');
7
+ const bPdf = loadTestPDF('b.pdf');
8
+ test('organize: Remove -> Insert -> Move (check index changes)', async () => {
9
+ // Remove the 2nd page (index:1) => 4 pages
10
+ // Insert a.pdf at the 2nd page (index:1) => 5 pages
11
+ // Move the newly inserted page (index:1) to the 1st page (index:0) => 5 pages
12
+ const result = await organize(fiveP, [
13
+ { type: 'remove', data: { position: 1 } },
14
+ { type: 'insert', data: { pdf: aPdf, position: 1 } },
15
+ { type: 'move', data: { from: 1, to: 0 } },
16
+ ]);
17
+ const images = await pdfToImages(result);
18
+ for (let i = 0; i < images.length; i++) {
19
+ expect(images[i]).toMatchImageSnapshot({
20
+ customSnapshotIdentifier: `organize-composite-1-result-page${i + 1}`,
21
+ });
22
+ }
23
+ });
24
+ test('organize: Replace -> Rotate -> Remove', async () => {
25
+ // Replace the 3rd page with a.pdf => 5 pages
26
+ // Rotate the 3rd page by 180 => 5 pages
27
+ // Remove the 1st page => 4 pages
28
+ const result = await organize(fiveP, [
29
+ { type: 'replace', data: { pdf: aPdf, position: 2 } },
30
+ { type: 'rotate', data: { position: 2, degrees: 180 } },
31
+ { type: 'remove', data: { position: 0 } },
32
+ ]);
33
+ const images = await pdfToImages(result);
34
+ for (let i = 0; i < images.length; i++) {
35
+ expect(images[i]).toMatchImageSnapshot({
36
+ customSnapshotIdentifier: `organize-composite-2-result-page${i + 1}`,
37
+ });
38
+ }
39
+ });
40
+ test('organize: Insert -> Insert -> Move -> Move', async () => {
41
+ // Insert a.pdf at the end (index:5) => 6 pages
42
+ // Insert b.pdf at the start (index:0) => 7 pages
43
+ // Move the 3rd page (index:2) to the 6th page (index:5) => 7 pages
44
+ // Move the 4th page (index:3) to the 2nd page (index:1) => 7 pages
45
+ const result = await organize(fiveP, [
46
+ { type: 'insert', data: { pdf: aPdf, position: 5 } },
47
+ { type: 'insert', data: { pdf: bPdf, position: 0 } },
48
+ { type: 'move', data: { from: 2, to: 5 } },
49
+ { type: 'move', data: { from: 3, to: 1 } },
50
+ ]);
51
+ const images = await pdfToImages(result);
52
+ for (let i = 0; i < images.length; i++) {
53
+ expect(images[i]).toMatchImageSnapshot({
54
+ customSnapshotIdentifier: `organize-composite-3-result-page${i + 1}`,
55
+ });
56
+ }
57
+ });
58
+ test('organize: Rotate -> Rotate -> Remove', async () => {
59
+ // Rotate the 2nd and 4th pages by 90 => 5 pages
60
+ // Rotate the 3rd page by 270 => 5 pages
61
+ // Remove the 1st page => 4 pages
62
+ const result = await organize(fiveP, [
63
+ { type: 'rotate', data: { position: 1, degrees: 90 } },
64
+ { type: 'rotate', data: { position: 3, degrees: 90 } },
65
+ { type: 'rotate', data: { position: 2, degrees: 270 } },
66
+ { type: 'remove', data: { position: 0 } },
67
+ ]);
68
+ const images = await pdfToImages(result);
69
+ for (let i = 0; i < images.length; i++) {
70
+ expect(images[i]).toMatchImageSnapshot({
71
+ customSnapshotIdentifier: `organize-composite-4-result-page${i + 1}`,
72
+ });
73
+ }
74
+ });
75
+ test('organize: Remove -> Insert -> Remove -> Insert (multiple times)', async () => {
76
+ // Remove the 5th page (index:4) => 4 pages
77
+ // Insert a.pdf at the 2nd page (index:1) => 5 pages
78
+ // Remove the 1st page (index:0) => 4 pages
79
+ // Insert b.pdf at the end (index:4) => 5 pages
80
+ const result = await organize(fiveP, [
81
+ { type: 'remove', data: { position: 4 } },
82
+ { type: 'insert', data: { pdf: aPdf, position: 1 } },
83
+ { type: 'remove', data: { position: 0 } },
84
+ { type: 'insert', data: { pdf: bPdf, position: 4 } },
85
+ ]);
86
+ const images = await pdfToImages(result);
87
+ for (let i = 0; i < images.length; i++) {
88
+ expect(images[i]).toMatchImageSnapshot({
89
+ customSnapshotIdentifier: `organize-composite-5-result-page${i + 1}`,
90
+ });
91
+ }
92
+ });
93
+ });
94
+ //# sourceMappingURL=organize-complex.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organize-complex.e2e.test.js","sourceRoot":"","sources":["../../../../__tests__/e2e/organize-complex.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { organize } from '../../src/index';
2
+ import { pdfToImages, loadTestPDF } from '../test-helpers';
3
+ import 'jest-image-snapshot';
4
+ describe('E2E: organize (single operations)', () => {
5
+ const fiveP = loadTestPDF('5p.pdf');
6
+ const aPdf = loadTestPDF('a.pdf');
7
+ const bPdf = loadTestPDF('b.pdf');
8
+ test('organize: single remove (remove the 2nd page)', async () => {
9
+ const result = await organize(fiveP, [{ type: 'remove', data: { position: 1 } }]);
10
+ const images = await pdfToImages(result);
11
+ for (let i = 0; i < images.length; i++) {
12
+ expect(images[i]).toMatchImageSnapshot({
13
+ customSnapshotIdentifier: `organize-remove-only-result-page${i + 1}`,
14
+ });
15
+ }
16
+ });
17
+ test('organize: single insert (insert a.pdf at page 1)', async () => {
18
+ const result = await organize(fiveP, [{ type: 'insert', data: { pdf: aPdf, position: 0 } }]);
19
+ const images = await pdfToImages(result);
20
+ for (let i = 0; i < images.length; i++) {
21
+ expect(images[i]).toMatchImageSnapshot({
22
+ customSnapshotIdentifier: `organize-insert-only-result-page${i + 1}`,
23
+ });
24
+ }
25
+ });
26
+ test('organize: single replace (replace 2nd page with a.pdf)', async () => {
27
+ const result = await organize(fiveP, [{ type: 'replace', data: { pdf: aPdf, position: 1 } }]);
28
+ const images = await pdfToImages(result);
29
+ for (let i = 0; i < images.length; i++) {
30
+ expect(images[i]).toMatchImageSnapshot({
31
+ customSnapshotIdentifier: `organize-replace-only-result-page${i + 1}`,
32
+ });
33
+ }
34
+ });
35
+ test('organize: single rotate (rotate pages 1 and 3 by 90 degrees)', async () => {
36
+ const result = await organize(fiveP, [
37
+ { type: 'rotate', data: { position: 0, degrees: 90 } },
38
+ { type: 'rotate', data: { position: 2, degrees: 90 } },
39
+ ]);
40
+ const images = await pdfToImages(result);
41
+ for (let i = 0; i < images.length; i++) {
42
+ expect(images[i]).toMatchImageSnapshot({
43
+ customSnapshotIdentifier: `organize-rotate-only-result-page${i + 1}`,
44
+ });
45
+ }
46
+ });
47
+ test('organize: multiple operations (remove -> remove -> insert -> replace -> rotate -> rotate)', async () => {
48
+ const insertPdf = aPdf;
49
+ const replacePdf = bPdf;
50
+ const result = await organize(fiveP, [
51
+ { type: 'remove', data: { position: 1 } },
52
+ { type: 'remove', data: { position: 3 } }, // 5 -> 3 pages
53
+ { type: 'insert', data: { pdf: insertPdf, position: 1 } }, // 3 -> 4 pages
54
+ { type: 'replace', data: { position: 2, pdf: replacePdf } }, // still 4 pages
55
+ { type: 'rotate', data: { position: 0, degrees: 90 } },
56
+ { type: 'rotate', data: { position: 3, degrees: 90 } },
57
+ ]);
58
+ const images = await pdfToImages(result);
59
+ for (let i = 0; i < images.length; i++) {
60
+ expect(images[i]).toMatchImageSnapshot({
61
+ customSnapshotIdentifier: `organize-multiple-ops-result-page${i + 1}`,
62
+ });
63
+ }
64
+ });
65
+ });
66
+ //# sourceMappingURL=organize-single.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organize-single.e2e.test.js","sourceRoot":"","sources":["../../../../__tests__/e2e/organize-single.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { remove } from '../../src/index';
2
+ import { pdfToImages, loadTestPDF } from '../test-helpers';
3
+ import 'jest-image-snapshot';
4
+ describe('E2E: remove', () => {
5
+ const fiveP = loadTestPDF('5p.pdf');
6
+ test('remove: remove the 1st page of 5p.pdf', async () => {
7
+ const removed = await remove(fiveP, [0]);
8
+ const images = await pdfToImages(removed);
9
+ for (let i = 0; i < images.length; i++) {
10
+ expect(images[i]).toMatchImageSnapshot({
11
+ customSnapshotIdentifier: `remove-5p-page1-result-page${i + 1}`,
12
+ });
13
+ }
14
+ });
15
+ test('remove: remove the 1st and 3rd pages of 5p.pdf', async () => {
16
+ // Note: This assumes removing all at once, not one by one with index shifting
17
+ const removed = await remove(fiveP, [0, 2]);
18
+ const images = await pdfToImages(removed);
19
+ for (let i = 0; i < images.length; i++) {
20
+ expect(images[i]).toMatchImageSnapshot({
21
+ customSnapshotIdentifier: `remove-5p-pages1-3-result-page${i + 1}`,
22
+ });
23
+ }
24
+ });
25
+ });
26
+ //# sourceMappingURL=remove.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.e2e.test.js","sourceRoot":"","sources":["../../../../__tests__/e2e/remove.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACrC,wBAAwB,EAAE,8BAA8B,CAAC,GAAG,CAAC,EAAE;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAChE,8EAA8E;QAC9E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACrC,wBAAwB,EAAE,iCAAiC,CAAC,GAAG,CAAC,EAAE;aACnE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { rotate } from '../../src/index';
2
+ import { pdfToImages, loadTestPDF } from '../test-helpers';
3
+ import 'jest-image-snapshot';
4
+ describe('E2E: rotate', () => {
5
+ const fiveP = loadTestPDF('5p.pdf');
6
+ test('rotate: rotate all pages of 5p.pdf by 90 degrees', async () => {
7
+ const rotated = await rotate(fiveP, 90);
8
+ const images = await pdfToImages(rotated);
9
+ for (let i = 0; i < images.length; i++) {
10
+ expect(images[i]).toMatchImageSnapshot({
11
+ customSnapshotIdentifier: `rotate-5p-90deg-all-result-page${i + 1}`,
12
+ });
13
+ }
14
+ });
15
+ test('rotate: rotate only the 2nd page of 5p.pdf by 180 degrees', async () => {
16
+ // pageNumbers=[1] -> only the 2nd page is rotated by 180 degrees
17
+ const rotated = await rotate(fiveP, 180, [1]);
18
+ const images = await pdfToImages(rotated);
19
+ for (let i = 0; i < images.length; i++) {
20
+ expect(images[i]).toMatchImageSnapshot({
21
+ customSnapshotIdentifier: `rotate-5p-180deg-page1-result-page${i + 1}`,
22
+ });
23
+ }
24
+ });
25
+ test('rotate: rotate pages 2 and 4 of 5p.pdf by 270 degrees', async () => {
26
+ // Rotate the 2nd and 4th pages by 270 degrees
27
+ const rotated = await rotate(fiveP, 270, [1, 3]);
28
+ const images = await pdfToImages(rotated);
29
+ for (let i = 0; i < images.length; i++) {
30
+ expect(images[i]).toMatchImageSnapshot({
31
+ customSnapshotIdentifier: `rotate-5p-270deg-pages1-3-result-page${i + 1}`,
32
+ });
33
+ }
34
+ });
35
+ });
36
+ //# sourceMappingURL=rotate.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotate.e2e.test.js","sourceRoot":"","sources":["../../../../__tests__/e2e/rotate.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAExC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACrC,wBAAwB,EAAE,kCAAkC,CAAC,GAAG,CAAC,EAAE;aACpE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC3E,iEAAiE;QACjE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACrC,wBAAwB,EAAE,qCAAqC,CAAC,GAAG,CAAC,EAAE;aACvE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACvE,8CAA8C;QAC9C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACrC,wBAAwB,EAAE,wCAAwC,CAAC,GAAG,CAAC,EAAE;aAC1E,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { split } from '../../src/index';
2
+ import { pdfToImages, loadTestPDF } from '../test-helpers';
3
+ import 'jest-image-snapshot';
4
+ describe('E2E: split', () => {
5
+ const fiveP = loadTestPDF('5p.pdf');
6
+ test('split: split 5p.pdf into pages 1-2 and 3-5', async () => {
7
+ const [split12, split35] = await split(fiveP, [
8
+ { start: 0, end: 1 }, // pages 1-2
9
+ { start: 2, end: 4 }, // pages 3-5
10
+ ]);
11
+ const images12 = await pdfToImages(split12);
12
+ const images35 = await pdfToImages(split35);
13
+ for (let i = 0; i < images12.length; i++) {
14
+ expect(images12[i]).toMatchImageSnapshot({
15
+ customSnapshotIdentifier: `split-5p-1-2-page${i + 1}`,
16
+ });
17
+ }
18
+ for (let i = 0; i < images35.length; i++) {
19
+ expect(images35[i]).toMatchImageSnapshot({
20
+ customSnapshotIdentifier: `split-5p-3-5-page${i + 1}`,
21
+ });
22
+ }
23
+ });
24
+ });
25
+ //# sourceMappingURL=split.e2e.test.js.map