node-hp-scan-to 1.4.3 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +74 -27
  2. package/dist/Destination.js +2 -2
  3. package/dist/Destination.js.map +1 -1
  4. package/dist/DiscoveryTree.js.map +1 -1
  5. package/dist/Event.js.map +1 -1
  6. package/dist/EventTable.js +1 -1
  7. package/dist/EventTable.js.map +1 -1
  8. package/dist/HPApi.js +4 -4
  9. package/dist/HPApi.js.map +1 -1
  10. package/dist/InputSource.js +1 -1
  11. package/dist/InputSource.js.map +1 -1
  12. package/dist/Job.js +2 -2
  13. package/dist/Job.js.map +1 -1
  14. package/dist/JpegUtil.d.ts +1 -0
  15. package/dist/JpegUtil.js.map +1 -1
  16. package/dist/PaperlessCOnfig.d.ts +7 -0
  17. package/dist/PaperlessCOnfig.js +3 -0
  18. package/dist/PaperlessCOnfig.js.map +1 -0
  19. package/dist/PaperlessConfig.d.ts +7 -0
  20. package/dist/PaperlessConfig.js +3 -0
  21. package/dist/PaperlessConfig.js.map +1 -0
  22. package/dist/PathHelper.js.map +1 -1
  23. package/dist/ScanCaps.js +12 -2
  24. package/dist/ScanCaps.js.map +1 -1
  25. package/dist/ScanContent.d.ts +0 -1
  26. package/dist/ScanContent.js +0 -24
  27. package/dist/ScanContent.js.map +1 -1
  28. package/dist/ScanJobManifest.js.map +1 -1
  29. package/dist/ScanJobSettings.js +2 -2
  30. package/dist/ScanJobSettings.js.map +1 -1
  31. package/dist/ScanStatus.js.map +1 -1
  32. package/dist/WalkupScanDestination.js.map +1 -1
  33. package/dist/WalkupScanDestinations.js +1 -1
  34. package/dist/WalkupScanDestinations.js.map +1 -1
  35. package/dist/WalkupScanManifest.js.map +1 -1
  36. package/dist/WalkupScanToCompDestination.js.map +1 -1
  37. package/dist/WalkupScanToCompDestinations.js +1 -1
  38. package/dist/WalkupScanToCompDestinations.js.map +1 -1
  39. package/dist/WalkupScanToCompManifest.js.map +1 -1
  40. package/dist/commitInfo.json +3 -0
  41. package/dist/healthcheck.d.ts +1 -0
  42. package/dist/healthcheck.js +24 -0
  43. package/dist/healthcheck.js.map +1 -0
  44. package/dist/index.js +105 -18
  45. package/dist/index.js.map +1 -1
  46. package/dist/listening.js +2 -2
  47. package/dist/listening.js.map +1 -1
  48. package/dist/paperless/PaperlessConfig.d.ts +7 -0
  49. package/dist/paperless/PaperlessConfig.js +3 -0
  50. package/dist/paperless/PaperlessConfig.js.map +1 -0
  51. package/dist/paperless/paperless.d.ts +7 -0
  52. package/dist/paperless/paperless.js +83 -0
  53. package/dist/paperless/paperless.js.map +1 -0
  54. package/dist/paperless.d.ts +7 -0
  55. package/dist/paperless.js +83 -0
  56. package/dist/paperless.js.map +1 -0
  57. package/dist/pdfProcessing.d.ts +4 -0
  58. package/dist/pdfProcessing.js +52 -0
  59. package/dist/pdfProcessing.js.map +1 -0
  60. package/dist/postProcessing.d.ts +3 -0
  61. package/dist/postProcessing.js +44 -0
  62. package/dist/postProcessing.js.map +1 -0
  63. package/dist/readDeviceCapabilities.js.map +1 -1
  64. package/dist/scanProcessing.d.ts +7 -1
  65. package/dist/scanProcessing.js +20 -49
  66. package/dist/scanProcessing.js.map +1 -1
  67. package/dist/test/PathHelper.test.js +2 -2
  68. package/dist/test/PathHelper.test.js.map +1 -1
  69. package/dist/test/ScanCaps.test.js +20 -0
  70. package/dist/test/ScanCaps.test.js.map +1 -1
  71. package/dist/test/clean.js.map +1 -1
  72. package/dist/test/scanProcessing.test.js +1 -0
  73. package/dist/test/scanProcessing.test.js.map +1 -1
  74. package/dist/test-bonjour.d.ts +1 -0
  75. package/dist/test-bonjour.js +20 -0
  76. package/dist/test-bonjour.js.map +1 -0
  77. package/package.json +12 -9
  78. package/src/Destination.ts +2 -2
  79. package/src/EventTable.ts +1 -1
  80. package/src/HPApi.ts +4 -4
  81. package/src/Job.ts +2 -2
  82. package/src/ScanCaps.ts +18 -8
  83. package/src/ScanContent.ts +0 -22
  84. package/src/ScanJobSettings.ts +2 -2
  85. package/src/WalkupScanDestinations.ts +1 -1
  86. package/src/WalkupScanToCompDestinations.ts +1 -1
  87. package/src/commitInfo.json +3 -0
  88. package/src/healthcheck.ts +17 -0
  89. package/src/index.ts +131 -23
  90. package/src/listening.ts +2 -2
  91. package/src/paperless/PaperlessConfig.ts +7 -0
  92. package/src/paperless/paperless.ts +122 -0
  93. package/src/pdfProcessing.ts +67 -0
  94. package/src/postProcessing.ts +91 -0
  95. package/src/scanProcessing.ts +46 -93
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paperless.js","sourceRoot":"","sources":["../src/paperless.ts"],"names":[],"mappings":"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","sourcesContent":["import fsSync from \"fs\";\nimport FormData from \"form-data\";\nimport axios from \"axios\";\nimport { ScanConfig } from \"./scanProcessing\";\nimport { ScanContent } from \"./ScanContent\";\nimport fs from \"fs/promises\";\nimport { convertToPdf, mergeToPdf } from \"./pdfProcessing\";\nimport { PaperlessConfig } from \"./PaperlessConfig\";\n\nexport async function uploadImagesAsSeparateDocumentsToPaperless(scanJobContent: ScanContent, paperlessConfig: PaperlessConfig) {\n for (let i = 0; i < scanJobContent.elements.length; ++i) {\n const filePath = scanJobContent.elements[i].path;\n await uploadToPaperless(filePath, paperlessConfig);\n if (!paperlessConfig.keepFiles) {\n await fs.unlink(filePath);\n console.log(\n `Image document ${filePath} has been removed from the filesystem`\n );\n }\n }\n}\n\nexport async function convertImagesToPdfAndUploadAsSeparateDocumentsToPaperless(scanJobContent: ScanContent, paperlessConfig: PaperlessConfig) {\n for (let i = 0; i < scanJobContent.elements.length; ++i) {\n const pdfFilePath = await convertToPdf(\n scanJobContent.elements[i],\n !paperlessConfig.keepFiles\n );\n if (pdfFilePath) {\n await uploadToPaperless(pdfFilePath, paperlessConfig);\n await fs.unlink(pdfFilePath);\n } else {\n console.log(\n \"Pdf generation has failed, nothing is going to be uploaded to paperless for: \" +\n scanJobContent.elements[i].path\n );\n }\n }\n}\n\nexport async function mergeToPdfAndUploadAsSingleDocumentToPaperless(folder: string, scanCount: number, scanJobContent: ScanContent, scanConfig: ScanConfig, scanDate: Date, paperlessConfig: PaperlessConfig) {\n const pdfFilePath = await mergeToPdf(\n folder,\n scanCount,\n scanJobContent,\n scanConfig.directoryConfig.filePattern,\n scanDate,\n !paperlessConfig.keepFiles\n );\n if (pdfFilePath) {\n await uploadToPaperless(pdfFilePath, paperlessConfig);\n await fs.unlink(pdfFilePath);\n console.log(\n `Pdf document ${pdfFilePath} has been removed from the filesystem`\n );\n } else {\n console.log(\n \"Pdf generation has failed, nothing is going to be uploaded to paperless\"\n );\n }\n}\n\nexport async function uploadPdfToPaperless(pdfFilePath: string | null, paperlessConfig: PaperlessConfig) {\n if (pdfFilePath) {\n await uploadToPaperless(pdfFilePath, paperlessConfig);\n if (!paperlessConfig.keepFiles) {\n await fs.unlink(pdfFilePath);\n console.log(\n `Pdf document ${pdfFilePath} has been removed from the filesystem`\n );\n }\n } else {\n console.log(\n \"Pdf generation has failed, nothing is going to be uploaded to paperless\",\n );\n }\n}\n\nasync function uploadToPaperless(\n filePath: string,\n paperlessConfig: PaperlessConfig,\n): Promise<void> {\n const url = paperlessConfig.postDocumentUrl;\n\n const authToken = paperlessConfig.authToken;\n\n const fileStream = fsSync.createReadStream(filePath);\n\n const form = new FormData();\n form.append(\"document\", fileStream);\n\n console.log(`Start uploading to paperless: ${filePath}`);\n try {\n const response = await axios.post(url, form, {\n headers: {\n ...form.getHeaders(),\n Authorization: `Token ${authToken}`,\n },\n });\n\n console.log(\"Document successfully uploaded to paperless:\", response.data);\n } catch (error) {\n console.error(\"Fail to upload document:\", error);\n }\n fileStream.close();\n}"]}
@@ -0,0 +1,4 @@
1
+ import { ScanContent, ScanPage } from "./ScanContent";
2
+ export declare function mergeToPdf(folder: string, scanCount: number, scanJobContent: ScanContent, filePattern: string | undefined, date: Date, deleteFiles: boolean): Promise<string | null>;
3
+ export declare function convertToPdf(scanPage: ScanPage, deleteFile: boolean): Promise<string | null>;
4
+ export declare function createPdfFrom(scanContent: ScanContent, destination: string): Promise<void>;
@@ -0,0 +1,52 @@
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.createPdfFrom = exports.convertToPdf = exports.mergeToPdf = void 0;
7
+ const PathHelper_1 = __importDefault(require("./PathHelper"));
8
+ const promises_1 = __importDefault(require("fs/promises"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const jspdf_1 = require("jspdf");
11
+ async function mergeToPdf(folder, scanCount, scanJobContent, filePattern, date, deleteFiles) {
12
+ if (scanJobContent.elements.length > 0) {
13
+ const pdfFilePath = PathHelper_1.default.getFileForScan(folder, scanCount, filePattern, "pdf", date);
14
+ await createPdfFrom(scanJobContent, pdfFilePath);
15
+ if (deleteFiles) {
16
+ await Promise.all(scanJobContent.elements.map((e) => promises_1.default.unlink(e.path)));
17
+ }
18
+ return pdfFilePath;
19
+ }
20
+ console.log(`No page available to build a pdf file`);
21
+ return null;
22
+ }
23
+ exports.mergeToPdf = mergeToPdf;
24
+ async function convertToPdf(scanPage, deleteFile) {
25
+ const fileName = path_1.default.basename(scanPage.path, path_1.default.extname(scanPage.path));
26
+ const pdfFilePath = path_1.default.join(path_1.default.dirname(scanPage.path), `${fileName}.pdf`);
27
+ await createPdfFrom({ elements: [scanPage] }, pdfFilePath);
28
+ if (deleteFile) {
29
+ await promises_1.default.unlink(scanPage.path);
30
+ }
31
+ return pdfFilePath;
32
+ }
33
+ exports.convertToPdf = convertToPdf;
34
+ async function createPdfFrom(scanContent, destination) {
35
+ let doc = null;
36
+ for (const element of scanContent.elements) {
37
+ const widthInInches = element.width / element.xResolution;
38
+ const heightInInches = element.height / element.yResolution;
39
+ const format = [widthInInches, heightInInches];
40
+ if (doc == null) {
41
+ doc = new jspdf_1.jsPDF({ unit: "in", floatPrecision: 3, format });
42
+ }
43
+ else {
44
+ doc.addPage(format);
45
+ }
46
+ const imageByteBuffer = await promises_1.default.readFile(element.path);
47
+ doc.addImage(imageByteBuffer, "JPEG", 0, 0, widthInInches, heightInInches);
48
+ }
49
+ doc === null || doc === void 0 ? void 0 : doc.save(destination);
50
+ }
51
+ exports.createPdfFrom = createPdfFrom;
52
+ //# sourceMappingURL=pdfProcessing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfProcessing.js","sourceRoot":"","sources":["../src/pdfProcessing.ts"],"names":[],"mappings":";;;;;;AACA,8DAAsC;AACtC,2DAA6B;AAC7B,gDAAwB;AACxB,iCAA8B;AAEvB,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,SAAiB,EACjB,cAA2B,EAC3B,WAA+B,EAC/B,IAAU,EACV,WAAoB;IAEpB,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QACtC,MAAM,WAAW,GAAW,oBAAU,CAAC,cAAc,CACnD,MAAM,EACN,SAAS,EACT,WAAW,EACX,KAAK,EACL,IAAI,CACL,CAAC;QACF,MAAM,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,WAAW,EAAE;YACf,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC1E;QACD,OAAO,WAAW,CAAC;KACpB;IACD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAxBD,gCAwBC;AAEM,KAAK,UAAU,YAAY,CAChC,QAAkB,EAClB,UAAmB;IAEnB,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;IAE9E,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC3D,IAAI,UAAU,EAAE;QACd,MAAM,kBAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;KAChC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAZD,oCAYC;AAEM,KAAK,UAAU,aAAa,CACjC,WAAwB,EACxB,WAAmB;IAEnB,IAAI,GAAG,GAAiB,IAAI,CAAC;IAC7B,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE;QAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC;QAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QAC5D,MAAM,MAAM,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAE/C,IAAI,GAAG,IAAI,IAAI,EAAE;YACf,GAAG,GAAG,IAAI,aAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC5D;aAAM;YACL,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SACrB;QAED,MAAM,eAAe,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;KAC5E;IACD,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC,WAAW,CAAC,CAAC;AACzB,CAAC;AApBD,sCAoBC","sourcesContent":["import { ScanContent, ScanPage } from \"./ScanContent\";\nimport PathHelper from \"./PathHelper\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport { jsPDF } from \"jspdf\";\n\nexport async function mergeToPdf(\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n filePattern: string | undefined,\n date: Date,\n deleteFiles: boolean,\n): Promise<string | null> {\n if (scanJobContent.elements.length > 0) {\n const pdfFilePath: string = PathHelper.getFileForScan(\n folder,\n scanCount,\n filePattern,\n \"pdf\",\n date,\n );\n await createPdfFrom(scanJobContent, pdfFilePath);\n if (deleteFiles) {\n await Promise.all(scanJobContent.elements.map((e) => fs.unlink(e.path)));\n }\n return pdfFilePath;\n }\n console.log(`No page available to build a pdf file`);\n return null;\n}\n\nexport async function convertToPdf(\n scanPage: ScanPage,\n deleteFile: boolean,\n): Promise<string | null> {\n const fileName = path.basename(scanPage.path, path.extname(scanPage.path));\n const pdfFilePath = path.join(path.dirname(scanPage.path), `${fileName}.pdf`);\n\n await createPdfFrom({ elements: [scanPage] }, pdfFilePath);\n if (deleteFile) {\n await fs.unlink(scanPage.path);\n }\n return pdfFilePath;\n}\n\nexport async function createPdfFrom(\n scanContent: ScanContent,\n destination: string,\n) {\n let doc: jsPDF | null = null;\n for (const element of scanContent.elements) {\n const widthInInches = element.width / element.xResolution;\n const heightInInches = element.height / element.yResolution;\n const format = [widthInInches, heightInInches];\n\n if (doc == null) {\n doc = new jsPDF({ unit: \"in\", floatPrecision: 3, format });\n } else {\n doc.addPage(format);\n }\n\n const imageByteBuffer = await fs.readFile(element.path);\n doc.addImage(imageByteBuffer, \"JPEG\", 0, 0, widthInInches, heightInInches);\n }\n doc?.save(destination);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { ScanContent } from "./ScanContent";
2
+ import { ScanConfig } from "./scanProcessing";
3
+ export declare function postProcessing(scanConfig: ScanConfig, folder: string, tempFolder: string, scanCount: number, scanJobContent: ScanContent, scanDate: Date, toPdf: boolean): Promise<void>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.postProcessing = void 0;
4
+ const pdfProcessing_1 = require("./pdfProcessing");
5
+ const paperless_1 = require("./paperless/paperless");
6
+ async function postProcessing(scanConfig, folder, tempFolder, scanCount, scanJobContent, scanDate, toPdf) {
7
+ const paperlessConfig = scanConfig.paperlessConfig;
8
+ if (toPdf) {
9
+ const pdfFilePath = await (0, pdfProcessing_1.mergeToPdf)(paperlessConfig ? tempFolder : folder, scanCount, scanJobContent, scanConfig.directoryConfig.filePattern, scanDate, true);
10
+ displayPdfScan(pdfFilePath, scanJobContent);
11
+ if (paperlessConfig) {
12
+ await (0, paperless_1.uploadPdfToPaperless)(pdfFilePath, paperlessConfig);
13
+ }
14
+ }
15
+ else {
16
+ displayJpegScan(scanJobContent);
17
+ if (paperlessConfig) {
18
+ if (paperlessConfig.groupMultiPageScanIntoAPdf) {
19
+ await (0, paperless_1.mergeToPdfAndUploadAsSingleDocumentToPaperless)(folder, scanCount, scanJobContent, scanConfig, scanDate, paperlessConfig);
20
+ }
21
+ else {
22
+ if (paperlessConfig.alwaysSendAsPdfFile) {
23
+ await (0, paperless_1.convertImagesToPdfAndUploadAsSeparateDocumentsToPaperless)(scanJobContent, paperlessConfig);
24
+ }
25
+ else {
26
+ await (0, paperless_1.uploadImagesAsSeparateDocumentsToPaperless)(scanJobContent, paperlessConfig);
27
+ }
28
+ }
29
+ }
30
+ }
31
+ }
32
+ exports.postProcessing = postProcessing;
33
+ function displayPdfScan(pdfFilePath, scanJobContent) {
34
+ if (pdfFilePath === null) {
35
+ console.log(`Pdf generated has not been generated`);
36
+ return;
37
+ }
38
+ console.log(`The following page(s) have been rendered inside '${pdfFilePath}': `);
39
+ scanJobContent.elements.forEach((e) => console.log(`\t- page ${e.pageNumber.toString().padStart(3, " ")} - ${e.width}x${e.height}`));
40
+ }
41
+ function displayJpegScan(scanJobContent) {
42
+ scanJobContent.elements.forEach((e) => console.log(`\t- page ${e.pageNumber.toString().padStart(3, " ")} - ${e.width}x${e.height} - ${e.path}`));
43
+ }
44
+ //# sourceMappingURL=postProcessing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postProcessing.js","sourceRoot":"","sources":["../src/postProcessing.ts"],"names":[],"mappings":";;;AACA,mDAA6C;AAC7C,qDAK+B;AAGxB,KAAK,UAAU,cAAc,CAClC,UAAsB,EACtB,MAAc,EACd,UAAkB,EAClB,SAAiB,EACjB,cAA2B,EAC3B,QAAc,EACd,KAAc;IAEd,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;IACnD,IAAI,KAAK,EAAE;QACT,MAAM,WAAW,GAAG,MAAM,IAAA,0BAAU,EAClC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EACrC,SAAS,EACT,cAAc,EACd,UAAU,CAAC,eAAe,CAAC,WAAW,EACtC,QAAQ,EACR,IAAI,CACL,CAAC;QACF,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC5C,IAAI,eAAe,EAAE;YACnB,MAAM,IAAA,gCAAoB,EAAC,WAAW,EAAE,eAAe,CAAC,CAAC;SAC1D;KACF;SAAM;QACL,eAAe,CAAC,cAAc,CAAC,CAAC;QAChC,IAAI,eAAe,EAAE;YACnB,IAAI,eAAe,CAAC,0BAA0B,EAAE;gBAC9C,MAAM,IAAA,0DAA8C,EAClD,MAAM,EACN,SAAS,EACT,cAAc,EACd,UAAU,EACV,QAAQ,EACR,eAAe,CAChB,CAAC;aACH;iBAAM;gBACL,IAAI,eAAe,CAAC,mBAAmB,EAAE;oBACvC,MAAM,IAAA,qEAAyD,EAC7D,cAAc,EACd,eAAe,CAChB,CAAC;iBACH;qBAAM;oBACL,MAAM,IAAA,sDAA0C,EAC9C,cAAc,EACd,eAAe,CAChB,CAAC;iBACH;aACF;SACF;KACF;AACH,CAAC;AAlDD,wCAkDC;AAED,SAAS,cAAc,CACrB,WAA0B,EAC1B,cAA2B;IAE3B,IAAI,WAAW,KAAK,IAAI,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO;KACR;IACD,OAAO,CAAC,GAAG,CACT,oDAAoD,WAAW,KAAK,CACrE,CAAC;IACF,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACpC,OAAO,CAAC,GAAG,CACT,YAAY,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,IAC/D,CAAC,CAAC,MACJ,EAAE,CACH,CACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,cAA2B;IAClD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACpC,OAAO,CAAC,GAAG,CACT,YAAY,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,IAC/D,CAAC,CAAC,MACJ,MAAM,CAAC,CAAC,IAAI,EAAE,CACf,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { ScanContent } from \"./ScanContent\";\nimport { mergeToPdf } from \"./pdfProcessing\";\nimport {\n convertImagesToPdfAndUploadAsSeparateDocumentsToPaperless,\n mergeToPdfAndUploadAsSingleDocumentToPaperless,\n uploadImagesAsSeparateDocumentsToPaperless,\n uploadPdfToPaperless,\n} from \"./paperless/paperless\";\nimport { ScanConfig } from \"./scanProcessing\";\n\nexport async function postProcessing(\n scanConfig: ScanConfig,\n folder: string,\n tempFolder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n scanDate: Date,\n toPdf: boolean,\n) {\n const paperlessConfig = scanConfig.paperlessConfig;\n if (toPdf) {\n const pdfFilePath = await mergeToPdf(\n paperlessConfig ? tempFolder : folder,\n scanCount,\n scanJobContent,\n scanConfig.directoryConfig.filePattern,\n scanDate,\n true,\n );\n displayPdfScan(pdfFilePath, scanJobContent);\n if (paperlessConfig) {\n await uploadPdfToPaperless(pdfFilePath, paperlessConfig);\n }\n } else {\n displayJpegScan(scanJobContent);\n if (paperlessConfig) {\n if (paperlessConfig.groupMultiPageScanIntoAPdf) {\n await mergeToPdfAndUploadAsSingleDocumentToPaperless(\n folder,\n scanCount,\n scanJobContent,\n scanConfig,\n scanDate,\n paperlessConfig,\n );\n } else {\n if (paperlessConfig.alwaysSendAsPdfFile) {\n await convertImagesToPdfAndUploadAsSeparateDocumentsToPaperless(\n scanJobContent,\n paperlessConfig,\n );\n } else {\n await uploadImagesAsSeparateDocumentsToPaperless(\n scanJobContent,\n paperlessConfig,\n );\n }\n }\n }\n }\n}\n\nfunction displayPdfScan(\n pdfFilePath: string | null,\n scanJobContent: ScanContent,\n) {\n if (pdfFilePath === null) {\n console.log(`Pdf generated has not been generated`);\n return;\n }\n console.log(\n `The following page(s) have been rendered inside '${pdfFilePath}': `,\n );\n scanJobContent.elements.forEach((e) =>\n console.log(\n `\\t- page ${e.pageNumber.toString().padStart(3, \" \")} - ${e.width}x${\n e.height\n }`,\n ),\n );\n}\n\nfunction displayJpegScan(scanJobContent: ScanContent) {\n scanJobContent.elements.forEach((e) =>\n console.log(\n `\\t- page ${e.pageNumber.toString().padStart(3, \" \")} - ${e.width}x${\n e.height\n } - ${e.path}`,\n ),\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"readDeviceCapabilities.js","sourceRoot":"","sources":["../src/readDeviceCapabilities.ts"],"names":[],"mappings":";;;;;;AACA,oDAA4B;AAIrB,KAAK,UAAU,sBAAsB;IAC1C,IAAI,+BAA+B,GAAG,IAAI,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,eAAK,CAAC,gBAAgB,EAAE,CAAC;IACrD,IAAI,oBAAoB,GAAgC,IAAI,CAAC;IAC7D,IAAI,aAAa,CAAC,2BAA2B,IAAI,IAAI,EAAE,CAAC;QACtD,MAAM,wBAAwB,GAAG,MAAM,eAAK,CAAC,2BAA2B,CACtE,aAAa,CAAC,2BAA2B,CAC1C,CAAC;QACF,IAAI,wBAAwB,CAAC,uBAAuB,IAAI,IAAI,EAAE,CAAC;YAC7D,oBAAoB,GAAG,MAAM,eAAK,CAAC,uBAAuB,CACxD,wBAAwB,CAAC,uBAAuB,CACjD,CAAC;YACF,+BAA+B;gBAC7B,oBAAoB,CAAC,+BAA+B,CAAC;QACzD,CAAC;IACH,CAAC;SAAM,IAAI,aAAa,CAAC,qBAAqB,IAAI,IAAI,EAAE,CAAC;QACvD,MAAM,kBAAkB,GAAG,MAAM,eAAK,CAAC,qBAAqB,CAC1D,aAAa,CAAC,qBAAqB,CACpC,CAAC;QACF,IAAI,kBAAkB,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC;YACzD,MAAM,eAAK,CAAC,yBAAyB,CACnC,kBAAkB,CAAC,yBAAyB,CAC7C,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,QAAQ,GAAoB,IAAI,CAAC;IACrC,IAAI,aAAa,CAAC,kBAAkB,IAAI,IAAI,EAAE,CAAC;QAC7C,MAAM,eAAe,GAAG,MAAM,eAAK,CAAC,kBAAkB,CACpD,aAAa,CAAC,kBAAkB,CACjC,CAAC;QACF,IAAI,eAAe,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YACxC,QAAQ,GAAG,MAAM,eAAK,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO;QACL,+BAA+B;QAC/B,mBAAmB,EAAE,oBAAoB,IAAI,IAAI;QACjD,cAAc,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,cAAc,KAAI,IAAI;QAChD,eAAe,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,KAAI,IAAI;QAClD,WAAW,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,KAAI,IAAI;QAC1C,YAAY,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,YAAY,KAAI,IAAI;KAC7C,CAAC;AACJ,CAAC;AA9CD,wDA8CC","sourcesContent":["import { DeviceCapabilities } from \"./DeviceCapabilities\";\nimport HPApi from \"./HPApi\";\nimport WalkupScanToCompCaps from \"./WalkupScanToCompCaps\";\nimport ScanCaps from \"./ScanCaps\";\n\nexport async function readDeviceCapabilities(): Promise<DeviceCapabilities> {\n let supportsMultiItemScanFromPlaten = true;\n const discoveryTree = await HPApi.getDiscoveryTree();\n let walkupScanToCompCaps: WalkupScanToCompCaps | null = null;\n if (discoveryTree.WalkupScanToCompManifestURI != null) {\n const walkupScanToCompManifest = await HPApi.getWalkupScanToCompManifest(\n discoveryTree.WalkupScanToCompManifestURI,\n );\n if (walkupScanToCompManifest.WalkupScanToCompCapsURI != null) {\n walkupScanToCompCaps = await HPApi.getWalkupScanToCompCaps(\n walkupScanToCompManifest.WalkupScanToCompCapsURI,\n );\n supportsMultiItemScanFromPlaten =\n walkupScanToCompCaps.supportsMultiItemScanFromPlaten;\n }\n } else if (discoveryTree.WalkupScanManifestURI != null) {\n const walkupScanManifest = await HPApi.getWalkupScanManifest(\n discoveryTree.WalkupScanManifestURI,\n );\n if (walkupScanManifest.walkupScanDestinationsURI != null) {\n await HPApi.getWalkupScanDestinations(\n walkupScanManifest.walkupScanDestinationsURI,\n );\n }\n } else {\n console.log(\"Unknown device!\");\n }\n\n let scanCaps: ScanCaps | null = null;\n if (discoveryTree.ScanJobManifestURI != null) {\n const scanJobManifest = await HPApi.getScanJobManifest(\n discoveryTree.ScanJobManifestURI,\n );\n if (scanJobManifest.ScanCapsURI != null) {\n scanCaps = await HPApi.getScanCaps(scanJobManifest.ScanCapsURI);\n }\n }\n\n return {\n supportsMultiItemScanFromPlaten,\n useWalkupScanToComp: walkupScanToCompCaps != null,\n platenMaxWidth: scanCaps?.platenMaxWidth || null,\n platenMaxHeight: scanCaps?.platenMaxHeight || null,\n adfMaxWidth: scanCaps?.adfMaxWidth || null,\n adfMaxHeight: scanCaps?.adfMaxHeight || null,\n };\n}\n"]}
1
+ {"version":3,"file":"readDeviceCapabilities.js","sourceRoot":"","sources":["../src/readDeviceCapabilities.ts"],"names":[],"mappings":";;;;;;AACA,oDAA4B;AAIrB,KAAK,UAAU,sBAAsB;IAC1C,IAAI,+BAA+B,GAAG,IAAI,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,eAAK,CAAC,gBAAgB,EAAE,CAAC;IACrD,IAAI,oBAAoB,GAAgC,IAAI,CAAC;IAC7D,IAAI,aAAa,CAAC,2BAA2B,IAAI,IAAI,EAAE;QACrD,MAAM,wBAAwB,GAAG,MAAM,eAAK,CAAC,2BAA2B,CACtE,aAAa,CAAC,2BAA2B,CAC1C,CAAC;QACF,IAAI,wBAAwB,CAAC,uBAAuB,IAAI,IAAI,EAAE;YAC5D,oBAAoB,GAAG,MAAM,eAAK,CAAC,uBAAuB,CACxD,wBAAwB,CAAC,uBAAuB,CACjD,CAAC;YACF,+BAA+B;gBAC7B,oBAAoB,CAAC,+BAA+B,CAAC;SACxD;KACF;SAAM,IAAI,aAAa,CAAC,qBAAqB,IAAI,IAAI,EAAE;QACtD,MAAM,kBAAkB,GAAG,MAAM,eAAK,CAAC,qBAAqB,CAC1D,aAAa,CAAC,qBAAqB,CACpC,CAAC;QACF,IAAI,kBAAkB,CAAC,yBAAyB,IAAI,IAAI,EAAE;YACxD,MAAM,eAAK,CAAC,yBAAyB,CACnC,kBAAkB,CAAC,yBAAyB,CAC7C,CAAC;SACH;KACF;SAAM;QACL,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;KAChC;IAED,IAAI,QAAQ,GAAoB,IAAI,CAAC;IACrC,IAAI,aAAa,CAAC,kBAAkB,IAAI,IAAI,EAAE;QAC5C,MAAM,eAAe,GAAG,MAAM,eAAK,CAAC,kBAAkB,CACpD,aAAa,CAAC,kBAAkB,CACjC,CAAC;QACF,IAAI,eAAe,CAAC,WAAW,IAAI,IAAI,EAAE;YACvC,QAAQ,GAAG,MAAM,eAAK,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;SACjE;KACF;IAED,OAAO;QACL,+BAA+B;QAC/B,mBAAmB,EAAE,oBAAoB,IAAI,IAAI;QACjD,cAAc,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,cAAc,KAAI,IAAI;QAChD,eAAe,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,KAAI,IAAI;QAClD,WAAW,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,KAAI,IAAI;QAC1C,YAAY,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,YAAY,KAAI,IAAI;KAC7C,CAAC;AACJ,CAAC;AA9CD,wDA8CC","sourcesContent":["import { DeviceCapabilities } from \"./DeviceCapabilities\";\nimport HPApi from \"./HPApi\";\nimport WalkupScanToCompCaps from \"./WalkupScanToCompCaps\";\nimport ScanCaps from \"./ScanCaps\";\n\nexport async function readDeviceCapabilities(): Promise<DeviceCapabilities> {\n let supportsMultiItemScanFromPlaten = true;\n const discoveryTree = await HPApi.getDiscoveryTree();\n let walkupScanToCompCaps: WalkupScanToCompCaps | null = null;\n if (discoveryTree.WalkupScanToCompManifestURI != null) {\n const walkupScanToCompManifest = await HPApi.getWalkupScanToCompManifest(\n discoveryTree.WalkupScanToCompManifestURI,\n );\n if (walkupScanToCompManifest.WalkupScanToCompCapsURI != null) {\n walkupScanToCompCaps = await HPApi.getWalkupScanToCompCaps(\n walkupScanToCompManifest.WalkupScanToCompCapsURI,\n );\n supportsMultiItemScanFromPlaten =\n walkupScanToCompCaps.supportsMultiItemScanFromPlaten;\n }\n } else if (discoveryTree.WalkupScanManifestURI != null) {\n const walkupScanManifest = await HPApi.getWalkupScanManifest(\n discoveryTree.WalkupScanManifestURI,\n );\n if (walkupScanManifest.walkupScanDestinationsURI != null) {\n await HPApi.getWalkupScanDestinations(\n walkupScanManifest.walkupScanDestinationsURI,\n );\n }\n } else {\n console.log(\"Unknown device!\");\n }\n\n let scanCaps: ScanCaps | null = null;\n if (discoveryTree.ScanJobManifestURI != null) {\n const scanJobManifest = await HPApi.getScanJobManifest(\n discoveryTree.ScanJobManifestURI,\n );\n if (scanJobManifest.ScanCapsURI != null) {\n scanCaps = await HPApi.getScanCaps(scanJobManifest.ScanCapsURI);\n }\n }\n\n return {\n supportsMultiItemScanFromPlaten,\n useWalkupScanToComp: walkupScanToCompCaps != null,\n platenMaxWidth: scanCaps?.platenMaxWidth || null,\n platenMaxHeight: scanCaps?.platenMaxHeight || null,\n adfMaxWidth: scanCaps?.adfMaxWidth || null,\n adfMaxHeight: scanCaps?.adfMaxHeight || null,\n };\n}\n"]}
@@ -1,9 +1,10 @@
1
1
  import Event from "./Event";
2
2
  import { DeviceCapabilities } from "./DeviceCapabilities";
3
3
  import { InputSource } from "./InputSource";
4
+ import { PaperlessConfig } from "./paperless/PaperlessConfig";
4
5
  export declare function getScanWidth(scanConfig: ScanConfig, inputSource: InputSource, deviceCapabilities: DeviceCapabilities): number | null;
5
6
  export declare function getScanHeight(scanConfig: ScanConfig, inputSource: InputSource, deviceCapabilities: DeviceCapabilities): number | null;
6
- export declare function saveScan(event: Event, folder: string, tempFolder: string, scanCount: number, deviceCapabilities: DeviceCapabilities, scanConfig: ScanConfig): Promise<void>;
7
+ export declare function saveScanFromEvent(event: Event, folder: string, tempFolder: string, scanCount: number, deviceCapabilities: DeviceCapabilities, scanConfig: ScanConfig): Promise<void>;
7
8
  export type DirectoryConfig = {
8
9
  directory: string | undefined;
9
10
  tempDirectory: string | undefined;
@@ -14,6 +15,7 @@ export type ScanConfig = {
14
15
  width: number | null;
15
16
  height: number | null;
16
17
  directoryConfig: DirectoryConfig;
18
+ paperlessConfig: PaperlessConfig | undefined;
17
19
  };
18
20
  export type AdfAutoScanConfig = ScanConfig & {
19
21
  isDuplex: boolean;
@@ -21,5 +23,9 @@ export type AdfAutoScanConfig = ScanConfig & {
21
23
  pollingInterval: number;
22
24
  startScanDelay: number;
23
25
  };
26
+ export type SingleScanConfig = ScanConfig & {
27
+ isDuplex: boolean;
28
+ generatePdf: boolean;
29
+ };
24
30
  export declare function scanFromAdf(scanCount: number, folder: string, tempFolder: string, adfAutoScanConfig: AdfAutoScanConfig, deviceCapabilities: DeviceCapabilities, date: Date): Promise<void>;
25
31
  export declare function waitAdfLoaded(pollingInterval: number, startScanDelay: number): Promise<void>;
@@ -3,16 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.waitAdfLoaded = exports.scanFromAdf = exports.saveScan = exports.getScanHeight = exports.getScanWidth = void 0;
6
+ exports.waitAdfLoaded = exports.scanFromAdf = exports.saveScanFromEvent = exports.getScanHeight = exports.getScanWidth = void 0;
7
7
  const HPApi_1 = __importDefault(require("./HPApi"));
8
8
  const promises_1 = __importDefault(require("fs/promises"));
9
9
  const JpegUtil_1 = __importDefault(require("./JpegUtil"));
10
10
  const listening_1 = require("./listening");
11
11
  const ScanJobSettings_1 = __importDefault(require("./ScanJobSettings"));
12
- const ScanContent_1 = require("./ScanContent");
13
12
  const delay_1 = require("./delay");
14
13
  const PathHelper_1 = __importDefault(require("./PathHelper"));
15
14
  const InputSource_1 = require("./InputSource");
15
+ const postProcessing_1 = require("./postProcessing");
16
16
  async function waitDeviceUntilItIsReadyToUploadOrCompleted(jobUrl) {
17
17
  let job = null;
18
18
  let isReadyToUpload = false;
@@ -35,7 +35,7 @@ async function waitDeviceUntilItIsReadyToUploadOrCompleted(jobUrl) {
35
35
  } while (!isReadyToUpload);
36
36
  return job;
37
37
  }
38
- async function TryGetDestination(event) {
38
+ async function tryGetDestination(event) {
39
39
  //this code can in some cases be executed before the user actually chooses between Document or Photo
40
40
  //so lets fetch the contentType (Document or Photo) until we get a value
41
41
  let destination = null;
@@ -60,7 +60,7 @@ async function TryGetDestination(event) {
60
60
  }
61
61
  async function scanProcessing(filePath) {
62
62
  const buffer = await promises_1.default.readFile(filePath);
63
- let height = JpegUtil_1.default.fixSizeWithDNL(buffer);
63
+ const height = JpegUtil_1.default.fixSizeWithDNL(buffer);
64
64
  if (height != null) {
65
65
  // rewrite the fixed file
66
66
  await promises_1.default.writeFile(filePath, buffer);
@@ -70,7 +70,7 @@ async function scanProcessing(filePath) {
70
70
  }
71
71
  function createScanPage(job, currentPageNumber, filePath, sizeFixed) {
72
72
  var _a, _b, _c;
73
- let height = sizeFixed !== null && sizeFixed !== void 0 ? sizeFixed : job.imageHeight;
73
+ const height = sizeFixed !== null && sizeFixed !== void 0 ? sizeFixed : job.imageHeight;
74
74
  return {
75
75
  path: filePath,
76
76
  pageNumber: currentPageNumber,
@@ -80,7 +80,7 @@ function createScanPage(job, currentPageNumber, filePath, sizeFixed) {
80
80
  yResolution: (_c = job.yResolution) !== null && _c !== void 0 ? _c : 200,
81
81
  };
82
82
  }
83
- async function handleProcessingState(job, inputSource, folder, scanCount, currentPageNumber, filePattern, date) {
83
+ async function handleScanProcessingState(job, inputSource, folder, scanCount, currentPageNumber, filePattern, date) {
84
84
  if (job.pageState == "ReadyToUpload" &&
85
85
  job.binaryURL != null &&
86
86
  job.currentPageNumber != null) {
@@ -113,7 +113,7 @@ async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, s
113
113
  continue;
114
114
  }
115
115
  if (job.jobState === "Processing") {
116
- const page = await handleProcessingState(job, inputSource, folder, scanCount, scanJobContent.elements.length + 1, filePattern, new Date());
116
+ const page = await handleScanProcessingState(job, inputSource, folder, scanCount, scanJobContent.elements.length + 1, filePattern, new Date());
117
117
  job = await HPApi_1.default.getJob(jobUrl);
118
118
  if (page != null && job.jobState != "Canceled") {
119
119
  scanJobContent.elements.push(page);
@@ -136,8 +136,8 @@ async function waitScanNewPageRequest(compEventURI) {
136
136
  let wait = true;
137
137
  while (wait) {
138
138
  await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s
139
- let walkupScanToCompEvent = await HPApi_1.default.getWalkupScanToCompEvent(compEventURI);
140
- let message = walkupScanToCompEvent.eventType;
139
+ const walkupScanToCompEvent = await HPApi_1.default.getWalkupScanToCompEvent(compEventURI);
140
+ const message = walkupScanToCompEvent.eventType;
141
141
  if (message === "ScanNewPageRequested") {
142
142
  startNewScanJob = true;
143
143
  wait = false;
@@ -184,27 +184,6 @@ async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount,
184
184
  }
185
185
  }
186
186
  }
187
- async function mergeToPdf(folder, scanCount, scanJobContent, filePattern, date) {
188
- if (scanJobContent.elements.length > 0) {
189
- const pdfFilePath = PathHelper_1.default.getFileForScan(folder, scanCount, filePattern, "pdf", date);
190
- await (0, ScanContent_1.createPdfFrom)(scanJobContent, pdfFilePath);
191
- scanJobContent.elements.forEach((e) => promises_1.default.unlink(e.path));
192
- return pdfFilePath;
193
- }
194
- console.log(`No page available to build a pdf file`);
195
- return null;
196
- }
197
- function displayPdfScan(pdfFilePath, scanJobContent) {
198
- if (pdfFilePath === null) {
199
- console.log(`Pdf generated has not been generated`);
200
- return;
201
- }
202
- console.log(`The following page(s) have been rendered inside '${pdfFilePath}': `);
203
- scanJobContent.elements.forEach((e) => console.log(`\t- page ${e.pageNumber.toString().padStart(3, " ")} - ${e.width}x${e.height}`));
204
- }
205
- function displayJpegScan(scanJobContent) {
206
- scanJobContent.elements.forEach((e) => console.log(`\t- page ${e.pageNumber.toString().padStart(3, " ")} - ${e.width}x${e.height} - ${e.path}`));
207
- }
208
187
  function isPdf(destination) {
209
188
  if (destination.shortcut === "SavePDF" ||
210
189
  destination.shortcut === "EmailPDF" ||
@@ -233,7 +212,9 @@ function getScanWidth(scanConfig, inputSource, deviceCapabilities) {
233
212
  }
234
213
  }
235
214
  else {
236
- return null;
215
+ return inputSource === InputSource_1.InputSource.Adf
216
+ ? deviceCapabilities.adfMaxWidth
217
+ : deviceCapabilities.platenMaxWidth;
237
218
  }
238
219
  }
239
220
  exports.getScanWidth = getScanWidth;
@@ -250,18 +231,20 @@ function getScanHeight(scanConfig, inputSource, deviceCapabilities) {
250
231
  }
251
232
  }
252
233
  else {
253
- return null;
234
+ return inputSource === InputSource_1.InputSource.Adf
235
+ ? deviceCapabilities.adfMaxHeight
236
+ : deviceCapabilities.platenMaxHeight;
254
237
  }
255
238
  }
256
239
  exports.getScanHeight = getScanHeight;
257
- async function saveScan(event, folder, tempFolder, scanCount, deviceCapabilities, scanConfig) {
240
+ async function saveScanFromEvent(event, folder, tempFolder, scanCount, deviceCapabilities, scanConfig) {
258
241
  if (event.compEventURI) {
259
242
  const proceedToScan = await (0, listening_1.waitScanRequest)(event.compEventURI);
260
243
  if (!proceedToScan) {
261
244
  return;
262
245
  }
263
246
  }
264
- const destination = await TryGetDestination(event);
247
+ const destination = await tryGetDestination(event);
265
248
  if (!destination) {
266
249
  console.log("No shortcut selected!");
267
250
  return;
@@ -296,15 +279,9 @@ async function saveScan(event, folder, tempFolder, scanCount, deviceCapabilities
296
279
  const scanDate = new Date();
297
280
  await executeScanJobs(scanJobSettings, inputSource, destinationFolder, scanCount, scanJobContent, event, deviceCapabilities, scanConfig.directoryConfig.filePattern);
298
281
  console.log(`Scan of page(s) completed totalPages: ${scanJobContent.elements.length}:`);
299
- if (toPdf) {
300
- const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, scanConfig.directoryConfig.filePattern, scanDate);
301
- displayPdfScan(pdfFilePath, scanJobContent);
302
- }
303
- else {
304
- displayJpegScan(scanJobContent);
305
- }
282
+ await (0, postProcessing_1.postProcessing)(scanConfig, folder, tempFolder, scanCount, scanJobContent, scanDate, toPdf);
306
283
  }
307
- exports.saveScan = saveScan;
284
+ exports.saveScanFromEvent = saveScanFromEvent;
308
285
  async function scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig, deviceCapabilities, date) {
309
286
  let destinationFolder;
310
287
  let contentType;
@@ -323,13 +300,7 @@ async function scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig, dev
323
300
  const scanJobContent = { elements: [] };
324
301
  await executeScanJob(scanJobSettings, InputSource_1.InputSource.Adf, destinationFolder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern);
325
302
  console.log(`Scan of page(s) completed, total pages: ${scanJobContent.elements.length}:`);
326
- if (adfAutoScanConfig.generatePdf) {
327
- const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern, date);
328
- displayPdfScan(pdfFilePath, scanJobContent);
329
- }
330
- else {
331
- displayJpegScan(scanJobContent);
332
- }
303
+ await (0, postProcessing_1.postProcessing)(adfAutoScanConfig, folder, tempFolder, scanCount, scanJobContent, date, adfAutoScanConfig.generatePdf);
333
304
  }
334
305
  exports.scanFromAdf = scanFromAdf;
335
306
  async function waitAdfLoaded(pollingInterval, startScanDelay) {
@@ -1 +1 @@
1
- {"version":3,"file":"scanProcessing.js","sourceRoot":"","sources":["../src/scanProcessing.ts"],"names":[],"mappings":";;;;;;AAGA,oDAA4B;AAC5B,2DAA6B;AAC7B,0DAAkC;AAElC,2CAAgE;AAChE,wEAAgD;AAChD,+CAAqE;AAErE,mCAAgC;AAChC,8DAAsC;AAEtC,+CAA4C;AAE5C,KAAK,UAAU,2CAA2C,CACxD,MAAc;IAEd,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,GAAG,CAAC;QACF,GAAG,GAAG,MAAM,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC;QACb,CAAC;aAAM,IACL,GAAG,CAAC,SAAS,KAAK,eAAe;YACjC,GAAG,CAAC,QAAQ,KAAK,WAAW,EAC5B,CAAC;YACD,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,YAAY,EAAE,CAAC;YACxC,eAAe,GAAG,KAAK,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAA,aAAK,EAAC,GAAG,CAAC,CAAC;IACnB,CAAC,QAAQ,CAAC,eAAe,EAAE;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,KAAY;IAEZ,oGAAoG;IACpG,wEAAwE;IACxE,IAAI,WAAW,GACb,IAAI,CAAC;IAEP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAC5C,IAAI,cAAc,EAAE,CAAC;YACnB,WAAW,GAAG,MAAM,eAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YAEzD,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;YACtC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,OAAO,WAAW,CAAC;YACrB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;IACtE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,MAAM,MAAM,GAAW,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEnD,IAAI,MAAM,GAAG,kBAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,yBAAyB;QACzB,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CACrB,GAAQ,EACR,iBAAyB,EACzB,QAAgB,EAChB,SAAwB;;IAExB,IAAI,MAAM,GAAG,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,GAAG,CAAC,WAAW,CAAC;IAC1C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,iBAAiB;QAC7B,KAAK,EAAE,MAAA,GAAG,CAAC,UAAU,mCAAI,CAAC;QAC1B,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,CAAC;QACnB,WAAW,EAAE,MAAA,GAAG,CAAC,WAAW,mCAAI,GAAG;QACnC,WAAW,EAAE,MAAA,GAAG,CAAC,WAAW,mCAAI,GAAG;KACpC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,GAAQ,EACR,WAAwB,EACxB,MAAc,EACd,SAAiB,EACjB,iBAAyB,EACzB,WAA+B,EAC/B,IAAU;IAEV,IACE,GAAG,CAAC,SAAS,IAAI,eAAe;QAChC,GAAG,CAAC,SAAS,IAAI,IAAI;QACrB,GAAG,CAAC,iBAAiB,IAAI,IAAI,EAC7B,CAAC;QACD,OAAO,CAAC,GAAG,CACT,mCAAmC,GAAG,CAAC,iBAAiB,MAAM,EAC9D,GAAG,CAAC,SAAS,CACd,CAAC;QAEF,MAAM,mBAAmB,GAAG,oBAAU,CAAC,cAAc,CACnD,MAAM,EACN,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,KAAK,EACL,IAAI,CACL,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,YAAY,CACvC,GAAG,CAAC,SAAS,EACb,mBAAmB,CACpB,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QAE7C,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,WAAW,IAAI,yBAAW,CAAC,GAAG,EAAE,CAAC;YACnC,SAAS,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CACT,wFAAwF,GAAG,CAAC,WAAW,EAAE,CAC1G,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,MAAM,IAAA,aAAK,EAAC,GAAG,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,eAAgC,EAChC,WAAwB,EACxB,MAAc,EACd,SAAiB,EACjB,cAA2B,EAC3B,WAA+B;IAE/B,MAAM,MAAM,GAAG,MAAM,eAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAExC,IAAI,GAAG,GAAG,MAAM,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,GAAG,GAAG,MAAM,2CAA2C,CAAC,MAAM,CAAC,CAAC;QAEhE,IAAI,GAAG,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,qBAAqB,CACtC,GAAG,EACH,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAClC,WAAW,EACX,IAAI,IAAI,EAAE,CACX,CAAC;YACF,GAAG,GAAG,MAAM,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAC/C,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,MAAM;QACR,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnD,MAAM,IAAA,aAAK,EAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CACT,cAAc,GAAG,CAAC,QAAQ,iBAAiB,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAC7E,CAAC;IACF,OAAO,GAAG,CAAC,QAAQ,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,YAAoB;IACxD,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAEpE,IAAI,qBAAqB,GACvB,MAAM,eAAK,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;QACrD,IAAI,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC;QAE9C,IAAI,OAAO,KAAK,sBAAsB,EAAE,CAAC;YACvC,eAAe,GAAG,IAAI,CAAC;YACvB,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;aAAM,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;YAC3C,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;aAAM,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;YACvC,mBAAmB;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,KAAK,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,eAAgC,EAChC,WAAwB,EACxB,MAAc,EACd,SAAiB,EACjB,cAA2B,EAC3B,UAAiB,EACjB,kBAAsC,EACtC,WAA+B;IAE/B,IAAI,QAAQ,GAAG,MAAM,cAAc,CACjC,eAAe,EACf,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAc,EACd,WAAW,CACZ,CAAC;IACF,IAAI,SAAS,GAAG,UAAU,CAAC;IAC3B,IACE,QAAQ,KAAK,WAAW;QACxB,SAAS,CAAC,YAAY;QACtB,WAAW,KAAK,yBAAW,CAAC,GAAG;QAC/B,SAAS,CAAC,cAAc;QACxB,kBAAkB,CAAC,+BAA+B,EAClD,CAAC;QACD,SAAS,GAAG,MAAM,IAAA,4BAAgB,EAChC,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,UAAU,CACrB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,eAAe,GAAG,MAAM,sBAAsB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3E,OAAO,eAAe,EAAE,CAAC;YACvB,QAAQ,GAAG,MAAM,cAAc,CAC7B,eAAe,EACf,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAc,EACd,WAAW,CACZ,CAAC;YACF,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;gBAC9B,MAAM;YACR,CAAC;YACD,SAAS,GAAG,MAAM,IAAA,4BAAgB,EAChC,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,UAAU,CACrB,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,eAAe,GAAG,MAAM,sBAAsB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAc,EACd,SAAiB,EACjB,cAA2B,EAC3B,WAA+B,EAC/B,IAAU;IAEV,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,WAAW,GAAW,oBAAU,CAAC,cAAc,CACnD,MAAM,EACN,SAAS,EACT,WAAW,EACX,KAAK,EACL,IAAI,CACL,CAAC;QACF,MAAM,IAAA,2BAAa,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACjD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CACrB,WAA0B,EAC1B,cAA2B;IAE3B,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CACT,oDAAoD,WAAW,KAAK,CACrE,CAAC;IACF,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACpC,OAAO,CAAC,GAAG,CACT,YAAY,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,IAC/D,CAAC,CAAC,MACJ,EAAE,CACH,CACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,cAA2B;IAClD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACpC,OAAO,CAAC,GAAG,CACT,YAAY,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,IAC/D,CAAC,CAAC,MACJ,MAAM,CAAC,CAAC,IAAI,EAAE,CACf,CACF,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CACZ,WAAgE;IAEhE,IACE,WAAW,CAAC,QAAQ,KAAK,SAAS;QAClC,WAAW,CAAC,QAAQ,KAAK,UAAU;QACnC,WAAW,CAAC,QAAQ,IAAI,eAAe,EACvC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;SAAM,IACL,WAAW,CAAC,QAAQ,KAAK,UAAU;QACnC,WAAW,CAAC,QAAQ,KAAK,YAAY,EACrC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,iCAAiC,WAAW,CAAC,QAAQ,qCAAqC,CAC3F,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAC1B,UAAsB,EACtB,WAAwB,EACxB,kBAAsC;IAEtC,IAAI,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GACZ,WAAW,KAAK,yBAAW,CAAC,GAAG;YAC7B,CAAC,CAAC,kBAAkB,CAAC,WAAW;YAChC,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC;QAExC,IAAI,QAAQ,IAAI,UAAU,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;YAC5C,OAAO,QAAQ,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAnBD,oCAmBC;AAED,SAAgB,aAAa,CAC3B,UAAsB,EACtB,WAAwB,EACxB,kBAAsC;IAEtC,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,SAAS,GACb,WAAW,KAAK,yBAAW,CAAC,GAAG;YAC7B,CAAC,CAAC,kBAAkB,CAAC,YAAY;YACjC,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC;QAEzC,IAAI,SAAS,IAAI,UAAU,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC/C,OAAO,SAAS,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,OAAO,UAAU,CAAC,MAAM,CAAC;QAC3B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAnBD,sCAmBC;AAEM,KAAK,UAAU,QAAQ,CAC5B,KAAY,EACZ,MAAc,EACd,UAAkB,EAClB,SAAiB,EACjB,kBAAsC,EACtC,UAAsB;IAEtB,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,aAAa,GAAG,MAAM,IAAA,2BAAe,EAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE1D,IAAI,KAAc,CAAC;IACnB,IAAI,iBAAyB,CAAC;IAC9B,IAAI,WAAiC,CAAC;IACtC,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACvB,KAAK,GAAG,IAAI,CAAC;QACb,WAAW,GAAG,UAAU,CAAC;QACzB,iBAAiB,GAAG,UAAU,CAAC;QAC/B,OAAO,CAAC,GAAG,CACT,wCAAwC,iBAAiB,qDAAqD,CAC/G,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,KAAK,CAAC;QACd,WAAW,GAAG,OAAO,CAAC;QACtB,iBAAiB,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,QAAQ,GACZ,WAAW,CAAC,YAAY,IAAI,IAAI,IAAI,WAAW,CAAC,YAAY,IAAI,SAAS,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAE7D,MAAM,UAAU,GAAG,MAAM,eAAK,CAAC,aAAa,EAAE,CAAC;IAE/C,IAAI,UAAU,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAA;IACrE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAE9E,MAAM,eAAe,GAAG,IAAI,yBAAe,CACzC,WAAW,EACX,WAAW,EACX,UAAU,CAAC,UAAU,EACrB,SAAS,EACT,UAAU,EACV,QAAQ,CACT,CAAC;IAEF,MAAM,cAAc,GAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAErD,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;IAE5B,MAAM,eAAe,CACnB,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,KAAK,EACL,kBAAkB,EAClB,UAAU,CAAC,eAAe,CAAC,WAAW,CACvC,CAAC;IAEF,OAAO,CAAC,GAAG,CACT,yCAAyC,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAC3E,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,WAAW,GAAG,MAAM,UAAU,CAClC,MAAM,EACN,SAAS,EACT,cAAc,EACd,UAAU,CAAC,eAAe,CAAC,WAAW,EACtC,QAAQ,CACT,CAAC;QACF,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,eAAe,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AA9FD,4BA8FC;AAoBM,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,MAAc,EACd,UAAkB,EAClB,iBAAoC,EACpC,kBAAsC,EACtC,IAAU;IAEV,IAAI,iBAAyB,CAAC;IAC9B,IAAI,WAAiC,CAAC;IACtC,IAAI,iBAAiB,CAAC,WAAW,EAAE,CAAC;QAClC,WAAW,GAAG,UAAU,CAAC;QACzB,iBAAiB,GAAG,UAAU,CAAC;QAC/B,OAAO,CAAC,GAAG,CACT,wCAAwC,iBAAiB,qDAAqD,CAC/G,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,OAAO,CAAC;QACtB,iBAAiB,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAC5B,iBAAiB,EACjB,yBAAW,CAAC,GAAG,EACf,kBAAkB,CACnB,CAAC;IACF,MAAM,UAAU,GAAG,aAAa,CAC9B,iBAAiB,EACjB,yBAAW,CAAC,GAAG,EACf,kBAAkB,CACnB,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,yBAAe,CACzC,yBAAW,CAAC,GAAG,EACf,WAAW,EACX,iBAAiB,CAAC,UAAU,EAC5B,SAAS,EACT,UAAU,EACV,iBAAiB,CAAC,QAAQ,CAC3B,CAAC;IAEF,MAAM,cAAc,GAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAErD,MAAM,cAAc,CAClB,eAAe,EACf,yBAAW,CAAC,GAAG,EACf,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,iBAAiB,CAAC,eAAe,CAAC,WAAW,CAC9C,CAAC;IAEF,OAAO,CAAC,GAAG,CACT,2CAA2C,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAC7E,CAAC;IAEF,IAAI,iBAAiB,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,UAAU,CAClC,MAAM,EACN,SAAS,EACT,cAAc,EACd,iBAAiB,CAAC,eAAe,CAAC,WAAW,EAC7C,IAAI,CACL,CAAC;QACF,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,eAAe,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AApED,kCAoEC;AAEM,KAAK,UAAU,aAAa,CACjC,eAAuB,EACvB,cAAsB;IAEtB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,OAAO,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,UAAU,GAAe,MAAM,eAAK,CAAC,aAAa,EAAE,CAAC;QACzD,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAA,aAAK,EAAC,eAAe,CAAC,CAAC;YAC7B,UAAU,GAAG,MAAM,eAAK,CAAC,aAAa,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAEjC,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,oBAAoB,GAAG,GAAG,CAAC;QACjC,OAAO,MAAM,IAAI,OAAO,GAAG,cAAc,EAAE,CAAC;YAC1C,MAAM,IAAA,aAAK,EAAC,oBAAoB,CAAC,CAAC;YAClC,UAAU,GAAG,MAAM,eAAK,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC/B,OAAO,IAAI,oBAAoB,CAAC;QAClC,CAAC;QAED,IAAI,MAAM,IAAI,OAAO,IAAI,cAAc,EAAE,CAAC;YACxC,KAAK,GAAG,IAAI,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AA9BD,sCA8BC","sourcesContent":["import Event from \"./Event\";\nimport WalkupScanDestination from \"./WalkupScanDestination\";\nimport WalkupScanToCompDestination from \"./WalkupScanToCompDestination\";\nimport HPApi from \"./HPApi\";\nimport fs from \"fs/promises\";\nimport JpegUtil from \"./JpegUtil\";\nimport { DeviceCapabilities } from \"./DeviceCapabilities\";\nimport { waitForScanEvent, waitScanRequest } from \"./listening\";\nimport ScanJobSettings from \"./ScanJobSettings\";\nimport { createPdfFrom, ScanContent, ScanPage } from \"./ScanContent\";\nimport Job from \"./Job\";\nimport { delay } from \"./delay\";\nimport PathHelper from \"./PathHelper\";\nimport ScanStatus from \"./ScanStatus\";\nimport { InputSource } from \"./InputSource\";\n\nasync function waitDeviceUntilItIsReadyToUploadOrCompleted(\n jobUrl: string,\n): Promise<Job> {\n let job = null;\n let isReadyToUpload = false;\n do {\n job = await HPApi.getJob(jobUrl);\n if (job.jobState === \"Canceled\") {\n return job;\n } else if (\n job.pageState === \"ReadyToUpload\" ||\n job.jobState === \"Completed\"\n ) {\n isReadyToUpload = true;\n } else if (job.jobState == \"Processing\") {\n isReadyToUpload = false;\n } else {\n console.log(`Unknown jobState: ${job.jobState}`);\n }\n await delay(300);\n } while (!isReadyToUpload);\n return job;\n}\n\nasync function TryGetDestination(\n event: Event,\n): Promise<WalkupScanDestination | WalkupScanToCompDestination | null> {\n //this code can in some cases be executed before the user actually chooses between Document or Photo\n //so lets fetch the contentType (Document or Photo) until we get a value\n let destination: WalkupScanDestination | WalkupScanToCompDestination | null =\n null;\n\n for (let i = 0; i < 20; i++) {\n const destinationURI = event.destinationURI;\n if (destinationURI) {\n destination = await HPApi.getDestination(destinationURI);\n\n const shortcut = destination.shortcut;\n if (shortcut != null) {\n return destination;\n }\n } else {\n console.log(`No destination URI found`);\n }\n\n console.log(`No shortcut yet available, attempt: ${i + 1}/20`);\n await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s\n }\n\n console.log(\"Failing to detect destination shortcut\");\n console.log(JSON.stringify(destination));\n return null;\n}\n\nasync function scanProcessing(filePath: string): Promise<number | null> {\n const buffer: Buffer = await fs.readFile(filePath);\n\n let height = JpegUtil.fixSizeWithDNL(buffer);\n if (height != null) {\n // rewrite the fixed file\n await fs.writeFile(filePath, buffer);\n return height;\n }\n return null;\n}\n\nfunction createScanPage(\n job: Job,\n currentPageNumber: number,\n filePath: string,\n sizeFixed: number | null,\n): ScanPage {\n let height = sizeFixed ?? job.imageHeight;\n return {\n path: filePath,\n pageNumber: currentPageNumber,\n width: job.imageWidth ?? 0,\n height: height ?? 0,\n xResolution: job.xResolution ?? 200,\n yResolution: job.yResolution ?? 200,\n };\n}\n\nasync function handleProcessingState(\n job: Job,\n inputSource: InputSource,\n folder: string,\n scanCount: number,\n currentPageNumber: number,\n filePattern: string | undefined,\n date: Date,\n): Promise<ScanPage | null> {\n if (\n job.pageState == \"ReadyToUpload\" &&\n job.binaryURL != null &&\n job.currentPageNumber != null\n ) {\n console.log(\n `Ready to download page job page ${job.currentPageNumber} at:`,\n job.binaryURL,\n );\n\n const destinationFilePath = PathHelper.getFileForPage(\n folder,\n scanCount,\n currentPageNumber,\n filePattern,\n \"jpg\",\n date,\n );\n const filePath = await HPApi.downloadPage(\n job.binaryURL,\n destinationFilePath,\n );\n console.log(\"Page downloaded to:\", filePath);\n\n let sizeFixed: null | number = null;\n if (inputSource == InputSource.Adf) {\n sizeFixed = await scanProcessing(filePath);\n if (sizeFixed == null) {\n console.log(\n `File size has not been fixed, DNF may not have been found and approximate height is: ${job.imageHeight}`,\n );\n }\n }\n return createScanPage(job, currentPageNumber, filePath, sizeFixed);\n } else {\n console.log(`Unknown pageState: ${job.pageState}`);\n await delay(200);\n return null;\n }\n}\n\nasync function executeScanJob(\n scanJobSettings: ScanJobSettings,\n inputSource: InputSource,\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n filePattern: string | undefined,\n): Promise<\"Completed\" | \"Canceled\"> {\n const jobUrl = await HPApi.postJob(scanJobSettings);\n\n console.log(\"New job created:\", jobUrl);\n\n let job = await HPApi.getJob(jobUrl);\n while (job.jobState !== \"Completed\") {\n job = await waitDeviceUntilItIsReadyToUploadOrCompleted(jobUrl);\n\n if (job.jobState == \"Completed\") {\n continue;\n }\n\n if (job.jobState === \"Processing\") {\n const page = await handleProcessingState(\n job,\n inputSource,\n folder,\n scanCount,\n scanJobContent.elements.length + 1,\n filePattern,\n new Date(),\n );\n job = await HPApi.getJob(jobUrl);\n if (page != null && job.jobState != \"Canceled\") {\n scanJobContent.elements.push(page);\n }\n } else if (job.jobState === \"Canceled\") {\n console.log(\"Job cancelled by device\");\n break;\n } else {\n console.log(`Unhandled jobState: ${job.jobState}`);\n await delay(200);\n }\n }\n console.log(\n `Job state: ${job.jobState}, totalPages: ${scanJobContent.elements.length}:`,\n );\n return job.jobState;\n}\n\nasync function waitScanNewPageRequest(compEventURI: string): Promise<boolean> {\n let startNewScanJob = false;\n let wait = true;\n while (wait) {\n await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s\n\n let walkupScanToCompEvent =\n await HPApi.getWalkupScanToCompEvent(compEventURI);\n let message = walkupScanToCompEvent.eventType;\n\n if (message === \"ScanNewPageRequested\") {\n startNewScanJob = true;\n wait = false;\n } else if (message === \"ScanPagesComplete\") {\n wait = false;\n } else if (message === \"ScanRequested\") {\n // continue waiting\n } else {\n wait = false;\n console.log(`Unknown eventType: ${message}`);\n }\n }\n return startNewScanJob;\n}\n\nasync function executeScanJobs(\n scanJobSettings: ScanJobSettings,\n inputSource: InputSource,\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n firstEvent: Event,\n deviceCapabilities: DeviceCapabilities,\n filePattern: string | undefined,\n) {\n let jobState = await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent,\n filePattern,\n );\n let lastEvent = firstEvent;\n if (\n jobState === \"Completed\" &&\n lastEvent.compEventURI &&\n inputSource !== InputSource.Adf &&\n lastEvent.destinationURI &&\n deviceCapabilities.supportsMultiItemScanFromPlaten\n ) {\n lastEvent = await waitForScanEvent(\n lastEvent.destinationURI,\n lastEvent.agingStamp,\n );\n if (!lastEvent.compEventURI) {\n return;\n }\n let startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);\n while (startNewScanJob) {\n jobState = await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent,\n filePattern,\n );\n if (jobState !== \"Completed\") {\n return;\n }\n if (!lastEvent.destinationURI) {\n break;\n }\n lastEvent = await waitForScanEvent(\n lastEvent.destinationURI,\n lastEvent.agingStamp,\n );\n if (!lastEvent.compEventURI) {\n return;\n }\n startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);\n }\n }\n}\n\nasync function mergeToPdf(\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n filePattern: string | undefined,\n date: Date,\n): Promise<string | null> {\n if (scanJobContent.elements.length > 0) {\n const pdfFilePath: string = PathHelper.getFileForScan(\n folder,\n scanCount,\n filePattern,\n \"pdf\",\n date,\n );\n await createPdfFrom(scanJobContent, pdfFilePath);\n scanJobContent.elements.forEach((e) => fs.unlink(e.path));\n return pdfFilePath;\n }\n console.log(`No page available to build a pdf file`);\n return null;\n}\n\nfunction displayPdfScan(\n pdfFilePath: string | null,\n scanJobContent: ScanContent,\n) {\n if (pdfFilePath === null) {\n console.log(`Pdf generated has not been generated`);\n return;\n }\n console.log(\n `The following page(s) have been rendered inside '${pdfFilePath}': `,\n );\n scanJobContent.elements.forEach((e) =>\n console.log(\n `\\t- page ${e.pageNumber.toString().padStart(3, \" \")} - ${e.width}x${\n e.height\n }`,\n ),\n );\n}\n\nfunction displayJpegScan(scanJobContent: ScanContent) {\n scanJobContent.elements.forEach((e) =>\n console.log(\n `\\t- page ${e.pageNumber.toString().padStart(3, \" \")} - ${e.width}x${\n e.height\n } - ${e.path}`,\n ),\n );\n}\n\nfunction isPdf(\n destination: WalkupScanDestination | WalkupScanToCompDestination,\n) {\n if (\n destination.shortcut === \"SavePDF\" ||\n destination.shortcut === \"EmailPDF\" ||\n destination.shortcut == \"SaveDocument1\"\n ) {\n return true;\n } else if (\n destination.shortcut === \"SaveJPEG\" ||\n destination.shortcut === \"SavePhoto1\"\n ) {\n return false;\n } else {\n console.log(\n `Unexpected shortcut received: ${destination.shortcut}, considering it as non pdf target!`,\n );\n return false;\n }\n}\n\nexport function getScanWidth(\n scanConfig: ScanConfig,\n inputSource: InputSource,\n deviceCapabilities: DeviceCapabilities,\n) {\n if (scanConfig.width && scanConfig.width > 0) {\n const maxWidth =\n inputSource === InputSource.Adf\n ? deviceCapabilities.adfMaxWidth\n : deviceCapabilities.platenMaxWidth;\n\n if (maxWidth && scanConfig.width > maxWidth) {\n return maxWidth;\n } else {\n return scanConfig.width;\n }\n } else {\n return null;\n }\n}\n\nexport function getScanHeight(\n scanConfig: ScanConfig,\n inputSource: InputSource,\n deviceCapabilities: DeviceCapabilities,\n) {\n if (scanConfig.height && scanConfig.height > 0) {\n const maxHeight =\n inputSource === InputSource.Adf\n ? deviceCapabilities.adfMaxHeight\n : deviceCapabilities.platenMaxHeight;\n\n if (maxHeight && scanConfig.height > maxHeight) {\n return maxHeight;\n } else {\n return scanConfig.height;\n }\n } else {\n return null;\n }\n}\n\nexport async function saveScan(\n event: Event,\n folder: string,\n tempFolder: string,\n scanCount: number,\n deviceCapabilities: DeviceCapabilities,\n scanConfig: ScanConfig,\n): Promise<void> {\n if (event.compEventURI) {\n const proceedToScan = await waitScanRequest(event.compEventURI);\n if (!proceedToScan) {\n return;\n }\n }\n\n const destination = await TryGetDestination(event);\n if (!destination) {\n console.log(\"No shortcut selected!\");\n return;\n }\n console.log(\"Selected shortcut: \" + destination.shortcut);\n\n let toPdf: boolean;\n let destinationFolder: string;\n let contentType: \"Document\" | \"Photo\";\n if (isPdf(destination)) {\n toPdf = true;\n contentType = \"Document\";\n destinationFolder = tempFolder;\n console.log(\n `Scan will be converted to pdf, using ${destinationFolder} as temp scan output directory for individual pages`,\n );\n } else {\n toPdf = false;\n contentType = \"Photo\";\n destinationFolder = folder;\n }\n\n const isDuplex =\n destination.scanPlexMode != null && destination.scanPlexMode != \"Simplex\";\n console.log(\"ScanPlexMode is : \" + destination.scanPlexMode);\n\n const scanStatus = await HPApi.getScanStatus();\n\n if (scanStatus.scannerState !== \"Idle\") {\n console.log(\"Scanner state is not Idle, aborting scan attempt...!\")\n }\n\n console.log(\"Afd is : \" + scanStatus.adfState);\n\n const inputSource = scanStatus.getInputSource();\n const scanWidth = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n const scanHeight = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n\n const scanJobSettings = new ScanJobSettings(\n inputSource,\n contentType,\n scanConfig.resolution,\n scanWidth,\n scanHeight,\n isDuplex,\n );\n\n const scanJobContent: ScanContent = { elements: [] };\n\n const scanDate = new Date();\n\n await executeScanJobs(\n scanJobSettings,\n inputSource,\n destinationFolder,\n scanCount,\n scanJobContent,\n event,\n deviceCapabilities,\n scanConfig.directoryConfig.filePattern,\n );\n\n console.log(\n `Scan of page(s) completed totalPages: ${scanJobContent.elements.length}:`,\n );\n\n if (toPdf) {\n const pdfFilePath = await mergeToPdf(\n folder,\n scanCount,\n scanJobContent,\n scanConfig.directoryConfig.filePattern,\n scanDate,\n );\n displayPdfScan(pdfFilePath, scanJobContent);\n } else {\n displayJpegScan(scanJobContent);\n }\n}\n\nexport type DirectoryConfig = {\n directory: string | undefined;\n tempDirectory: string | undefined;\n filePattern: string | undefined;\n};\nexport type ScanConfig = {\n resolution: number;\n width: number | null;\n height: number | null;\n directoryConfig: DirectoryConfig;\n};\nexport type AdfAutoScanConfig = ScanConfig & {\n isDuplex: boolean;\n generatePdf: boolean;\n pollingInterval: number;\n startScanDelay: number;\n};\n\nexport async function scanFromAdf(\n scanCount: number,\n folder: string,\n tempFolder: string,\n adfAutoScanConfig: AdfAutoScanConfig,\n deviceCapabilities: DeviceCapabilities,\n date: Date,\n) {\n let destinationFolder: string;\n let contentType: \"Document\" | \"Photo\";\n if (adfAutoScanConfig.generatePdf) {\n contentType = \"Document\";\n destinationFolder = tempFolder;\n console.log(\n `Scan will be converted to pdf, using ${destinationFolder} as temp scan output directory for individual pages`,\n );\n } else {\n contentType = \"Photo\";\n destinationFolder = folder;\n }\n\n const scanWidth = getScanWidth(\n adfAutoScanConfig,\n InputSource.Adf,\n deviceCapabilities,\n );\n const scanHeight = getScanHeight(\n adfAutoScanConfig,\n InputSource.Adf,\n deviceCapabilities,\n );\n\n const scanJobSettings = new ScanJobSettings(\n InputSource.Adf,\n contentType,\n adfAutoScanConfig.resolution,\n scanWidth,\n scanHeight,\n adfAutoScanConfig.isDuplex,\n );\n\n const scanJobContent: ScanContent = { elements: [] };\n\n await executeScanJob(\n scanJobSettings,\n InputSource.Adf,\n destinationFolder,\n scanCount,\n scanJobContent,\n adfAutoScanConfig.directoryConfig.filePattern,\n );\n\n console.log(\n `Scan of page(s) completed, total pages: ${scanJobContent.elements.length}:`,\n );\n\n if (adfAutoScanConfig.generatePdf) {\n const pdfFilePath = await mergeToPdf(\n folder,\n scanCount,\n scanJobContent,\n adfAutoScanConfig.directoryConfig.filePattern,\n date,\n );\n displayPdfScan(pdfFilePath, scanJobContent);\n } else {\n displayJpegScan(scanJobContent);\n }\n}\n\nexport async function waitAdfLoaded(\n pollingInterval: number,\n startScanDelay: number,\n) {\n let ready = false;\n while (!ready) {\n let scanStatus: ScanStatus = await HPApi.getScanStatus();\n while (!scanStatus.isLoaded()) {\n await delay(pollingInterval);\n scanStatus = await HPApi.getScanStatus();\n }\n console.log(`ADF load detected`);\n\n let loaded = true;\n let counter = 0;\n const shortPollingInterval = 500;\n while (loaded && counter < startScanDelay) {\n await delay(shortPollingInterval);\n scanStatus = await HPApi.getScanStatus();\n loaded = scanStatus.isLoaded();\n counter += shortPollingInterval;\n }\n\n if (loaded && counter >= startScanDelay) {\n ready = true;\n console.log(`ADF still loaded, proceeding`);\n } else {\n console.log(`ADF not loaded anymore, waiting...`);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"scanProcessing.js","sourceRoot":"","sources":["../src/scanProcessing.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"./Event\";\nimport WalkupScanDestination from \"./WalkupScanDestination\";\nimport WalkupScanToCompDestination from \"./WalkupScanToCompDestination\";\nimport HPApi from \"./HPApi\";\nimport fs from \"fs/promises\";\nimport JpegUtil from \"./JpegUtil\";\nimport { DeviceCapabilities } from \"./DeviceCapabilities\";\nimport { waitForScanEvent, waitScanRequest } from \"./listening\";\nimport ScanJobSettings from \"./ScanJobSettings\";\nimport { ScanContent, ScanPage } from \"./ScanContent\";\nimport Job from \"./Job\";\nimport { delay } from \"./delay\";\nimport PathHelper from \"./PathHelper\";\nimport ScanStatus from \"./ScanStatus\";\nimport { InputSource } from \"./InputSource\";\nimport { PaperlessConfig } from \"./paperless/PaperlessConfig\";\nimport { postProcessing } from \"./postProcessing\";\n\nasync function waitDeviceUntilItIsReadyToUploadOrCompleted(\n jobUrl: string,\n): Promise<Job> {\n let job = null;\n let isReadyToUpload = false;\n do {\n job = await HPApi.getJob(jobUrl);\n if (job.jobState === \"Canceled\") {\n return job;\n } else if (\n job.pageState === \"ReadyToUpload\" ||\n job.jobState === \"Completed\"\n ) {\n isReadyToUpload = true;\n } else if (job.jobState == \"Processing\") {\n isReadyToUpload = false;\n } else {\n console.log(`Unknown jobState: ${job.jobState}`);\n }\n await delay(300);\n } while (!isReadyToUpload);\n return job;\n}\n\nasync function tryGetDestination(\n event: Event,\n): Promise<WalkupScanDestination | WalkupScanToCompDestination | null> {\n //this code can in some cases be executed before the user actually chooses between Document or Photo\n //so lets fetch the contentType (Document or Photo) until we get a value\n let destination: WalkupScanDestination | WalkupScanToCompDestination | null =\n null;\n\n for (let i = 0; i < 20; i++) {\n const destinationURI = event.destinationURI;\n if (destinationURI) {\n destination = await HPApi.getDestination(destinationURI);\n\n const shortcut = destination.shortcut;\n if (shortcut != null) {\n return destination;\n }\n } else {\n console.log(`No destination URI found`);\n }\n\n console.log(`No shortcut yet available, attempt: ${i + 1}/20`);\n await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s\n }\n\n console.log(\"Failing to detect destination shortcut\");\n console.log(JSON.stringify(destination));\n return null;\n}\n\nasync function scanProcessing(filePath: string): Promise<number | null> {\n const buffer: Buffer = await fs.readFile(filePath);\n\n const height = JpegUtil.fixSizeWithDNL(buffer);\n if (height != null) {\n // rewrite the fixed file\n await fs.writeFile(filePath, buffer);\n return height;\n }\n return null;\n}\n\nfunction createScanPage(\n job: Job,\n currentPageNumber: number,\n filePath: string,\n sizeFixed: number | null,\n): ScanPage {\n const height = sizeFixed ?? job.imageHeight;\n return {\n path: filePath,\n pageNumber: currentPageNumber,\n width: job.imageWidth ?? 0,\n height: height ?? 0,\n xResolution: job.xResolution ?? 200,\n yResolution: job.yResolution ?? 200,\n };\n}\n\nasync function handleScanProcessingState(\n job: Job,\n inputSource: InputSource,\n folder: string,\n scanCount: number,\n currentPageNumber: number,\n filePattern: string | undefined,\n date: Date,\n): Promise<ScanPage | null> {\n if (\n job.pageState == \"ReadyToUpload\" &&\n job.binaryURL != null &&\n job.currentPageNumber != null\n ) {\n console.log(\n `Ready to download page job page ${job.currentPageNumber} at:`,\n job.binaryURL,\n );\n\n const destinationFilePath = PathHelper.getFileForPage(\n folder,\n scanCount,\n currentPageNumber,\n filePattern,\n \"jpg\",\n date,\n );\n const filePath = await HPApi.downloadPage(\n job.binaryURL,\n destinationFilePath,\n );\n console.log(\"Page downloaded to:\", filePath);\n\n let sizeFixed: null | number = null;\n if (inputSource == InputSource.Adf) {\n sizeFixed = await scanProcessing(filePath);\n if (sizeFixed == null) {\n console.log(\n `File size has not been fixed, DNF may not have been found and approximate height is: ${job.imageHeight}`,\n );\n }\n }\n return createScanPage(job, currentPageNumber, filePath, sizeFixed);\n } else {\n console.log(`Unknown pageState: ${job.pageState}`);\n await delay(200);\n return null;\n }\n}\n\nasync function executeScanJob(\n scanJobSettings: ScanJobSettings,\n inputSource: InputSource,\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n filePattern: string | undefined,\n): Promise<\"Completed\" | \"Canceled\"> {\n const jobUrl = await HPApi.postJob(scanJobSettings);\n\n console.log(\"New job created:\", jobUrl);\n\n let job = await HPApi.getJob(jobUrl);\n while (job.jobState !== \"Completed\") {\n job = await waitDeviceUntilItIsReadyToUploadOrCompleted(jobUrl);\n\n if (job.jobState == \"Completed\") {\n continue;\n }\n\n if (job.jobState === \"Processing\") {\n const page = await handleScanProcessingState(\n job,\n inputSource,\n folder,\n scanCount,\n scanJobContent.elements.length + 1,\n filePattern,\n new Date(),\n );\n job = await HPApi.getJob(jobUrl);\n if (page != null && job.jobState != \"Canceled\") {\n scanJobContent.elements.push(page);\n }\n } else if (job.jobState === \"Canceled\") {\n console.log(\"Job cancelled by device\");\n break;\n } else {\n console.log(`Unhandled jobState: ${job.jobState}`);\n await delay(200);\n }\n }\n console.log(\n `Job state: ${job.jobState}, totalPages: ${scanJobContent.elements.length}:`,\n );\n return job.jobState;\n}\n\nasync function waitScanNewPageRequest(compEventURI: string): Promise<boolean> {\n let startNewScanJob = false;\n let wait = true;\n while (wait) {\n await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s\n\n const walkupScanToCompEvent =\n await HPApi.getWalkupScanToCompEvent(compEventURI);\n const message = walkupScanToCompEvent.eventType;\n\n if (message === \"ScanNewPageRequested\") {\n startNewScanJob = true;\n wait = false;\n } else if (message === \"ScanPagesComplete\") {\n wait = false;\n } else if (message === \"ScanRequested\") {\n // continue waiting\n } else {\n wait = false;\n console.log(`Unknown eventType: ${message}`);\n }\n }\n return startNewScanJob;\n}\n\nasync function executeScanJobs(\n scanJobSettings: ScanJobSettings,\n inputSource: InputSource,\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n firstEvent: Event,\n deviceCapabilities: DeviceCapabilities,\n filePattern: string | undefined,\n) {\n let jobState = await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent,\n filePattern,\n );\n let lastEvent = firstEvent;\n if (\n jobState === \"Completed\" &&\n lastEvent.compEventURI &&\n inputSource !== InputSource.Adf &&\n lastEvent.destinationURI &&\n deviceCapabilities.supportsMultiItemScanFromPlaten\n ) {\n lastEvent = await waitForScanEvent(\n lastEvent.destinationURI,\n lastEvent.agingStamp,\n );\n if (!lastEvent.compEventURI) {\n return;\n }\n let startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);\n while (startNewScanJob) {\n jobState = await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent,\n filePattern,\n );\n if (jobState !== \"Completed\") {\n return;\n }\n if (!lastEvent.destinationURI) {\n break;\n }\n lastEvent = await waitForScanEvent(\n lastEvent.destinationURI,\n lastEvent.agingStamp,\n );\n if (!lastEvent.compEventURI) {\n return;\n }\n startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);\n }\n }\n}\n\nfunction isPdf(\n destination: WalkupScanDestination | WalkupScanToCompDestination,\n) {\n if (\n destination.shortcut === \"SavePDF\" ||\n destination.shortcut === \"EmailPDF\" ||\n destination.shortcut == \"SaveDocument1\"\n ) {\n return true;\n } else if (\n destination.shortcut === \"SaveJPEG\" ||\n destination.shortcut === \"SavePhoto1\"\n ) {\n return false;\n } else {\n console.log(\n `Unexpected shortcut received: ${destination.shortcut}, considering it as non pdf target!`,\n );\n return false;\n }\n}\n\nexport function getScanWidth(\n scanConfig: ScanConfig,\n inputSource: InputSource,\n deviceCapabilities: DeviceCapabilities,\n): number | null {\n if (scanConfig.width && scanConfig.width > 0) {\n const maxWidth =\n inputSource === InputSource.Adf\n ? deviceCapabilities.adfMaxWidth\n : deviceCapabilities.platenMaxWidth;\n\n if (maxWidth && scanConfig.width > maxWidth) {\n return maxWidth;\n } else {\n return scanConfig.width;\n }\n } else {\n return inputSource === InputSource.Adf\n ? deviceCapabilities.adfMaxWidth\n : deviceCapabilities.platenMaxWidth;\n }\n}\n\nexport function getScanHeight(\n scanConfig: ScanConfig,\n inputSource: InputSource,\n deviceCapabilities: DeviceCapabilities,\n): number | null {\n if (scanConfig.height && scanConfig.height > 0) {\n const maxHeight =\n inputSource === InputSource.Adf\n ? deviceCapabilities.adfMaxHeight\n : deviceCapabilities.platenMaxHeight;\n\n if (maxHeight && scanConfig.height > maxHeight) {\n return maxHeight;\n } else {\n return scanConfig.height;\n }\n } else {\n return inputSource === InputSource.Adf\n ? deviceCapabilities.adfMaxHeight\n : deviceCapabilities.platenMaxHeight;\n }\n}\n\nexport async function saveScanFromEvent(\n event: Event,\n folder: string,\n tempFolder: string,\n scanCount: number,\n deviceCapabilities: DeviceCapabilities,\n scanConfig: ScanConfig,\n): Promise<void> {\n if (event.compEventURI) {\n const proceedToScan = await waitScanRequest(event.compEventURI);\n if (!proceedToScan) {\n return;\n }\n }\n\n const destination = await tryGetDestination(event);\n if (!destination) {\n console.log(\"No shortcut selected!\");\n return;\n }\n console.log(\"Selected shortcut: \" + destination.shortcut);\n\n let toPdf: boolean;\n let destinationFolder: string;\n let contentType: \"Document\" | \"Photo\";\n if (isPdf(destination)) {\n toPdf = true;\n contentType = \"Document\";\n destinationFolder = tempFolder;\n console.log(\n `Scan will be converted to pdf, using ${destinationFolder} as temp scan output directory for individual pages`,\n );\n } else {\n toPdf = false;\n contentType = \"Photo\";\n destinationFolder = folder;\n }\n\n const isDuplex =\n destination.scanPlexMode != null && destination.scanPlexMode != \"Simplex\";\n console.log(\"ScanPlexMode is : \" + destination.scanPlexMode);\n\n const scanStatus = await HPApi.getScanStatus();\n\n if (scanStatus.scannerState !== \"Idle\") {\n console.log(\"Scanner state is not Idle, aborting scan attempt...!\");\n }\n\n console.log(\"Afd is : \" + scanStatus.adfState);\n\n const inputSource = scanStatus.getInputSource();\n const scanWidth = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n const scanHeight = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n\n const scanJobSettings = new ScanJobSettings(\n inputSource,\n contentType,\n scanConfig.resolution,\n scanWidth,\n scanHeight,\n isDuplex,\n );\n\n const scanJobContent: ScanContent = { elements: [] };\n\n const scanDate = new Date();\n\n await executeScanJobs(\n scanJobSettings,\n inputSource,\n destinationFolder,\n scanCount,\n scanJobContent,\n event,\n deviceCapabilities,\n scanConfig.directoryConfig.filePattern,\n );\n\n console.log(\n `Scan of page(s) completed totalPages: ${scanJobContent.elements.length}:`,\n );\n await postProcessing(\n scanConfig,\n folder,\n tempFolder,\n scanCount,\n scanJobContent,\n scanDate,\n toPdf,\n );\n}\n\nexport type DirectoryConfig = {\n directory: string | undefined;\n tempDirectory: string | undefined;\n filePattern: string | undefined;\n};\n\nexport type ScanConfig = {\n resolution: number;\n width: number | null;\n height: number | null;\n directoryConfig: DirectoryConfig;\n paperlessConfig: PaperlessConfig | undefined;\n};\nexport type AdfAutoScanConfig = ScanConfig & {\n isDuplex: boolean;\n generatePdf: boolean;\n pollingInterval: number;\n startScanDelay: number;\n};\n\nexport type SingleScanConfig = ScanConfig & {\n isDuplex: boolean;\n generatePdf: boolean;\n};\n\nexport async function scanFromAdf(\n scanCount: number,\n folder: string,\n tempFolder: string,\n adfAutoScanConfig: AdfAutoScanConfig,\n deviceCapabilities: DeviceCapabilities,\n date: Date,\n) {\n let destinationFolder: string;\n let contentType: \"Document\" | \"Photo\";\n if (adfAutoScanConfig.generatePdf) {\n contentType = \"Document\";\n destinationFolder = tempFolder;\n console.log(\n `Scan will be converted to pdf, using ${destinationFolder} as temp scan output directory for individual pages`,\n );\n } else {\n contentType = \"Photo\";\n destinationFolder = folder;\n }\n\n const scanWidth = getScanWidth(\n adfAutoScanConfig,\n InputSource.Adf,\n deviceCapabilities,\n );\n const scanHeight = getScanHeight(\n adfAutoScanConfig,\n InputSource.Adf,\n deviceCapabilities,\n );\n\n const scanJobSettings = new ScanJobSettings(\n InputSource.Adf,\n contentType,\n adfAutoScanConfig.resolution,\n scanWidth,\n scanHeight,\n adfAutoScanConfig.isDuplex,\n );\n\n const scanJobContent: ScanContent = { elements: [] };\n\n await executeScanJob(\n scanJobSettings,\n InputSource.Adf,\n destinationFolder,\n scanCount,\n scanJobContent,\n adfAutoScanConfig.directoryConfig.filePattern,\n );\n\n console.log(\n `Scan of page(s) completed, total pages: ${scanJobContent.elements.length}:`,\n );\n\n await postProcessing(\n adfAutoScanConfig,\n folder,\n tempFolder,\n scanCount,\n scanJobContent,\n date,\n adfAutoScanConfig.generatePdf,\n );\n}\n\nexport async function waitAdfLoaded(\n pollingInterval: number,\n startScanDelay: number,\n) {\n let ready = false;\n while (!ready) {\n let scanStatus: ScanStatus = await HPApi.getScanStatus();\n while (!scanStatus.isLoaded()) {\n await delay(pollingInterval);\n scanStatus = await HPApi.getScanStatus();\n }\n console.log(`ADF load detected`);\n\n let loaded = true;\n let counter = 0;\n const shortPollingInterval = 500;\n while (loaded && counter < startScanDelay) {\n await delay(shortPollingInterval);\n scanStatus = await HPApi.getScanStatus();\n loaded = scanStatus.isLoaded();\n counter += shortPollingInterval;\n }\n\n if (loaded && counter >= startScanDelay) {\n ready = true;\n console.log(`ADF still loaded, proceeding`);\n } else {\n console.log(`ADF not loaded anymore, waiting...`);\n }\n }\n}\n"]}
@@ -74,7 +74,7 @@ const now = new Date();
74
74
  });
75
75
  it("return another two conflict", async () => {
76
76
  const folder = await PathHelper_1.default.getOutputFolder();
77
- let filePath = path_1.default.join(folder, "someFolder.pdf");
77
+ const filePath = path_1.default.join(folder, "someFolder.pdf");
78
78
  fs_1.default.openSync(filePath, "w");
79
79
  const another = PathHelper_1.default.makeUnique(filePath, now);
80
80
  fs_1.default.openSync(another, "w");
@@ -84,7 +84,7 @@ const now = new Date();
84
84
  });
85
85
  it("conflict resolution terminate with error", async () => {
86
86
  const folder = await PathHelper_1.default.getOutputFolder();
87
- let filePath = path_1.default.join(folder, "someFolder.pdf");
87
+ const filePath = path_1.default.join(folder, "someFolder.pdf");
88
88
  fs_1.default.openSync(filePath, "w");
89
89
  (0, chai_1.expect)(() => {
90
90
  for (let i = 0; i < 50; ++i) {
@@ -1 +1 @@
1
- {"version":3,"file":"PathHelper.test.js","sourceRoot":"","sources":["../../test/PathHelper.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from \"mocha\";\nimport { expect } from \"chai\";\nimport chai from \"chai\";\nimport chaiString from \"chai-string\";\nimport PathHelper from \"../src/PathHelper\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nchai.use(chaiString);\n\nconst now: Date = new Date();\n\ndescribe(\"PathHelper\", () => {\n describe(\"getFileForPage\", () => {\n it(\"Can format a file with formatted timestamp\", async () => {\n const nextFileName = PathHelper.getFileForPage(\n \"someFolder\",\n 2,\n 1,\n '\"scan\"_dd.mm.yyyy_HH:MM:ss',\n \"jpg\",\n now,\n );\n expect(nextFileName).to.be.eq(\n `someFolder${path.sep}scan_${(\"\" + now.getDate()).padStart(2, \"0\")}.${(\n \"\" +\n (now.getMonth() + 1)\n ).padStart(2, \"0\")}.${(\"\" + now.getFullYear()).padStart(4, \"0\")}_${(\n \"\" + now.getHours()\n ).padStart(2, \"0\")}:${(\"\" + now.getMinutes()).padStart(2, \"0\")}:${(\n \"\" + now.getSeconds()\n ).padStart(2, \"0\")}.jpg`,\n );\n });\n it(\"Can format a file based on scan count and page number\", async () => {\n const nextFileName = PathHelper.getFileForPage(\n \"someFolder\",\n 2,\n 1,\n undefined,\n \"jpg\",\n now,\n );\n expect(nextFileName).to.be.eq(`someFolder${path.sep}scan2_page1.jpg`);\n });\n });\n describe(\"getFileForScan\", () => {\n it(\"Can format a file with formatted timestamp\", async () => {\n const nextFileName = PathHelper.getFileForScan(\n \"someFolder\",\n 2,\n '\"scan\"_dd.mm.yyyy_HH:MM:ss',\n \"pdf\",\n now,\n );\n expect(nextFileName).to.be.eq(\n `someFolder${path.sep}scan_${(\"\" + now.getDate()).padStart(2, \"0\")}.${(\n \"\" +\n (now.getMonth() + 1)\n ).padStart(2, \"0\")}.${(\"\" + now.getFullYear()).padStart(4, \"0\")}_${(\n \"\" + now.getHours()\n ).padStart(2, \"0\")}:${(\"\" + now.getMinutes()).padStart(2, \"0\")}:${(\n \"\" + now.getSeconds()\n ).padStart(2, \"0\")}.pdf`,\n );\n });\n it(\"Can format a file based on scan count and page number\", async () => {\n const nextFileName = PathHelper.getFileForScan(\n \"someFolder\",\n 2,\n undefined,\n \"pdf\",\n now,\n );\n expect(nextFileName).to.be.eq(`someFolder${path.sep}scan2.pdf`);\n });\n });\n describe(\"getOutputFolder\", () => {\n describe(\"A folder given\", () => {\n it(\"it is returned\", async () => {\n const folder = await PathHelper.getOutputFolder(\"someFolder\");\n expect(folder).to.be.eq(\"someFolder\");\n });\n });\n describe(\"No folder given\", () => {\n it(\"it return a temp folder\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(folder).to.startWith(os.tmpdir());\n });\n it(\"it return a folder that exist\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(fs.existsSync(folder)).to.be.true;\n });\n it(\"it return a different folder for every call\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(folder).to.be.not.eq(await PathHelper.getOutputFolder());\n });\n });\n });\n describe(\"makeUnique\", () => {\n it(\"return the file if it does not exist first\", async () => {\n const folder = await PathHelper.getOutputFolder();\n const filePath = path.join(folder, \"someFolder.pdf\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.eq(uniqueFile);\n });\n\n it(\"return another file in case of conflict\", async () => {\n const folder = await PathHelper.getOutputFolder();\n const filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.not.eq(uniqueFile);\n });\n\n it(\"return another two conflict\", async () => {\n const folder = await PathHelper.getOutputFolder();\n let filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n const another = PathHelper.makeUnique(filePath, now);\n fs.openSync(another, \"w\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.not.eq(uniqueFile);\n expect(another).to.be.not.eq(uniqueFile);\n });\n\n it(\"conflict resolution terminate with error\", async () => {\n const folder = await PathHelper.getOutputFolder();\n let filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n\n expect(() => {\n for (let i = 0; i < 50; ++i) {\n const another = PathHelper.makeUnique(filePath, now);\n fs.openSync(another, \"w\");\n }\n }).to.throw(/Can not create unique file:/);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"PathHelper.test.js","sourceRoot":"","sources":["../../test/PathHelper.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from \"mocha\";\nimport { expect } from \"chai\";\nimport chai from \"chai\";\nimport chaiString from \"chai-string\";\nimport PathHelper from \"../src/PathHelper\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nchai.use(chaiString);\n\nconst now: Date = new Date();\n\ndescribe(\"PathHelper\", () => {\n describe(\"getFileForPage\", () => {\n it(\"Can format a file with formatted timestamp\", async () => {\n const nextFileName = PathHelper.getFileForPage(\n \"someFolder\",\n 2,\n 1,\n '\"scan\"_dd.mm.yyyy_HH:MM:ss',\n \"jpg\",\n now,\n );\n expect(nextFileName).to.be.eq(\n `someFolder${path.sep}scan_${(\"\" + now.getDate()).padStart(2, \"0\")}.${(\n \"\" +\n (now.getMonth() + 1)\n ).padStart(2, \"0\")}.${(\"\" + now.getFullYear()).padStart(4, \"0\")}_${(\n \"\" + now.getHours()\n ).padStart(2, \"0\")}:${(\"\" + now.getMinutes()).padStart(2, \"0\")}:${(\n \"\" + now.getSeconds()\n ).padStart(2, \"0\")}.jpg`,\n );\n });\n it(\"Can format a file based on scan count and page number\", async () => {\n const nextFileName = PathHelper.getFileForPage(\n \"someFolder\",\n 2,\n 1,\n undefined,\n \"jpg\",\n now,\n );\n expect(nextFileName).to.be.eq(`someFolder${path.sep}scan2_page1.jpg`);\n });\n });\n describe(\"getFileForScan\", () => {\n it(\"Can format a file with formatted timestamp\", async () => {\n const nextFileName = PathHelper.getFileForScan(\n \"someFolder\",\n 2,\n '\"scan\"_dd.mm.yyyy_HH:MM:ss',\n \"pdf\",\n now,\n );\n expect(nextFileName).to.be.eq(\n `someFolder${path.sep}scan_${(\"\" + now.getDate()).padStart(2, \"0\")}.${(\n \"\" +\n (now.getMonth() + 1)\n ).padStart(2, \"0\")}.${(\"\" + now.getFullYear()).padStart(4, \"0\")}_${(\n \"\" + now.getHours()\n ).padStart(2, \"0\")}:${(\"\" + now.getMinutes()).padStart(2, \"0\")}:${(\n \"\" + now.getSeconds()\n ).padStart(2, \"0\")}.pdf`,\n );\n });\n it(\"Can format a file based on scan count and page number\", async () => {\n const nextFileName = PathHelper.getFileForScan(\n \"someFolder\",\n 2,\n undefined,\n \"pdf\",\n now,\n );\n expect(nextFileName).to.be.eq(`someFolder${path.sep}scan2.pdf`);\n });\n });\n describe(\"getOutputFolder\", () => {\n describe(\"A folder given\", () => {\n it(\"it is returned\", async () => {\n const folder = await PathHelper.getOutputFolder(\"someFolder\");\n expect(folder).to.be.eq(\"someFolder\");\n });\n });\n describe(\"No folder given\", () => {\n it(\"it return a temp folder\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(folder).to.startWith(os.tmpdir());\n });\n it(\"it return a folder that exist\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(fs.existsSync(folder)).to.be.true;\n });\n it(\"it return a different folder for every call\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(folder).to.be.not.eq(await PathHelper.getOutputFolder());\n });\n });\n });\n describe(\"makeUnique\", () => {\n it(\"return the file if it does not exist first\", async () => {\n const folder = await PathHelper.getOutputFolder();\n const filePath = path.join(folder, \"someFolder.pdf\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.eq(uniqueFile);\n });\n\n it(\"return another file in case of conflict\", async () => {\n const folder = await PathHelper.getOutputFolder();\n const filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.not.eq(uniqueFile);\n });\n\n it(\"return another two conflict\", async () => {\n const folder = await PathHelper.getOutputFolder();\n const filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n const another = PathHelper.makeUnique(filePath, now);\n fs.openSync(another, \"w\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.not.eq(uniqueFile);\n expect(another).to.be.not.eq(uniqueFile);\n });\n\n it(\"conflict resolution terminate with error\", async () => {\n const folder = await PathHelper.getOutputFolder();\n const filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n\n expect(() => {\n for (let i = 0; i < 50; ++i) {\n const another = PathHelper.makeUnique(filePath, now);\n fs.openSync(another, \"w\");\n }\n }).to.throw(/Can not create unique file:/);\n });\n });\n});\n"]}
@@ -72,5 +72,25 @@ const ScanCaps_1 = __importDefault(require("../src/ScanCaps"));
72
72
  (0, chai_1.expect)(scanCaps.platenMaxHeight).to.be.eq(3508);
73
73
  });
74
74
  });
75
+ (0, mocha_1.describe)("Parsing ScanCaps_only_adf.xml", async () => {
76
+ let scanCaps;
77
+ before(async () => {
78
+ const content = await fs.readFile(path_1.default.resolve(__dirname, "./asset/ScanCaps_only_adf.xml"), { encoding: "utf8" } //
79
+ );
80
+ scanCaps = await ScanCaps_1.default.createScanCaps(content);
81
+ });
82
+ it("AdfMaxWidth", async () => {
83
+ (0, chai_1.expect)(scanCaps.adfMaxWidth).to.be.eq(2550);
84
+ });
85
+ it("AdfMaxHeight", async () => {
86
+ (0, chai_1.expect)(scanCaps.adfMaxHeight).to.be.eq(5100);
87
+ });
88
+ it("PlatenMaxWidth", async () => {
89
+ (0, chai_1.expect)(scanCaps.platenMaxWidth).to.be.eq(null);
90
+ });
91
+ it("PlatenMaxHeight", async () => {
92
+ (0, chai_1.expect)(scanCaps.platenMaxHeight).to.be.eq(null);
93
+ });
94
+ });
75
95
  });
76
96
  //# sourceMappingURL=ScanCaps.test.js.map