node-hp-scan-to 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -6
- package/dist/Destination.js +10 -9
- package/dist/Destination.js.map +1 -1
- package/dist/Event.d.ts +10 -6
- package/dist/Event.js +18 -2
- package/dist/Event.js.map +1 -1
- package/dist/HPApi.d.ts +13 -4
- package/dist/HPApi.js +198 -61
- package/dist/HPApi.js.map +1 -1
- package/dist/Job.d.ts +13 -1
- package/dist/Job.js +32 -0
- package/dist/Job.js.map +1 -1
- package/dist/JpegUtil.d.ts +26 -0
- package/dist/JpegUtil.js +238 -0
- package/dist/JpegUtil.js.map +1 -0
- package/dist/PathHelper.d.ts +5 -0
- package/dist/PathHelper.js +79 -0
- package/dist/PathHelper.js.map +1 -0
- package/dist/ScanContent.d.ts +12 -0
- package/dist/ScanContent.js +82 -0
- package/dist/ScanContent.js.map +1 -0
- package/dist/ScanStatus.d.ts +1 -1
- package/dist/ScanStatus.js.map +1 -1
- package/dist/WalkupScanToCompDestinations.js +3 -3
- package/dist/WalkupScanToCompDestinations.js.map +1 -1
- package/dist/WalkupScanToCompEvent.d.ts +10 -0
- package/dist/WalkupScanToCompEvent.js +17 -0
- package/dist/WalkupScanToCompEvent.js.map +1 -0
- package/dist/index.js +406 -102
- package/dist/index.js.map +1 -1
- package/package.json +26 -13
- package/src/Destination.ts +8 -7
- package/src/Event.ts +21 -7
- package/src/HPApi.ts +117 -43
- package/src/Job.ts +39 -1
- package/src/JpegUtil.ts +319 -0
- package/src/PathHelper.ts +44 -0
- package/src/ScanContent.ts +34 -0
- package/src/ScanStatus.ts +1 -1
- package/src/WalkupScanToCompDestinations.ts +4 -5
- package/src/WalkupScanToCompEvent.ts +18 -0
- package/src/index.ts +390 -76
package/dist/JpegUtil.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var debug = false;
|
|
4
|
+
var start_of_Frame_0 = "FFC0";
|
|
5
|
+
var define_number_of_lines = "FFDC";
|
|
6
|
+
var JpegUtil = /** @class */ (function () {
|
|
7
|
+
function JpegUtil() {
|
|
8
|
+
}
|
|
9
|
+
JpegUtil.setDebug = function (dbg) {
|
|
10
|
+
debug = dbg;
|
|
11
|
+
};
|
|
12
|
+
JpegUtil.logDebug = function (msg) {
|
|
13
|
+
if (debug) {
|
|
14
|
+
console.log(msg);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
JpegUtil.numToHex = function (s) {
|
|
18
|
+
return s.toString(16).padStart(2, "0").toUpperCase();
|
|
19
|
+
};
|
|
20
|
+
JpegUtil.GetJpgSize = function (buffer) {
|
|
21
|
+
var _a;
|
|
22
|
+
var size = null;
|
|
23
|
+
this.parse(buffer, (_a = {},
|
|
24
|
+
_a[start_of_Frame_0] = function (start, length) {
|
|
25
|
+
// read the the "Start of frame" marker which contains the file size
|
|
26
|
+
if (6 < length) {
|
|
27
|
+
var pHeight = buffer[start + 3] * 256 + buffer[start + 4];
|
|
28
|
+
var pWidth = buffer[start + 5] * 256 + buffer[start + 6];
|
|
29
|
+
size = { height: pHeight, width: pWidth };
|
|
30
|
+
}
|
|
31
|
+
// stop processing
|
|
32
|
+
return true;
|
|
33
|
+
},
|
|
34
|
+
_a));
|
|
35
|
+
return size;
|
|
36
|
+
};
|
|
37
|
+
JpegUtil.setJpgSize = function (buffer, size) {
|
|
38
|
+
var _a;
|
|
39
|
+
var sizeWritten = false;
|
|
40
|
+
var parsingSucceed = this.parse(buffer, (_a = {},
|
|
41
|
+
_a[start_of_Frame_0] = function (start, length) {
|
|
42
|
+
// read the the "Start of frame" marker which contains the file size
|
|
43
|
+
// write the picture size
|
|
44
|
+
if (6 < length) {
|
|
45
|
+
var height = Buffer.from([0x00, 0x00]);
|
|
46
|
+
height.writeInt16BE(size.height);
|
|
47
|
+
buffer[start + 3] = height[0];
|
|
48
|
+
buffer[start + 4] = height[1];
|
|
49
|
+
var width = Buffer.from([0x00, 0x00]);
|
|
50
|
+
width.writeInt16BE(size.width);
|
|
51
|
+
buffer[start + 5] = width[0];
|
|
52
|
+
buffer[start + 6] = width[1];
|
|
53
|
+
sizeWritten = true;
|
|
54
|
+
}
|
|
55
|
+
// stop processing
|
|
56
|
+
return true;
|
|
57
|
+
},
|
|
58
|
+
_a));
|
|
59
|
+
if (!parsingSucceed) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return sizeWritten;
|
|
63
|
+
};
|
|
64
|
+
JpegUtil.setJpgHeight = function (buffer, height) {
|
|
65
|
+
var _a;
|
|
66
|
+
var _this = this;
|
|
67
|
+
var heightWritten = false;
|
|
68
|
+
var parsingSucceed = this.parse(buffer, (_a = {},
|
|
69
|
+
_a[start_of_Frame_0] = function (start, length) {
|
|
70
|
+
// read the the "Start of frame" marker which contains the file size
|
|
71
|
+
// write the picture size
|
|
72
|
+
heightWritten = _this.writeHeightInStartOfFrame(buffer, start, length, height);
|
|
73
|
+
// stop processing
|
|
74
|
+
return true;
|
|
75
|
+
},
|
|
76
|
+
_a));
|
|
77
|
+
if (!parsingSucceed) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
return heightWritten;
|
|
81
|
+
};
|
|
82
|
+
JpegUtil.fixSizeWithDNL = function (buffer) {
|
|
83
|
+
var _a;
|
|
84
|
+
var _this = this;
|
|
85
|
+
var numberOfLine = null;
|
|
86
|
+
var startOfStartOfFrame = null;
|
|
87
|
+
var lengthOfStartOfFrame = null;
|
|
88
|
+
this.parse(buffer, (_a = {},
|
|
89
|
+
_a[define_number_of_lines] = function (start, length) {
|
|
90
|
+
numberOfLine = _this.readNumberOfLineFromDNL(buffer, start, length);
|
|
91
|
+
return false; // don't stop
|
|
92
|
+
},
|
|
93
|
+
_a[start_of_Frame_0] = function (start, length) {
|
|
94
|
+
startOfStartOfFrame = start;
|
|
95
|
+
lengthOfStartOfFrame = length;
|
|
96
|
+
return false; // don't stop
|
|
97
|
+
},
|
|
98
|
+
_a));
|
|
99
|
+
if (numberOfLine == null) {
|
|
100
|
+
this.logDebug("DNL marker not found impossible to fix height");
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
if (startOfStartOfFrame == null || lengthOfStartOfFrame == null) {
|
|
104
|
+
this.logDebug("Start of frame 0 not found, either jpeg parsing is broken either the stream is corrupted");
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
if (this.writeHeightInStartOfFrame(buffer, startOfStartOfFrame, lengthOfStartOfFrame, numberOfLine)) {
|
|
108
|
+
return numberOfLine;
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
};
|
|
112
|
+
JpegUtil.writeHeightInStartOfFrame = function (buffer, startOfStartOfFrame, lengthOfStartOfFrame, numberOfLine) {
|
|
113
|
+
// write the picture height
|
|
114
|
+
if (6 < lengthOfStartOfFrame) {
|
|
115
|
+
var heightBuffer = Buffer.from([0x00, 0x00]);
|
|
116
|
+
heightBuffer.writeInt16BE(numberOfLine);
|
|
117
|
+
buffer[startOfStartOfFrame + 3] = heightBuffer[0];
|
|
118
|
+
buffer[startOfStartOfFrame + 4] = heightBuffer[1];
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
return false;
|
|
122
|
+
};
|
|
123
|
+
JpegUtil.readNumberOfLineFromDNL = function (buffer, start, length) {
|
|
124
|
+
var numberOfLine = null;
|
|
125
|
+
// read the number of line
|
|
126
|
+
if (3 < length) {
|
|
127
|
+
numberOfLine = buffer[start + 2] * 256 + buffer[start + 3];
|
|
128
|
+
}
|
|
129
|
+
return numberOfLine;
|
|
130
|
+
};
|
|
131
|
+
JpegUtil.parse = function (buffer, markerHandler) {
|
|
132
|
+
var i = 0;
|
|
133
|
+
if (!this.isSOIHeader(i, buffer)) {
|
|
134
|
+
this.logDebug("Not a valid SOI header");
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
i += 4;
|
|
138
|
+
// Check for valid JPEG header (null terminated JFIF)
|
|
139
|
+
if (!this.isValidJpegHeader(i, buffer)) {
|
|
140
|
+
this.logDebug("Not a valid JFIF string");
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
return this.parseMarker(buffer, i, markerHandler);
|
|
144
|
+
};
|
|
145
|
+
JpegUtil.isValidJpegHeader = function (i, buffer) {
|
|
146
|
+
return (i + 6 < buffer.length &&
|
|
147
|
+
buffer[i + 2] == "J".charCodeAt(0) &&
|
|
148
|
+
buffer[i + 3] == "F".charCodeAt(0) &&
|
|
149
|
+
buffer[i + 4] == "I".charCodeAt(0) &&
|
|
150
|
+
buffer[i + 5] == "F".charCodeAt(0) &&
|
|
151
|
+
buffer[i + 6] == 0x00);
|
|
152
|
+
};
|
|
153
|
+
JpegUtil.isSOIHeader = function (i, buffer) {
|
|
154
|
+
return (i + 3 < buffer.length &&
|
|
155
|
+
buffer[i] == 0xff &&
|
|
156
|
+
buffer[i + 1] == 0xd8 &&
|
|
157
|
+
buffer[i + 2] == 0xff &&
|
|
158
|
+
buffer[i + 3] == 0xe0);
|
|
159
|
+
};
|
|
160
|
+
JpegUtil.getBlockLength = function (buffer, i, marker) {
|
|
161
|
+
if (marker === "FFDA" ||
|
|
162
|
+
marker === "FFD0" ||
|
|
163
|
+
marker === "FFD1" ||
|
|
164
|
+
marker === "FFD2" ||
|
|
165
|
+
marker === "FFD3" ||
|
|
166
|
+
marker === "FFD4" ||
|
|
167
|
+
marker === "FFD5" ||
|
|
168
|
+
marker === "FFD6" ||
|
|
169
|
+
marker === "FFD7") {
|
|
170
|
+
return JpegUtil.findCurrentBlockSize(buffer, i + 2, marker);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// read the new block length
|
|
174
|
+
var blockLength = buffer[i + 2] * 256 + buffer[i + 3];
|
|
175
|
+
this.logDebug("block size for ".concat(marker, " is ").concat(blockLength));
|
|
176
|
+
return blockLength;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
JpegUtil.findCurrentBlockSize = function (buffer, i, current_marker) {
|
|
180
|
+
for (var j = 0; i + j < buffer.length; j++) {
|
|
181
|
+
if (buffer[i + j] === 0xff) {
|
|
182
|
+
if (i + j + 1 < buffer.length) {
|
|
183
|
+
if (buffer[i + j + 1] == 0x00) {
|
|
184
|
+
// it's ok just continue
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// we've just found the end of the Start of Scan
|
|
188
|
+
return j;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.logDebug("Premature end of stream reach while searching for the block size inside marker ".concat(current_marker));
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return null;
|
|
198
|
+
};
|
|
199
|
+
JpegUtil.parseMarker = function (buffer, i, markerHandler) {
|
|
200
|
+
var marker = "";
|
|
201
|
+
//Retrieve the block length of the first block since the first block will not contain the size of file
|
|
202
|
+
var blockLength = buffer[i] * 256 + buffer[i + 1];
|
|
203
|
+
//Increase the file index to get to the next block
|
|
204
|
+
i += blockLength;
|
|
205
|
+
while (i < buffer.length) {
|
|
206
|
+
if (buffer[i] != 0xff) {
|
|
207
|
+
this.logDebug("We should be at the begining of the next block, but got: " +
|
|
208
|
+
buffer[i]);
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
if (i + 1 >= buffer.length) {
|
|
212
|
+
this.logDebug("End of stream prematurely found in marker: " + marker);
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
if (buffer[i + 1] == 0x00) {
|
|
216
|
+
this.logDebug("Bad marker at ".concat(i, " 0x00 just after marker ").concat(marker));
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
marker = this.numToHex(buffer[i]) + this.numToHex(buffer[i + 1]);
|
|
220
|
+
var foundBlockLength = this.getBlockLength(buffer, i, marker);
|
|
221
|
+
if (foundBlockLength == null) {
|
|
222
|
+
this.logDebug("Was not able to determine block size for marker ".concat(marker));
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
blockLength = foundBlockLength;
|
|
226
|
+
var handler = markerHandler[marker];
|
|
227
|
+
if (handler != null && handler(i + 2, blockLength)) {
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
i = i + 2 + blockLength;
|
|
231
|
+
}
|
|
232
|
+
this.logDebug("End of payload reached");
|
|
233
|
+
return true;
|
|
234
|
+
};
|
|
235
|
+
return JpegUtil;
|
|
236
|
+
}());
|
|
237
|
+
exports.default = JpegUtil;
|
|
238
|
+
//# sourceMappingURL=JpegUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JpegUtil.js","sourceRoot":"","sources":["../src/JpegUtil.ts"],"names":[],"mappings":"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","sourcesContent":["let debug = false;\n\nconst start_of_Frame_0 = \"FFC0\";\nconst define_number_of_lines = \"FFDC\";\n\nexport default class JpegUtil {\n static setDebug(dbg: boolean) {\n debug = dbg;\n }\n\n private static logDebug(msg: any) {\n if (debug) {\n console.log(msg);\n }\n }\n\n private static numToHex(s: number) {\n return s.toString(16).padStart(2, \"0\").toUpperCase();\n }\n\n static GetJpgSize(buffer: Buffer): { height: number; width: number } | null {\n let size: { height: number; width: number } | null = null;\n this.parse(buffer, {\n [start_of_Frame_0]: (start: number, length: number) => {\n // read the the \"Start of frame\" marker which contains the file size\n if (6 < length) {\n const pHeight = buffer[start + 3] * 256 + buffer[start + 4];\n const pWidth = buffer[start + 5] * 256 + buffer[start + 6];\n\n size = { height: pHeight, width: pWidth };\n }\n\n // stop processing\n return true;\n },\n });\n return size;\n }\n\n static setJpgSize(\n buffer: Buffer,\n size: { height: number; width: number }\n ): boolean {\n let sizeWritten = false;\n const parsingSucceed = this.parse(buffer, {\n [start_of_Frame_0]: (start: number, length: number) => {\n // read the the \"Start of frame\" marker which contains the file size\n\n // write the picture size\n if (6 < length) {\n const height = Buffer.from([0x00, 0x00]);\n height.writeInt16BE(size.height);\n buffer[start + 3] = height[0];\n buffer[start + 4] = height[1];\n\n const width = Buffer.from([0x00, 0x00]);\n width.writeInt16BE(size.width);\n buffer[start + 5] = width[0];\n buffer[start + 6] = width[1];\n\n sizeWritten = true;\n }\n\n // stop processing\n return true;\n },\n });\n\n if (!parsingSucceed) {\n return false;\n }\n\n return sizeWritten;\n }\n\n static setJpgHeight(buffer: Buffer, height: number): boolean {\n let heightWritten = false;\n const parsingSucceed = this.parse(buffer, {\n [start_of_Frame_0]: (start: number, length: number) => {\n // read the the \"Start of frame\" marker which contains the file size\n\n // write the picture size\n heightWritten = this.writeHeightInStartOfFrame(\n buffer,\n start,\n length,\n height\n );\n\n // stop processing\n return true;\n },\n });\n\n if (!parsingSucceed) {\n return false;\n }\n\n return heightWritten;\n }\n\n static fixSizeWithDNL(buffer: Buffer): number | null {\n let numberOfLine: number | null = null;\n let startOfStartOfFrame: number | null = null;\n let lengthOfStartOfFrame: number | null = null;\n this.parse(buffer, {\n [define_number_of_lines]: (start: number, length: number) => {\n numberOfLine = this.readNumberOfLineFromDNL(buffer, start, length);\n return false; // don't stop\n },\n [start_of_Frame_0]: (start: number, length: number) => {\n startOfStartOfFrame = start;\n lengthOfStartOfFrame = length;\n return false; // don't stop\n },\n });\n\n if (numberOfLine == null) {\n this.logDebug(\"DNL marker not found impossible to fix height\");\n return null;\n }\n\n if (startOfStartOfFrame == null || lengthOfStartOfFrame == null) {\n this.logDebug(\n \"Start of frame 0 not found, either jpeg parsing is broken either the stream is corrupted\"\n );\n return null;\n }\n\n if (\n this.writeHeightInStartOfFrame(\n buffer,\n startOfStartOfFrame,\n lengthOfStartOfFrame,\n numberOfLine\n )\n ) {\n return numberOfLine;\n }\n return null;\n }\n\n private static writeHeightInStartOfFrame(\n buffer: Buffer,\n startOfStartOfFrame: number,\n lengthOfStartOfFrame: number,\n numberOfLine: number\n ) : boolean {\n // write the picture height\n if (6 < lengthOfStartOfFrame) {\n const heightBuffer = Buffer.from([0x00, 0x00]);\n heightBuffer.writeInt16BE(numberOfLine);\n buffer[startOfStartOfFrame + 3] = heightBuffer[0];\n buffer[startOfStartOfFrame + 4] = heightBuffer[1];\n\n return true;\n }\n\n return false;\n }\n\n static readNumberOfLineFromDNL(\n buffer: Buffer,\n start: number,\n length: number\n ): number | null {\n let numberOfLine: number | null = null;\n\n // read the number of line\n if (3 < length) {\n numberOfLine = buffer[start + 2] * 256 + buffer[start + 3];\n }\n\n return numberOfLine;\n }\n static parse(\n buffer: Buffer,\n markerHandler: { [key: string]: (start: number, length: number) => boolean }\n ): boolean {\n let i: number = 0;\n\n if (!this.isSOIHeader(i, buffer)) {\n this.logDebug(\"Not a valid SOI header\");\n return false;\n }\n\n i += 4;\n\n // Check for valid JPEG header (null terminated JFIF)\n if (!this.isValidJpegHeader(i, buffer)) {\n this.logDebug(\"Not a valid JFIF string\");\n return false;\n }\n\n return this.parseMarker(buffer, i, markerHandler);\n }\n\n private static isValidJpegHeader(i: number, buffer: Buffer) {\n return (\n i + 6 < buffer.length &&\n buffer[i + 2] == \"J\".charCodeAt(0) &&\n buffer[i + 3] == \"F\".charCodeAt(0) &&\n buffer[i + 4] == \"I\".charCodeAt(0) &&\n buffer[i + 5] == \"F\".charCodeAt(0) &&\n buffer[i + 6] == 0x00\n );\n }\n\n private static isSOIHeader(i: number, buffer: Buffer) {\n return (\n i + 3 < buffer.length &&\n buffer[i] == 0xff &&\n buffer[i + 1] == 0xd8 &&\n buffer[i + 2] == 0xff &&\n buffer[i + 3] == 0xe0\n );\n }\n\n private static getBlockLength(\n buffer: Buffer,\n i: number,\n marker: string\n ): number | null {\n if (\n marker === \"FFDA\" ||\n marker === \"FFD0\" ||\n marker === \"FFD1\" ||\n marker === \"FFD2\" ||\n marker === \"FFD3\" ||\n marker === \"FFD4\" ||\n marker === \"FFD5\" ||\n marker === \"FFD6\" ||\n marker === \"FFD7\"\n ) {\n return JpegUtil.findCurrentBlockSize(buffer, i + 2, marker);\n } else {\n // read the new block length\n const blockLength = buffer[i + 2] * 256 + buffer[i + 3];\n\n this.logDebug(`block size for ${marker} is ${blockLength}`);\n return blockLength;\n }\n }\n\n private static findCurrentBlockSize(\n buffer: Buffer,\n i: number,\n current_marker: string\n ): number | null {\n for (let j = 0; i + j < buffer.length; j++) {\n if (buffer[i + j] === 0xff) {\n if (i + j + 1 < buffer.length) {\n if (buffer[i + j + 1] == 0x00) {\n // it's ok just continue\n } else {\n // we've just found the end of the Start of Scan\n return j;\n }\n } else {\n this.logDebug(\n `Premature end of stream reach while searching for the block size inside marker ${current_marker}`\n );\n return null;\n }\n }\n }\n return null;\n }\n\n private static parseMarker(buffer: Buffer, i: number, markerHandler: { [key: string]: (start: number, length: number) => boolean }) : boolean {\n let marker = \"\";\n\n //Retrieve the block length of the first block since the first block will not contain the size of file\n let blockLength = buffer[i] * 256 + buffer[i + 1];\n\n //Increase the file index to get to the next block\n i += blockLength;\n while (i < buffer.length) {\n if (buffer[i] != 0xff) {\n this.logDebug(\n \"We should be at the begining of the next block, but got: \" +\n buffer[i]\n );\n return false;\n }\n\n if (i + 1 >= buffer.length) {\n this.logDebug(\"End of stream prematurely found in marker: \" + marker);\n return false;\n }\n\n if (buffer[i + 1] == 0x00) {\n this.logDebug(`Bad marker at ${i} 0x00 just after marker ${marker}`);\n return false;\n }\n\n marker = this.numToHex(buffer[i]) + this.numToHex(buffer[i + 1]);\n\n const foundBlockLength = this.getBlockLength(buffer, i, marker);\n if (foundBlockLength == null) {\n this.logDebug(\n `Was not able to determine block size for marker ${marker}`\n );\n return false;\n }\n blockLength = foundBlockLength;\n\n const handler = markerHandler[marker];\n if (handler != null && handler(i + 2, blockLength)) {\n return true;\n }\n\n i = i + 2 + blockLength;\n }\n\n this.logDebug(\"End of payload reached\");\n return true;\n }\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export default class PathHelper {
|
|
2
|
+
static getFileForPage(folder: string, scanCount: number, currentPageNumber: number, filePattern: string | undefined, extension: string): string;
|
|
3
|
+
static getFileForScan(folder: string, scanCount: number, filePattern: string | undefined, extension: string): string;
|
|
4
|
+
static getOutputFolder(folder: string | undefined): Promise<string>;
|
|
5
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
var path_1 = __importDefault(require("path"));
|
|
43
|
+
var dateformat_1 = __importDefault(require("dateformat"));
|
|
44
|
+
var promises_1 = __importDefault(require("fs/promises"));
|
|
45
|
+
var os_1 = __importDefault(require("os"));
|
|
46
|
+
var PathHelper = /** @class */ (function () {
|
|
47
|
+
function PathHelper() {
|
|
48
|
+
}
|
|
49
|
+
PathHelper.getFileForPage = function (folder, scanCount, currentPageNumber, filePattern, extension) {
|
|
50
|
+
if (filePattern) {
|
|
51
|
+
return path_1.default.join(folder, "".concat((0, dateformat_1.default)(new Date(), filePattern), ".").concat(extension));
|
|
52
|
+
}
|
|
53
|
+
return path_1.default.join(folder, "scan".concat(scanCount, "_page").concat(currentPageNumber, ".").concat(extension));
|
|
54
|
+
};
|
|
55
|
+
PathHelper.getFileForScan = function (folder, scanCount, filePattern, extension) {
|
|
56
|
+
if (filePattern) {
|
|
57
|
+
return path_1.default.join(folder, "".concat((0, dateformat_1.default)(new Date(), filePattern), ".").concat(extension));
|
|
58
|
+
}
|
|
59
|
+
return path_1.default.join(folder, "scan".concat(scanCount, ".").concat(extension));
|
|
60
|
+
};
|
|
61
|
+
PathHelper.getOutputFolder = function (folder) {
|
|
62
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
63
|
+
return __generator(this, function (_a) {
|
|
64
|
+
switch (_a.label) {
|
|
65
|
+
case 0:
|
|
66
|
+
if (!!folder) return [3 /*break*/, 2];
|
|
67
|
+
return [4 /*yield*/, promises_1.default.mkdtemp(path_1.default.join(os_1.default.tmpdir(), "scan-to-pc"))];
|
|
68
|
+
case 1:
|
|
69
|
+
folder = _a.sent();
|
|
70
|
+
_a.label = 2;
|
|
71
|
+
case 2: return [2 /*return*/, folder];
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
return PathHelper;
|
|
77
|
+
}());
|
|
78
|
+
exports.default = PathHelper;
|
|
79
|
+
//# sourceMappingURL=PathHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathHelper.js","sourceRoot":"","sources":["../src/PathHelper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAAwB;AACxB,0DAAoC;AACpC,yDAA6B;AAC7B,0CAAoB;AAEpB;IAAA;IAsCA,CAAC;IArCQ,yBAAc,GAArB,UACE,MAAc,EACd,SAAiB,EACjB,iBAAyB,EACzB,WAAgC,EAChC,SAAiB;QAGjB,IAAI,WAAW,EAAE;YACf,OAAO,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAG,IAAA,oBAAU,EAAC,IAAI,IAAI,EAAE,EAAE,WAAW,CAAC,cAAI,SAAS,CAAE,CAAC,CAAC;SACjF;QAED,OAAO,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAO,SAAS,kBAAQ,iBAAiB,cAAI,SAAS,CAAE,CAAC,CAAC;IACrF,CAAC;IAEM,yBAAc,GAArB,UACE,MAAc,EACd,SAAiB,EACjB,WAAgC,EAChC,SAAiB;QAGjB,IAAI,WAAW,EAAE;YACf,OAAO,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAG,IAAA,oBAAU,EAAC,IAAI,IAAI,EAAE,EAAE,WAAW,CAAC,cAAI,SAAS,CAAE,CAAC,CAAC;SACjF;QAED,OAAO,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAO,SAAS,cAAI,SAAS,CAAE,CAAC,CAAC;IAC5D,CAAC;IAEY,0BAAe,GAA5B,UAA6B,MAA0B;;;;;6BACjD,CAAC,MAAM,EAAP,wBAAO;wBACA,qBAAM,kBAAE,CAAC,OAAO,CACvB,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CACrC,EAAA;;wBAFD,MAAM,GAAG,SAER,CAAC;;4BAEJ,sBAAO,MAAM,EAAC;;;;KACf;IACH,iBAAC;AAAD,CAAC,AAtCD,IAsCC","sourcesContent":["import path from \"path\";\nimport dateformat from \"dateformat\";\nimport fs from \"fs/promises\";\nimport os from \"os\";\n\nexport default class PathHelper {\n static getFileForPage(\n folder: string,\n scanCount: number,\n currentPageNumber: number,\n filePattern : string | undefined,\n extension: string\n ): string {\n\n if (filePattern) {\n return path.join(folder, `${dateformat(new Date(), filePattern)}.${extension}`);\n }\n\n return path.join(folder, `scan${scanCount}_page${currentPageNumber}.${extension}`);\n }\n\n static getFileForScan(\n folder: string,\n scanCount: number,\n filePattern : string | undefined,\n extension: string\n ): string {\n\n if (filePattern) {\n return path.join(folder, `${dateformat(new Date(), filePattern)}.${extension}`);\n }\n\n return path.join(folder, `scan${scanCount}.${extension}`);\n }\n\n static async getOutputFolder(folder: string | undefined) {\n if (!folder) {\n folder = await fs.mkdtemp(\n path.join(os.tmpdir(), \"scan-to-pc\")\n );\n }\n return folder;\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ScanContent {
|
|
2
|
+
elements: ScanPage[];
|
|
3
|
+
}
|
|
4
|
+
export interface ScanPage {
|
|
5
|
+
path: string;
|
|
6
|
+
pageNumber: number;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
xResolution: number;
|
|
10
|
+
yResolution: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function createPdfFrom(scanContent: ScanContent, destination: string): Promise<void>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.createPdfFrom = void 0;
|
|
43
|
+
var promises_1 = __importDefault(require("fs/promises"));
|
|
44
|
+
var jspdf_1 = require("jspdf");
|
|
45
|
+
function createPdfFrom(scanContent, destination) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
47
|
+
var doc, _i, _a, element, widthInInches, heightInInches, format, imageByteBuffer;
|
|
48
|
+
return __generator(this, function (_b) {
|
|
49
|
+
switch (_b.label) {
|
|
50
|
+
case 0:
|
|
51
|
+
doc = null;
|
|
52
|
+
_i = 0, _a = scanContent.elements;
|
|
53
|
+
_b.label = 1;
|
|
54
|
+
case 1:
|
|
55
|
+
if (!(_i < _a.length)) return [3 /*break*/, 4];
|
|
56
|
+
element = _a[_i];
|
|
57
|
+
widthInInches = element.width / element.xResolution;
|
|
58
|
+
heightInInches = element.height / element.yResolution;
|
|
59
|
+
format = [widthInInches, heightInInches];
|
|
60
|
+
if (doc == null) {
|
|
61
|
+
doc = new jspdf_1.jsPDF({ unit: "in", floatPrecision: 3, format: format });
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
doc.addPage(format);
|
|
65
|
+
}
|
|
66
|
+
return [4 /*yield*/, promises_1.default.readFile(element.path)];
|
|
67
|
+
case 2:
|
|
68
|
+
imageByteBuffer = _b.sent();
|
|
69
|
+
doc.addImage(imageByteBuffer, "JPEG", 0, 0, widthInInches, heightInInches);
|
|
70
|
+
_b.label = 3;
|
|
71
|
+
case 3:
|
|
72
|
+
_i++;
|
|
73
|
+
return [3 /*break*/, 1];
|
|
74
|
+
case 4:
|
|
75
|
+
doc === null || doc === void 0 ? void 0 : doc.save(destination);
|
|
76
|
+
return [2 /*return*/];
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
exports.createPdfFrom = createPdfFrom;
|
|
82
|
+
//# sourceMappingURL=ScanContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScanContent.js","sourceRoot":"","sources":["../src/ScanContent.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yDAA6B;AAE7B,+BAA8B;AAc9B,SAAsB,aAAa,CAAC,WAAwB,EAAE,WAAmB;;;;;;oBAC3E,GAAG,GAAiB,IAAI,CAAC;0BACa,EAApB,KAAA,WAAW,CAAC,QAAQ;;;yBAApB,CAAA,cAAoB,CAAA;oBAA/B,OAAO;oBACV,aAAa,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC;oBACpD,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;oBACtD,MAAM,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;oBAE/C,IAAI,GAAG,IAAI,IAAI,EAAE;wBACf,GAAG,GAAG,IAAI,aAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,QAAA,EAAE,CAAC,CAAC;qBAC5D;yBAAM;wBACL,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;qBACrB;oBAEuB,qBAAM,kBAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAA;;oBAAjD,eAAe,GAAG,SAA+B;oBACvD,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;;;oBAZvD,IAAoB,CAAA;;;oBAc1C,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC,WAAW,CAAC,CAAC;;;;;CACxB;AAjBD,sCAiBC","sourcesContent":["import fs from \"fs/promises\";\n\nimport { jsPDF } from \"jspdf\";\n\nexport interface ScanContent {\n elements: ScanPage[];\n}\nexport interface ScanPage {\n path: string;\n pageNumber: number;\n width: number;\n height: number;\n xResolution: number;\n yResolution: number;\n}\n\nexport async function createPdfFrom(scanContent: ScanContent, destination: string) {\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"]}
|
package/dist/ScanStatus.d.ts
CHANGED
package/dist/ScanStatus.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScanStatus.js","sourceRoot":"","sources":["../src/ScanStatus.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AASb;IAEE,oBAAY,IAAoB;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,sBAAI,oCAAY;aAAhB;YACE,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;;;OAAA;IAED,sBAAI,gCAAQ;aAAZ;YACE,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;gBACtD,oDAAoD;gBACpD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC9C;iBAAM;gBACL,OAAO,EAAE,CAAC;aACX;QACH,CAAC;;;OAAA;IAED,6BAAQ,GAAR;QACE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACpC,CAAC;IAED,mCAAc,GAAd;QACE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC5C,CAAC;IACH,iBAAC;AAAD,CAAC,AA1BD,IA0BC","sourcesContent":["\"use strict\";\n\nexport interface ScanStatusData {\n ScanStatus: {\n ScannerState: { \"0\": string };\n AdfState: { \"0\": string };\n };\n}\n\nexport default class ScanStatus {\n private readonly data: ScanStatusData;\n constructor(data: ScanStatusData) {\n this.data = data;\n }\n\n get scannerState(): string {\n return this.data[\"ScanStatus\"].ScannerState[\"0\"];\n }\n\n get adfState(): string {\n if (this.data[\"ScanStatus\"].hasOwnProperty(\"AdfState\")) {\n //not all printers have an automatic document feeder\n return this.data[\"ScanStatus\"].AdfState[\"0\"];\n } else {\n return \"\";\n }\n }\n\n isLoaded(): boolean {\n return this.adfState === \"Loaded\";\n }\n\n getInputSource():
|
|
1
|
+
{"version":3,"file":"ScanStatus.js","sourceRoot":"","sources":["../src/ScanStatus.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AASb;IAEE,oBAAY,IAAoB;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,sBAAI,oCAAY;aAAhB;YACE,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;;;OAAA;IAED,sBAAI,gCAAQ;aAAZ;YACE,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;gBACtD,oDAAoD;gBACpD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC9C;iBAAM;gBACL,OAAO,EAAE,CAAC;aACX;QACH,CAAC;;;OAAA;IAED,6BAAQ,GAAR;QACE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACpC,CAAC;IAED,mCAAc,GAAd;QACE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC5C,CAAC;IACH,iBAAC;AAAD,CAAC,AA1BD,IA0BC","sourcesContent":["\"use strict\";\n\nexport interface ScanStatusData {\n ScanStatus: {\n ScannerState: { \"0\": string };\n AdfState: { \"0\": string };\n };\n}\n\nexport default class ScanStatus {\n private readonly data: ScanStatusData;\n constructor(data: ScanStatusData) {\n this.data = data;\n }\n\n get scannerState(): string {\n return this.data[\"ScanStatus\"].ScannerState[\"0\"];\n }\n\n get adfState(): string {\n if (this.data[\"ScanStatus\"].hasOwnProperty(\"AdfState\")) {\n //not all printers have an automatic document feeder\n return this.data[\"ScanStatus\"].AdfState[\"0\"];\n } else {\n return \"\";\n }\n }\n\n isLoaded(): boolean {\n return this.adfState === \"Loaded\";\n }\n\n getInputSource(): \"Adf\" | \"Platen\" {\n return this.isLoaded() ? \"Adf\" : \"Platen\";\n }\n}\n"]}
|
|
@@ -10,9 +10,9 @@ var WalkupScanToCompDestinations = /** @class */ (function () {
|
|
|
10
10
|
}
|
|
11
11
|
Object.defineProperty(WalkupScanToCompDestinations.prototype, "destinations", {
|
|
12
12
|
get: function () {
|
|
13
|
-
var
|
|
14
|
-
if (
|
|
15
|
-
return
|
|
13
|
+
var walkupScanToCompDestinations = this.data["wus:WalkupScanToCompDestinations"];
|
|
14
|
+
if (walkupScanToCompDestinations.hasOwnProperty("wus:WalkupScanToCompDestination")) {
|
|
15
|
+
return walkupScanToCompDestinations["wus:WalkupScanToCompDestination"].map(function (x) { return new WalkupScanToCompDestination_1.default(x); });
|
|
16
16
|
}
|
|
17
17
|
else {
|
|
18
18
|
return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WalkupScanToCompDestinations.js","sourceRoot":"","sources":["../src/WalkupScanToCompDestinations.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAEb,8FAEuC;AAQvC;IAEE,sCAAY,IAAsC;QAChD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,sBAAI,sDAAY;aAAhB;YACE,IAAI,4BAA4B,
|
|
1
|
+
{"version":3,"file":"WalkupScanToCompDestinations.js","sourceRoot":"","sources":["../src/WalkupScanToCompDestinations.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAEb,8FAEuC;AAQvC;IAEE,sCAAY,IAAsC;QAChD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,sBAAI,sDAAY;aAAhB;YACE,IAAI,4BAA4B,GAC9B,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAChD,IACE,4BAA4B,CAAC,cAAc,CACzC,iCAAiC,CAClC,EACD;gBACA,OAAO,4BAA4B,CACjC,iCAAiC,CAClC,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,IAAI,qCAA2B,CAAC,CAAC,CAAC,EAAlC,CAAkC,CAAC,CAAC;aAClD;iBAAM;gBACL,OAAO,EAAE,CAAC;aACX;QACH,CAAC;;;OAAA;IACH,mCAAC;AAAD,CAAC,AArBD,IAqBC","sourcesContent":["\"use strict\";\n\nimport WalkupScanToCompDestination, {\n WalkupScanToCompDestinationData,\n} from \"./WalkupScanToCompDestination\";\n\nexport interface WalkupScanToCompDestinationsData {\n \"wus:WalkupScanToCompDestinations\": {\n \"wus:WalkupScanToCompDestination\": WalkupScanToCompDestinationData[];\n };\n}\n\nexport default class WalkupScanToCompDestinations {\n private readonly data: WalkupScanToCompDestinationsData;\n constructor(data: WalkupScanToCompDestinationsData) {\n this.data = data;\n }\n\n get destinations(): WalkupScanToCompDestination[] {\n let walkupScanToCompDestinations =\n this.data[\"wus:WalkupScanToCompDestinations\"];\n if (\n walkupScanToCompDestinations.hasOwnProperty(\n \"wus:WalkupScanToCompDestination\"\n )\n ) {\n return walkupScanToCompDestinations[\n \"wus:WalkupScanToCompDestination\"\n ].map((x) => new WalkupScanToCompDestination(x));\n } else {\n return [];\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface WalkupScanToCompEventData {
|
|
2
|
+
"wus:WalkupScanToCompEvent": {
|
|
3
|
+
'wus:WalkupScanToCompEventType': string[];
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
export default class WalkupScanToCompEvent {
|
|
7
|
+
private readonly data;
|
|
8
|
+
constructor(data: WalkupScanToCompEventData);
|
|
9
|
+
get eventType(): string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var WalkupScanToCompEvent = /** @class */ (function () {
|
|
4
|
+
function WalkupScanToCompEvent(data) {
|
|
5
|
+
this.data = data;
|
|
6
|
+
}
|
|
7
|
+
Object.defineProperty(WalkupScanToCompEvent.prototype, "eventType", {
|
|
8
|
+
get: function () {
|
|
9
|
+
return this.data["wus:WalkupScanToCompEvent"]["wus:WalkupScanToCompEventType"][0];
|
|
10
|
+
},
|
|
11
|
+
enumerable: false,
|
|
12
|
+
configurable: true
|
|
13
|
+
});
|
|
14
|
+
return WalkupScanToCompEvent;
|
|
15
|
+
}());
|
|
16
|
+
exports.default = WalkupScanToCompEvent;
|
|
17
|
+
//# sourceMappingURL=WalkupScanToCompEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalkupScanToCompEvent.js","sourceRoot":"","sources":["../src/WalkupScanToCompEvent.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAQb;IAEE,+BAAY,IAA+B;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,sBAAI,4CAAS;aAAb;YACE,OAAO,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;;;OAAA;IACH,4BAAC;AAAD,CAAC,AATD,IASC","sourcesContent":["\"use strict\";\n\nexport interface WalkupScanToCompEventData {\n \"wus:WalkupScanToCompEvent\": {\n 'wus:WalkupScanToCompEventType': string[]\n }\n}\n\nexport default class WalkupScanToCompEvent {\n private readonly data: WalkupScanToCompEventData;\n constructor(data: WalkupScanToCompEventData) {\n this.data = data;\n }\n\n get eventType(): string {\n return this.data[\"wus:WalkupScanToCompEvent\"][\"wus:WalkupScanToCompEventType\"][0];\n }\n}\n"]}
|