node-hp-scan-to 1.3.0 → 1.4.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 +76 -15
- package/dist/Destination.js.map +1 -1
- package/dist/DeviceCapabilities.d.ts +4 -0
- package/dist/DeviceCapabilities.js.map +1 -1
- package/dist/DiscoveryTree.js.map +1 -1
- package/dist/Event.js +2 -2
- package/dist/Event.js.map +1 -1
- package/dist/EventTable.js.map +1 -1
- package/dist/HPApi.js.map +1 -1
- package/dist/InputSource.d.ts +4 -0
- package/dist/InputSource.js +9 -0
- package/dist/InputSource.js.map +1 -0
- package/dist/Job.d.ts +2 -0
- package/dist/Job.js +2 -2
- package/dist/Job.js.map +1 -1
- package/dist/JpegUtil.js +1 -1
- package/dist/JpegUtil.js.map +1 -1
- package/dist/PathHelper.d.ts +4 -3
- package/dist/PathHelper.js +28 -13
- package/dist/PathHelper.js.map +1 -1
- package/dist/ScanCaps.d.ts +18 -0
- package/dist/ScanCaps.js +14 -0
- package/dist/ScanCaps.js.map +1 -1
- package/dist/ScanContent.js.map +1 -1
- package/dist/ScanJobManifest.js.map +1 -1
- package/dist/ScanJobSettings.d.ts +4 -1
- package/dist/ScanJobSettings.js +19 -8
- package/dist/ScanJobSettings.js.map +1 -1
- package/dist/ScanStatus.d.ts +2 -1
- package/dist/ScanStatus.js +3 -2
- package/dist/ScanStatus.js.map +1 -1
- package/dist/WalkupScanDestination.js +2 -2
- package/dist/WalkupScanDestination.js.map +1 -1
- package/dist/WalkupScanDestinations.js +1 -1
- package/dist/WalkupScanDestinations.js.map +1 -1
- package/dist/WalkupScanManifest.js.map +1 -1
- package/dist/WalkupScanToCompCaps.js.map +1 -1
- package/dist/WalkupScanToCompDestination.js +2 -2
- package/dist/WalkupScanToCompDestination.js.map +1 -1
- package/dist/WalkupScanToCompDestinations.js +1 -1
- package/dist/WalkupScanToCompDestinations.js.map +1 -1
- package/dist/WalkupScanToCompEvent.js.map +1 -1
- package/dist/WalkupScanToCompManifest.js.map +1 -1
- package/dist/index.js +28 -7
- package/dist/index.js.map +1 -1
- package/dist/listening.js.map +1 -1
- package/dist/readDeviceCapabilities.js +6 -1
- package/dist/readDeviceCapabilities.js.map +1 -1
- package/dist/scanProcessing.d.ts +5 -1
- package/dist/scanProcessing.js +61 -21
- package/dist/scanProcessing.js.map +1 -1
- package/package.json +7 -7
- package/src/Destination.ts +1 -1
- package/src/DeviceCapabilities.ts +4 -0
- package/src/DiscoveryTree.ts +1 -1
- package/src/Event.ts +4 -4
- package/src/EventTable.ts +1 -1
- package/src/HPApi.ts +19 -19
- package/src/InputSource.ts +4 -0
- package/src/Job.ts +19 -7
- package/src/JpegUtil.ts +18 -14
- package/src/PathHelper.ts +48 -20
- package/src/ScanCaps.ts +43 -1
- package/src/ScanContent.ts +1 -1
- package/src/ScanJobManifest.ts +3 -2
- package/src/ScanJobSettings.ts +23 -9
- package/src/ScanStatus.ts +6 -3
- package/src/WalkupScanDestination.ts +9 -5
- package/src/WalkupScanDestinations.ts +9 -4
- package/src/WalkupScanManifest.ts +3 -3
- package/src/WalkupScanToCompCaps.ts +2 -2
- package/src/WalkupScanToCompDestination.ts +15 -5
- package/src/WalkupScanToCompDestinations.ts +5 -4
- package/src/WalkupScanToCompEvent.ts +1 -1
- package/src/WalkupScanToCompManifest.ts +3 -3
- package/src/index.ts +92 -35
- package/src/listening.ts +14 -15
- package/src/readDeviceCapabilities.ts +12 -6
- package/src/scanProcessing.ts +129 -52
- package/dist/fixJpegSize.d.ts +0 -19
- package/dist/fixJpegSize.js +0 -292
- package/dist/fixJpegSize.js.map +0 -1
- package/dist/scanProcess.d.ts +0 -19
- package/dist/scanProcess.js +0 -292
- package/dist/scanProcess.js.map +0 -1
- package/dist/src/Destination.d.ts +0 -8
- package/dist/src/Destination.js +0 -68
- package/dist/src/Destination.js.map +0 -1
- package/dist/src/DiscoveryTree.d.ts +0 -16
- package/dist/src/DiscoveryTree.js +0 -38
- package/dist/src/DiscoveryTree.js.map +0 -1
- package/dist/src/Event.d.ts +0 -21
- package/dist/src/Event.js +0 -32
- package/dist/src/Event.js.map +0 -1
- package/dist/src/EventTable.d.ts +0 -16
- package/dist/src/EventTable.js +0 -33
- package/dist/src/EventTable.js.map +0 -1
- package/dist/src/HPApi.d.ts +0 -50
- package/dist/src/HPApi.js +0 -454
- package/dist/src/HPApi.js.map +0 -1
- package/dist/src/Job.d.ts +0 -37
- package/dist/src/Job.js +0 -78
- package/dist/src/Job.js.map +0 -1
- package/dist/src/JpegUtil.d.ts +0 -26
- package/dist/src/JpegUtil.js +0 -229
- package/dist/src/JpegUtil.js.map +0 -1
- package/dist/src/KnownShortcut.d.ts +0 -1
- package/dist/src/KnownShortcut.js +0 -3
- package/dist/src/KnownShortcut.js.map +0 -1
- package/dist/src/PathHelper.d.ts +0 -6
- package/dist/src/PathHelper.js +0 -52
- package/dist/src/PathHelper.js.map +0 -1
- package/dist/src/ScanCaps.d.ts +0 -7
- package/dist/src/ScanCaps.js +0 -17
- package/dist/src/ScanCaps.js.map +0 -1
- package/dist/src/ScanJobManifest.d.ts +0 -23
- package/dist/src/ScanJobManifest.js +0 -24
- package/dist/src/ScanJobManifest.js.map +0 -1
- package/dist/src/ScanJobSettings.d.ts +0 -8
- package/dist/src/ScanJobSettings.js +0 -56
- package/dist/src/ScanJobSettings.js.map +0 -1
- package/dist/src/ScanStatus.d.ts +0 -19
- package/dist/src/ScanStatus.js +0 -35
- package/dist/src/ScanStatus.js.map +0 -1
- package/dist/src/WalkupScanDestination.d.ts +0 -22
- package/dist/src/WalkupScanDestination.js +0 -38
- package/dist/src/WalkupScanDestination.js.map +0 -1
- package/dist/src/WalkupScanDestinations.d.ts +0 -12
- package/dist/src/WalkupScanDestinations.js +0 -30
- package/dist/src/WalkupScanDestinations.js.map +0 -1
- package/dist/src/WalkupScanManifest.d.ts +0 -23
- package/dist/src/WalkupScanManifest.js +0 -25
- package/dist/src/WalkupScanManifest.js.map +0 -1
- package/dist/src/WalkupScanToCompCaps.d.ts +0 -12
- package/dist/src/WalkupScanToCompCaps.js +0 -20
- package/dist/src/WalkupScanToCompCaps.js.map +0 -1
- package/dist/src/WalkupScanToCompDestination.d.ts +0 -22
- package/dist/src/WalkupScanToCompDestination.js +0 -38
- package/dist/src/WalkupScanToCompDestination.js.map +0 -1
- package/dist/src/WalkupScanToCompDestinations.d.ts +0 -12
- package/dist/src/WalkupScanToCompDestinations.js +0 -30
- package/dist/src/WalkupScanToCompDestinations.js.map +0 -1
- package/dist/src/WalkupScanToCompEvent.d.ts +0 -11
- package/dist/src/WalkupScanToCompEvent.js +0 -20
- package/dist/src/WalkupScanToCompEvent.js.map +0 -1
- package/dist/src/WalkupScanToCompManifest.d.ts +0 -23
- package/dist/src/WalkupScanToCompManifest.js +0 -25
- package/dist/src/WalkupScanToCompManifest.js.map +0 -1
- package/dist/src/delay.d.ts +0 -1
- package/dist/src/delay.js +0 -10
- package/dist/src/delay.js.map +0 -1
- package/dist/test/DiscoveryTree.test.d.ts +0 -1
- package/dist/test/DiscoveryTree.test.js +0 -68
- package/dist/test/DiscoveryTree.test.js.map +0 -1
- package/dist/test/EtagEventTable.test.d.ts +0 -1
- package/dist/test/EtagEventTable.test.js +0 -93
- package/dist/test/EtagEventTable.test.js.map +0 -1
- package/dist/test/Job.test.d.ts +0 -1
- package/dist/test/Job.test.js +0 -104
- package/dist/test/Job.test.js.map +0 -1
- package/dist/test/JpegUtil.test.d.ts +0 -1
- package/dist/test/JpegUtil.test.js +0 -51
- package/dist/test/JpegUtil.test.js.map +0 -1
- package/dist/test/PathHelper.test.d.ts +0 -1
- package/dist/test/PathHelper.test.js +0 -99
- package/dist/test/PathHelper.test.js.map +0 -1
- package/dist/test/ScanJobManifest.test.d.ts +0 -1
- package/dist/test/ScanJobManifest.test.js +0 -56
- package/dist/test/ScanJobManifest.test.js.map +0 -1
- package/dist/test/ScanJobSettings.test.d.ts +0 -1
- package/dist/test/ScanJobSettings.test.js +0 -53
- package/dist/test/ScanJobSettings.test.js.map +0 -1
- package/dist/test/ScanStatus.test.d.ts +0 -1
- package/dist/test/ScanStatus.test.js +0 -75
- package/dist/test/ScanStatus.test.js.map +0 -1
- package/dist/test/WalkupScanDestination.test.d.ts +0 -1
- package/dist/test/WalkupScanDestination.test.js +0 -80
- package/dist/test/WalkupScanDestination.test.js.map +0 -1
- package/dist/test/WalkupScanDestinations.test.d.ts +0 -1
- package/dist/test/WalkupScanDestinations.test.js +0 -68
- package/dist/test/WalkupScanDestinations.test.js.map +0 -1
- package/dist/test/WalkupScanManifest.test.d.ts +0 -1
- package/dist/test/WalkupScanManifest.test.js +0 -46
- package/dist/test/WalkupScanManifest.test.js.map +0 -1
- package/dist/test/WalkupScanToCompCaps.test.d.ts +0 -1
- package/dist/test/WalkupScanToCompCaps.test.js +0 -56
- package/dist/test/WalkupScanToCompCaps.test.js.map +0 -1
- package/dist/test/WalkupScanToCompDestination.test.d.ts +0 -1
- package/dist/test/WalkupScanToCompDestination.test.js +0 -58
- package/dist/test/WalkupScanToCompDestination.test.js.map +0 -1
- package/dist/test/WalkupScanToCompDestinations.test.d.ts +0 -1
- package/dist/test/WalkupScanToCompDestinations.test.js +0 -58
- package/dist/test/WalkupScanToCompDestinations.test.js.map +0 -1
- package/dist/test/WalkupScanToCompEvent.test.d.ts +0 -1
- package/dist/test/WalkupScanToCompEvent.test.js +0 -46
- package/dist/test/WalkupScanToCompEvent.test.js.map +0 -1
- package/dist/test/WalkupScanToCompManifest.test.d.ts +0 -1
- package/dist/test/WalkupScanToCompManifest.test.js +0 -46
- package/dist/test/WalkupScanToCompManifest.test.js.map +0 -1
- package/dist/test/clean.d.ts +0 -1
- package/dist/test/clean.js +0 -21
- package/dist/test/clean.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -32,7 +32,7 @@ async function listenCmd(registrationConfig, scanConfig, deviceUpPollingInterval
|
|
|
32
32
|
console.log(`Running iteration: ${iteration} - errorCount: ${errorCount}`);
|
|
33
33
|
try {
|
|
34
34
|
const event = await (0, listening_1.waitScanEvent)(deviceCapabilities, registrationConfig);
|
|
35
|
-
scanCount
|
|
35
|
+
scanCount = await PathHelper_1.default.getNextScanNumber(folder, scanCount, scanConfig.directoryConfig.filePattern);
|
|
36
36
|
console.log(`Scan event captured, saving scan #${scanCount}`);
|
|
37
37
|
await (0, scanProcessing_1.saveScan)(event, folder, tempFolder, scanCount, deviceCapabilities, scanConfig);
|
|
38
38
|
}
|
|
@@ -64,6 +64,7 @@ async function adfAutoscanCmd(adfAutoScanConfig, deviceUpPollingInterval) {
|
|
|
64
64
|
console.log(`Target folder: ${folder}`);
|
|
65
65
|
const tempFolder = await PathHelper_1.default.getOutputFolder(adfAutoScanConfig.directoryConfig.tempDirectory);
|
|
66
66
|
console.log(`Temp folder: ${tempFolder}`);
|
|
67
|
+
const deviceCapabilities = await (0, readDeviceCapabilities_1.readDeviceCapabilities)();
|
|
67
68
|
let scanCount = 0;
|
|
68
69
|
let keepActive = true;
|
|
69
70
|
let errorCount = 0;
|
|
@@ -73,7 +74,7 @@ async function adfAutoscanCmd(adfAutoScanConfig, deviceUpPollingInterval) {
|
|
|
73
74
|
await (0, scanProcessing_1.waitAdfLoaded)(adfAutoScanConfig.pollingInterval, adfAutoScanConfig.startScanDelay);
|
|
74
75
|
scanCount++;
|
|
75
76
|
console.log(`Scan event captured, saving scan #${scanCount}`);
|
|
76
|
-
await (0, scanProcessing_1.scanFromAdf)(scanCount, folder, tempFolder, adfAutoScanConfig);
|
|
77
|
+
await (0, scanProcessing_1.scanFromAdf)(scanCount, folder, tempFolder, adfAutoScanConfig, deviceCapabilities, new Date());
|
|
77
78
|
}
|
|
78
79
|
catch (e) {
|
|
79
80
|
console.log(e);
|
|
@@ -132,6 +133,8 @@ function setupScanParameters(command) {
|
|
|
132
133
|
command.option("-t, --temp-directory <dir>", "Temp directory used for processing (default: /tmp/scan-to-pc<random>)");
|
|
133
134
|
command.option("-p, --pattern <pattern>", 'Pattern for filename (i.e. "scan"_dd.mm.yyyy_hh:MM:ss, without this its scanPage<number>)');
|
|
134
135
|
command.option("-r, --resolution <dpi>", "Resolution in DPI of the scans (default: 200)");
|
|
136
|
+
command.option("-w, --width <width>", "With in pixel of the scans (default: 2481)");
|
|
137
|
+
command.option("-h, --height <height>", "Height in pixel of the scans (default: 3507)");
|
|
135
138
|
return command;
|
|
136
139
|
}
|
|
137
140
|
function setupParameterOpts(command) {
|
|
@@ -163,8 +166,22 @@ function getScanConfiguration(parentOption) {
|
|
|
163
166
|
tempDirectory: parentOption.tempDirectory || getConfig("tempDirectory"),
|
|
164
167
|
filePattern: parentOption.pattern || getConfig("pattern"),
|
|
165
168
|
};
|
|
169
|
+
const configWidth = (parentOption.width ||
|
|
170
|
+
getConfig("width") ||
|
|
171
|
+
0).toString();
|
|
172
|
+
const width = configWidth.toLowerCase() === "max"
|
|
173
|
+
? Number.MAX_SAFE_INTEGER
|
|
174
|
+
: parseInt(configWidth, 10);
|
|
175
|
+
const configHeight = (parentOption.width ||
|
|
176
|
+
getConfig("height") ||
|
|
177
|
+
"0").toString();
|
|
178
|
+
const height = configWidth.toLowerCase() === "max"
|
|
179
|
+
? Number.MAX_SAFE_INTEGER
|
|
180
|
+
: parseInt(configHeight, 10);
|
|
166
181
|
const scanConfig = {
|
|
167
|
-
resolution: parseInt(parentOption.resolution || getConfig("resolution") || 200, 10),
|
|
182
|
+
resolution: parseInt(parentOption.resolution || getConfig("resolution") || "200", 10),
|
|
183
|
+
width: width,
|
|
184
|
+
height: height,
|
|
168
185
|
directoryConfig,
|
|
169
186
|
};
|
|
170
187
|
return scanConfig;
|
|
@@ -190,7 +207,7 @@ async function main() {
|
|
|
190
207
|
label: options.label || getConfig("label") || os_1.default.hostname(),
|
|
191
208
|
};
|
|
192
209
|
const deviceUpPollingInterval = getDeviceUpPollingInterval(parentOption);
|
|
193
|
-
const scanConfig = getScanConfiguration(
|
|
210
|
+
const scanConfig = getScanConfiguration(options);
|
|
194
211
|
await listenCmd(registrationConfig, scanConfig, deviceUpPollingInterval);
|
|
195
212
|
});
|
|
196
213
|
commander_1.program.addCommand(cmdListen, { isDefault: true });
|
|
@@ -209,13 +226,17 @@ async function main() {
|
|
|
209
226
|
const isDebug = getIsDebug(parentOption);
|
|
210
227
|
HPApi_1.default.setDebug(isDebug);
|
|
211
228
|
const deviceUpPollingInterval = getDeviceUpPollingInterval(parentOption);
|
|
212
|
-
const scanConfig = getScanConfiguration(
|
|
229
|
+
const scanConfig = getScanConfiguration(options);
|
|
213
230
|
const adfScanConfig = {
|
|
214
231
|
...scanConfig,
|
|
215
232
|
isDuplex: options.isDuplex || getConfig("autoscan_duplex") || false,
|
|
216
233
|
generatePdf: options.pdf || getConfig("autoscan_pdf") || false,
|
|
217
|
-
pollingInterval: options.pollingInterval ||
|
|
218
|
-
|
|
234
|
+
pollingInterval: options.pollingInterval ||
|
|
235
|
+
getConfig("autoscan_pollingInterval") ||
|
|
236
|
+
1000,
|
|
237
|
+
startScanDelay: options.startScanDelay ||
|
|
238
|
+
getConfig("autoscan_startScanDelay") ||
|
|
239
|
+
5000,
|
|
219
240
|
};
|
|
220
241
|
await adfAutoscanCmd(adfScanConfig, deviceUpPollingInterval);
|
|
221
242
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n// noinspection XmlDeprecatedElement,HtmlDeprecatedTag\n\n\"use strict\";\n\nimport os from \"os\";\nimport { Command, Option, OptionValues, program } from \"commander\";\nimport Bonjour from \"bonjour\";\nimport config from \"config\";\nimport HPApi from \"./HPApi\";\nimport PathHelper from \"./PathHelper\";\nimport { delay } from \"./delay\";\nimport { readDeviceCapabilities } from \"./readDeviceCapabilities\";\nimport { clearRegistrations, RegistrationConfig, waitScanEvent } from \"./listening\";\nimport { AdfAutoScanConfig, DirectoryConfig, saveScan, ScanConfig, scanFromAdf, waitAdfLoaded } from \"./scanProcessing\";\n\nlet iteration = 0;\n\nasync function listenCmd(\n registrationConfig: RegistrationConfig,\n scanConfig: ScanConfig,\n deviceUpPollingInterval: number\n) {\n // first make sure the device is reachable\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n let deviceUp = true;\n\n const folder = await PathHelper.getOutputFolder(\n scanConfig.directoryConfig.directory\n );\n console.log(`Target folder: ${folder}`);\n\n const tempFolder = await PathHelper.getOutputFolder(\n scanConfig.directoryConfig.tempDirectory\n );\n console.log(`Temp folder: ${tempFolder}`);\n\n const deviceCapabilities = await readDeviceCapabilities();\n\n let scanCount = 0;\n let keepActive = true;\n let errorCount = 0;\n while (keepActive) {\n console.log(`Running iteration: ${iteration} - errorCount: ${errorCount}`);\n try {\n const event = await waitScanEvent(deviceCapabilities, registrationConfig);\n scanCount++;\n console.log(`Scan event captured, saving scan #${scanCount}`);\n await saveScan(\n event,\n folder,\n tempFolder,\n scanCount,\n deviceCapabilities,\n scanConfig\n );\n } catch (e) {\n console.log(e);\n if (await HPApi.isAlive()) {\n errorCount++;\n } else {\n deviceUp = false;\n }\n }\n\n if (errorCount === 50) {\n keepActive = false;\n }\n\n if (!deviceUp) {\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n } else {\n await delay(1000);\n }\n }\n}\n\nasync function adfAutoscanCmd(\n adfAutoScanConfig: AdfAutoScanConfig,\n deviceUpPollingInterval: number\n) {\n // first make sure the device is reachable\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n let deviceUp = true;\n\n const folder = await PathHelper.getOutputFolder(\n adfAutoScanConfig.directoryConfig.directory\n );\n console.log(`Target folder: ${folder}`);\n\n const tempFolder = await PathHelper.getOutputFolder(\n adfAutoScanConfig.directoryConfig.tempDirectory\n );\n console.log(`Temp folder: ${tempFolder}`);\n\n let scanCount = 0;\n let keepActive = true;\n let errorCount = 0;\n while (keepActive) {\n console.log(`Running iteration: ${iteration} - errorCount: ${errorCount}`);\n try {\n await waitAdfLoaded(\n adfAutoScanConfig.pollingInterval,\n adfAutoScanConfig.startScanDelay\n );\n\n scanCount++;\n\n console.log(`Scan event captured, saving scan #${scanCount}`);\n\n await scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig);\n } catch (e) {\n console.log(e);\n if (await HPApi.isAlive()) {\n errorCount++;\n } else {\n deviceUp = false;\n }\n }\n\n if (errorCount === 50) {\n keepActive = false;\n }\n\n if (!deviceUp) {\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n } else {\n await delay(1000);\n }\n }\n}\n\nasync function clearRegistrationsCmd(cmd: Command) {\n const parentOption = cmd.parent!.opts();\n\n const ip = await getDeviceIp(parentOption);\n HPApi.setDeviceIP(ip);\n\n const isDebug = getIsDebug(parentOption);\n HPApi.setDebug(isDebug);\n await clearRegistrations();\n}\n\nfunction findOfficejetIp(deviceNamePrefix: string): Promise<string> {\n return new Promise((resolve) => {\n const bonjour = Bonjour();\n console.log(\"Searching device...\");\n let browser = bonjour.find(\n {\n type: \"http\",\n },\n (service) => {\n console.log(\".\");\n if (\n service.name.startsWith(deviceNamePrefix) &&\n service.port === 80 &&\n service.type === \"http\" &&\n service.addresses != null\n ) {\n browser.stop();\n bonjour.destroy();\n console.log(`Found: ${service.name}`);\n resolve(service.addresses[0]);\n }\n }\n );\n browser.start();\n });\n}\n\nfunction getConfig<T>(name: string): T | undefined {\n return config.has(name) ? config.get<T>(name) : undefined;\n}\n\nfunction setupScanParameters(command: Command): Command {\n command.option(\n \"-d, --directory <dir>\",\n \"Directory where scans are saved (default: /tmp/scan-to-pc<random>)\"\n );\n command.option(\n \"-t, --temp-directory <dir>\",\n \"Temp directory used for processing (default: /tmp/scan-to-pc<random>)\"\n );\n command.option(\n \"-p, --pattern <pattern>\",\n 'Pattern for filename (i.e. \"scan\"_dd.mm.yyyy_hh:MM:ss, without this its scanPage<number>)'\n );\n command.option(\n \"-r, --resolution <dpi>\",\n \"Resolution in DPI of the scans (default: 200)\"\n );\n return command;\n}\n\nfunction setupParameterOpts(command: Command): Command {\n command.option(\n \"-ip, --address <ip>\",\n \"IP address of the device (this overrides -p)\"\n );\n command.option(\n \"--device-up-polling-interval <deviceUpPollingInterval>\",\n \"Device up polling interval in milliseconds\",\n parseFloat\n );\n command.option(\n \"-n, --name <name>\",\n \"Name of the device for service discovery\"\n ); // i.e. 'Deskjet 3520 series'\n\n command.option(\"-D, --debug\", \"Enable debug\");\n return command;\n}\n\nasync function getDeviceIp(options: OptionValues) {\n let ip = options.address || getConfig(\"ip\");\n if (!ip) {\n const name = options.name || getConfig(\"name\");\n ip = await findOfficejetIp(name || \"HP Smart Tank Plus 570 series\");\n }\n console.log(`Using device ip: ${ip}`);\n return ip;\n}\n\nfunction getIsDebug(options: OptionValues) {\n const debug =\n options.debug != null ? true : getConfig<boolean>(\"debug\") || false;\n\n if (debug) {\n console.log(`IsDebug: ${debug}`);\n }\n return debug;\n}\n\nfunction getScanConfiguration(parentOption: OptionValues) {\n const directoryConfig: DirectoryConfig = {\n directory: parentOption.directory || getConfig(\"directory\"),\n tempDirectory: parentOption.tempDirectory || getConfig(\"tempDirectory\"),\n filePattern: parentOption.pattern || getConfig(\"pattern\"),\n };\n\n const scanConfig: ScanConfig = {\n resolution: parseInt(\n parentOption.resolution || getConfig(\"resolution\") || 200,\n 10\n ),\n directoryConfig,\n };\n return scanConfig;\n}\n\nfunction getDeviceUpPollingInterval(parentOption: OptionValues) {\n return (\n parentOption.deviceUpPollingInterval ||\n getConfig(\"deviceUpPollingInterval\") ||\n 1000\n );\n}\n\n\nasync function main() {\n setupParameterOpts(program);\n const cmdListen = program.createCommand(\"listen\");\n setupScanParameters(cmdListen)\n .description(\"Listen the device for new scan job to save to this target\")\n .option(\n \"-l, --label <label>\",\n \"The label to display on the device (the default is the hostname)\"\n )\n .action(async (options, cmd) => {\n const parentOption = cmd.parent.opts();\n\n const ip = await getDeviceIp(parentOption);\n HPApi.setDeviceIP(ip);\n\n const isDebug = getIsDebug(parentOption);\n HPApi.setDebug(isDebug);\n\n const registrationConfig: RegistrationConfig = {\n label: options.label || getConfig(\"label\") || os.hostname(),\n };\n\n const deviceUpPollingInterval = getDeviceUpPollingInterval(parentOption);\n\n const scanConfig = getScanConfiguration(parentOption);\n\n await listenCmd(registrationConfig, scanConfig, deviceUpPollingInterval);\n });\n program.addCommand(cmdListen, { isDefault: true });\n\n const cmdAdfAutoscan = program.createCommand(\"adf-autoscan\");\n setupScanParameters(cmdAdfAutoscan)\n .addOption(\n new Option(\"--duplex\", \"If specified, the scan will be in duplex\")\n )\n .addOption(\n new Option(\n \"--pdf\",\n \"If specified, the scan result will be a pdf document, the default is multiple jpeg files\"\n )\n )\n .addOption(\n new Option(\n \"--pollingInterval <pollingInterval>\",\n \"Time interval in millisecond between each lookup for content in the automatic document feeder\",\n )\n )\n .description(\n \"Automatically trigger a new scan job to this target once paper is detected in the automatic document feeder (adf)\"\n )\n .addOption(\n new Option(\n \"--start-scan-delay <startScanDelay>\",\n \"Once document are detected to be in the adf, this specify the wait delay in millisecond before triggering the scan\",\n )\n )\n .description(\n \"Automatically trigger a new scan job to this target once paper is detected in the automatic document feeder (adf)\"\n )\n .action(async (options, cmd) => {\n const parentOption = cmd.parent.opts();\n\n const ip = await getDeviceIp(parentOption);\n HPApi.setDeviceIP(ip);\n\n const isDebug = getIsDebug(parentOption);\n HPApi.setDebug(isDebug);\n\n const deviceUpPollingInterval = getDeviceUpPollingInterval(parentOption);\n\n const scanConfig = getScanConfiguration(parentOption);\n\n const adfScanConfig: AdfAutoScanConfig = {\n ...scanConfig,\n isDuplex: options.isDuplex || getConfig(\"autoscan_duplex\") || false,\n generatePdf: options.pdf || getConfig(\"autoscan_pdf\") || false,\n pollingInterval:\n options.pollingInterval || getConfig(\"autoscan_pollingInterval\") || 1000,\n startScanDelay:\n options.startScanDelay || getConfig(\"autoscan_startScanDelay\") || 5000,\n };\n\n await adfAutoscanCmd(adfScanConfig, deviceUpPollingInterval);\n });\n program.addCommand(cmdAdfAutoscan);\n\n const cmdClearRegistrations = program.createCommand(\"clear-registrations\");\n cmdClearRegistrations\n .description(\"Clear the list or registered target on the device\")\n .action(async (options, cmd) => {\n await clearRegistrationsCmd(cmd);\n });\n program.addCommand(cmdClearRegistrations);\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => console.log(err));\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n// noinspection XmlDeprecatedElement,HtmlDeprecatedTag\n\n\"use strict\";\n\nimport os from \"os\";\nimport { Command, Option, OptionValues, program } from \"commander\";\nimport Bonjour from \"bonjour\";\nimport config from \"config\";\nimport HPApi from \"./HPApi\";\nimport PathHelper from \"./PathHelper\";\nimport { delay } from \"./delay\";\nimport { readDeviceCapabilities } from \"./readDeviceCapabilities\";\nimport {\n clearRegistrations,\n RegistrationConfig,\n waitScanEvent,\n} from \"./listening\";\nimport {\n AdfAutoScanConfig,\n DirectoryConfig,\n saveScan,\n ScanConfig,\n scanFromAdf,\n waitAdfLoaded,\n} from \"./scanProcessing\";\n\nlet iteration = 0;\n\nasync function listenCmd(\n registrationConfig: RegistrationConfig,\n scanConfig: ScanConfig,\n deviceUpPollingInterval: number,\n) {\n // first make sure the device is reachable\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n let deviceUp = true;\n\n const folder = await PathHelper.getOutputFolder(\n scanConfig.directoryConfig.directory,\n );\n console.log(`Target folder: ${folder}`);\n\n const tempFolder = await PathHelper.getOutputFolder(\n scanConfig.directoryConfig.tempDirectory,\n );\n console.log(`Temp folder: ${tempFolder}`);\n\n const deviceCapabilities = await readDeviceCapabilities();\n\n let scanCount = 0;\n let keepActive = true;\n let errorCount = 0;\n while (keepActive) {\n console.log(`Running iteration: ${iteration} - errorCount: ${errorCount}`);\n try {\n const event = await waitScanEvent(deviceCapabilities, registrationConfig);\n scanCount = await PathHelper.getNextScanNumber(\n folder,\n scanCount,\n scanConfig.directoryConfig.filePattern,\n );\n console.log(`Scan event captured, saving scan #${scanCount}`);\n await saveScan(\n event,\n folder,\n tempFolder,\n scanCount,\n deviceCapabilities,\n scanConfig,\n );\n } catch (e) {\n console.log(e);\n if (await HPApi.isAlive()) {\n errorCount++;\n } else {\n deviceUp = false;\n }\n }\n\n if (errorCount === 50) {\n keepActive = false;\n }\n\n if (!deviceUp) {\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n } else {\n await delay(1000);\n }\n }\n}\n\nasync function adfAutoscanCmd(\n adfAutoScanConfig: AdfAutoScanConfig,\n deviceUpPollingInterval: number,\n) {\n // first make sure the device is reachable\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n let deviceUp = true;\n\n const folder = await PathHelper.getOutputFolder(\n adfAutoScanConfig.directoryConfig.directory,\n );\n console.log(`Target folder: ${folder}`);\n\n const tempFolder = await PathHelper.getOutputFolder(\n adfAutoScanConfig.directoryConfig.tempDirectory,\n );\n console.log(`Temp folder: ${tempFolder}`);\n\n const deviceCapabilities = await readDeviceCapabilities();\n\n let scanCount = 0;\n let keepActive = true;\n let errorCount = 0;\n while (keepActive) {\n console.log(`Running iteration: ${iteration} - errorCount: ${errorCount}`);\n try {\n await waitAdfLoaded(\n adfAutoScanConfig.pollingInterval,\n adfAutoScanConfig.startScanDelay,\n );\n\n scanCount++;\n\n console.log(`Scan event captured, saving scan #${scanCount}`);\n\n await scanFromAdf(\n scanCount,\n folder,\n tempFolder,\n adfAutoScanConfig,\n deviceCapabilities,\n new Date()\n );\n } catch (e) {\n console.log(e);\n if (await HPApi.isAlive()) {\n errorCount++;\n } else {\n deviceUp = false;\n }\n }\n\n if (errorCount === 50) {\n keepActive = false;\n }\n\n if (!deviceUp) {\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n } else {\n await delay(1000);\n }\n }\n}\n\nasync function clearRegistrationsCmd(cmd: Command) {\n const parentOption = cmd.parent!.opts();\n\n const ip = await getDeviceIp(parentOption);\n HPApi.setDeviceIP(ip);\n\n const isDebug = getIsDebug(parentOption);\n HPApi.setDebug(isDebug);\n await clearRegistrations();\n}\n\nfunction findOfficejetIp(deviceNamePrefix: string): Promise<string> {\n return new Promise((resolve) => {\n const bonjour = Bonjour();\n console.log(\"Searching device...\");\n let browser = bonjour.find(\n {\n type: \"http\",\n },\n (service) => {\n console.log(\".\");\n if (\n service.name.startsWith(deviceNamePrefix) &&\n service.port === 80 &&\n service.type === \"http\" &&\n service.addresses != null\n ) {\n browser.stop();\n bonjour.destroy();\n console.log(`Found: ${service.name}`);\n resolve(service.addresses[0]);\n }\n },\n );\n browser.start();\n });\n}\n\nfunction getConfig<T>(name: string): T | undefined {\n return config.has(name) ? config.get<T>(name) : undefined;\n}\n\nfunction setupScanParameters(command: Command): Command {\n command.option(\n \"-d, --directory <dir>\",\n \"Directory where scans are saved (default: /tmp/scan-to-pc<random>)\",\n );\n command.option(\n \"-t, --temp-directory <dir>\",\n \"Temp directory used for processing (default: /tmp/scan-to-pc<random>)\",\n );\n command.option(\n \"-p, --pattern <pattern>\",\n 'Pattern for filename (i.e. \"scan\"_dd.mm.yyyy_hh:MM:ss, without this its scanPage<number>)',\n );\n command.option(\n \"-r, --resolution <dpi>\",\n \"Resolution in DPI of the scans (default: 200)\",\n );\n command.option(\n \"-w, --width <width>\",\n \"With in pixel of the scans (default: 2481)\",\n );\n command.option(\n \"-h, --height <height>\",\n \"Height in pixel of the scans (default: 3507)\",\n );\n return command;\n}\n\nfunction setupParameterOpts(command: Command): Command {\n command.option(\n \"-ip, --address <ip>\",\n \"IP address of the device (this overrides -p)\",\n );\n command.option(\n \"--device-up-polling-interval <deviceUpPollingInterval>\",\n \"Device up polling interval in milliseconds\",\n parseFloat,\n );\n command.option(\n \"-n, --name <name>\",\n \"Name of the device for service discovery\",\n ); // i.e. 'Deskjet 3520 series'\n\n command.option(\"-D, --debug\", \"Enable debug\");\n return command;\n}\n\nasync function getDeviceIp(options: OptionValues) {\n let ip = options.address || getConfig(\"ip\");\n if (!ip) {\n const name = options.name || getConfig(\"name\");\n ip = await findOfficejetIp(name || \"HP Smart Tank Plus 570 series\");\n }\n console.log(`Using device ip: ${ip}`);\n return ip;\n}\n\nfunction getIsDebug(options: OptionValues) {\n const debug =\n options.debug != null ? true : getConfig<boolean>(\"debug\") || false;\n\n if (debug) {\n console.log(`IsDebug: ${debug}`);\n }\n return debug;\n}\n\nfunction getScanConfiguration(parentOption: OptionValues) {\n const directoryConfig: DirectoryConfig = {\n directory: parentOption.directory || getConfig(\"directory\"),\n tempDirectory: parentOption.tempDirectory || getConfig(\"tempDirectory\"),\n filePattern: parentOption.pattern || getConfig(\"pattern\"),\n };\n\n const configWidth = (\n parentOption.width ||\n getConfig(\"width\") ||\n 0\n ).toString();\n const width =\n configWidth.toLowerCase() === \"max\"\n ? Number.MAX_SAFE_INTEGER\n : parseInt(configWidth, 10);\n\n const configHeight = (\n parentOption.width ||\n getConfig(\"height\") ||\n \"0\"\n ).toString();\n const height =\n configWidth.toLowerCase() === \"max\"\n ? Number.MAX_SAFE_INTEGER\n : parseInt(configHeight, 10);\n\n const scanConfig: ScanConfig = {\n resolution: parseInt(\n parentOption.resolution || getConfig(\"resolution\") || \"200\",\n 10,\n ),\n width: width,\n height: height,\n directoryConfig,\n };\n return scanConfig;\n}\n\nfunction getDeviceUpPollingInterval(parentOption: OptionValues) {\n return (\n parentOption.deviceUpPollingInterval ||\n getConfig(\"deviceUpPollingInterval\") ||\n 1000\n );\n}\n\nasync function main() {\n setupParameterOpts(program);\n const cmdListen = program.createCommand(\"listen\");\n setupScanParameters(cmdListen)\n .description(\"Listen the device for new scan job to save to this target\")\n .option(\n \"-l, --label <label>\",\n \"The label to display on the device (the default is the hostname)\",\n )\n .action(async (options, cmd) => {\n const parentOption = cmd.parent.opts();\n\n const ip = await getDeviceIp(parentOption);\n HPApi.setDeviceIP(ip);\n\n const isDebug = getIsDebug(parentOption);\n HPApi.setDebug(isDebug);\n\n const registrationConfig: RegistrationConfig = {\n label: options.label || getConfig(\"label\") || os.hostname(),\n };\n\n const deviceUpPollingInterval = getDeviceUpPollingInterval(parentOption);\n\n const scanConfig = getScanConfiguration(options);\n\n await listenCmd(registrationConfig, scanConfig, deviceUpPollingInterval);\n });\n program.addCommand(cmdListen, { isDefault: true });\n\n const cmdAdfAutoscan = program.createCommand(\"adf-autoscan\");\n setupScanParameters(cmdAdfAutoscan)\n .addOption(\n new Option(\"--duplex\", \"If specified, the scan will be in duplex\"),\n )\n .addOption(\n new Option(\n \"--pdf\",\n \"If specified, the scan result will be a pdf document, the default is multiple jpeg files\",\n ),\n )\n .addOption(\n new Option(\n \"--pollingInterval <pollingInterval>\",\n \"Time interval in millisecond between each lookup for content in the automatic document feeder\",\n ),\n )\n .description(\n \"Automatically trigger a new scan job to this target once paper is detected in the automatic document feeder (adf)\",\n )\n .addOption(\n new Option(\n \"--start-scan-delay <startScanDelay>\",\n \"Once document are detected to be in the adf, this specify the wait delay in millisecond before triggering the scan\",\n ),\n )\n .description(\n \"Automatically trigger a new scan job to this target once paper is detected in the automatic document feeder (adf)\",\n )\n .action(async (options, cmd) => {\n const parentOption = cmd.parent.opts();\n\n const ip = await getDeviceIp(parentOption);\n HPApi.setDeviceIP(ip);\n\n const isDebug = getIsDebug(parentOption);\n HPApi.setDebug(isDebug);\n\n const deviceUpPollingInterval = getDeviceUpPollingInterval(parentOption);\n\n const scanConfig = getScanConfiguration(options);\n\n const adfScanConfig: AdfAutoScanConfig = {\n ...scanConfig,\n isDuplex: options.isDuplex || getConfig(\"autoscan_duplex\") || false,\n generatePdf: options.pdf || getConfig(\"autoscan_pdf\") || false,\n pollingInterval:\n options.pollingInterval ||\n getConfig(\"autoscan_pollingInterval\") ||\n 1000,\n startScanDelay:\n options.startScanDelay ||\n getConfig(\"autoscan_startScanDelay\") ||\n 5000,\n };\n\n await adfAutoscanCmd(adfScanConfig, deviceUpPollingInterval);\n });\n program.addCommand(cmdAdfAutoscan);\n\n const cmdClearRegistrations = program.createCommand(\"clear-registrations\");\n cmdClearRegistrations\n .description(\"Clear the list or registered target on the device\")\n .action(async (options, cmd) => {\n await clearRegistrationsCmd(cmd);\n });\n program.addCommand(cmdClearRegistrations);\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => console.log(err));\n"]}
|
package/dist/listening.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listening.js","sourceRoot":"","sources":["../src/listening.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAE5B,gEAAwC;AAGjC,KAAK,UAAU,eAAe,CAAC,YAAoB;IACxD,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;QAChC,IAAI,qBAAqB,
|
|
1
|
+
{"version":3,"file":"listening.js","sourceRoot":"","sources":["../src/listening.ts"],"names":[],"mappings":"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","sourcesContent":["import HPApi from \"./HPApi\";\nimport Event from \"./Event\";\nimport Destination from \"./Destination\";\nimport { DeviceCapabilities } from \"./DeviceCapabilities\";\n\nexport async function waitScanRequest(compEventURI: string): Promise<boolean> {\n const waitMax = 50;\n for (let i = 0; i < waitMax; i++) {\n let walkupScanToCompEvent =\n await HPApi.getWalkupScanToCompEvent(compEventURI);\n let message = walkupScanToCompEvent.eventType;\n if (message === \"HostSelected\") {\n // this ok to wait\n } else if (message === \"ScanRequested\") {\n break;\n } else if (message === \"ScanNewPageRequested\") {\n break;\n } else if (message === \"ScanPagesComplete\") {\n console.log(\"no more page to scan, scan is finished\");\n return false;\n } else {\n console.log(`Unknown eventType: ${message}`);\n return false;\n }\n\n console.log(`Waiting user input: ${i + 1}/${waitMax}`);\n await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s\n }\n return true;\n}\n\nexport async function waitForScanEvent(\n resourceURI: string,\n afterEtag: string | null = null,\n): Promise<Event> {\n console.log(\"Start listening for new ScanEvent\");\n\n let eventTable = await HPApi.getEvents(afterEtag ?? \"\");\n let acceptedScanEvent = null;\n let currentEtag = eventTable.etag;\n while (acceptedScanEvent == null) {\n eventTable = await HPApi.getEvents(currentEtag, 1200);\n currentEtag = eventTable.etag;\n\n acceptedScanEvent = eventTable.eventTable.events.find(\n (ev) =>\n ev.isScanEvent &&\n ev.destinationURI &&\n ev.destinationURI.indexOf(resourceURI) >= 0,\n );\n }\n return acceptedScanEvent;\n}\n\nasync function registerWalkupScanToCompDestination(\n registrationConfig: RegistrationConfig,\n): Promise<string> {\n const walkupScanDestinations = await HPApi.getWalkupScanToCompDestinations();\n const destinations = walkupScanDestinations.destinations;\n\n console.log(\n \"Host destinations fetched:\",\n destinations.map((d) => d.name).join(\", \"),\n );\n\n const hostname = registrationConfig.label;\n const destination = destinations.find((x) => x.name === hostname);\n\n let resourceURI;\n if (destination) {\n console.log(\n `Re-using existing destination: ${hostname} - ${destination.resourceURI}`,\n );\n resourceURI = destination.resourceURI;\n } else {\n resourceURI = await HPApi.registerWalkupScanToCompDestination(\n new Destination(hostname, hostname, true),\n );\n console.log(`New Destination registered: ${hostname} - ${resourceURI}`);\n }\n\n console.log(`Using: ${hostname}`);\n\n return resourceURI;\n}\n\nasync function registerWalkupScanDestination(\n registrationConfig: RegistrationConfig,\n): Promise<string> {\n const walkupScanDestinations = await HPApi.getWalkupScanDestinations();\n const destinations = walkupScanDestinations.destinations;\n\n console.log(\n \"Host destinations fetched:\",\n destinations.map((d) => d.name).join(\", \"),\n );\n\n const hostname = registrationConfig.label;\n const destination = destinations.find((x) => x.name === hostname);\n\n let resourceURI;\n if (destination) {\n console.log(\n `Re-using existing destination: ${hostname} - ${destination.resourceURI}`,\n );\n resourceURI = destination.resourceURI;\n } else {\n resourceURI = await HPApi.registerWalkupScanDestination(\n new Destination(hostname, hostname, false),\n );\n console.log(`New Destination registered: ${hostname} - ${resourceURI}`);\n }\n\n console.log(`Using: ${hostname}`);\n\n return resourceURI;\n}\n\nexport type RegistrationConfig = {\n label: string;\n};\n\nexport async function waitScanEvent(\n deviceCapabilities: DeviceCapabilities,\n registrationConfig: RegistrationConfig,\n): Promise<Event> {\n let resourceURI: string;\n if (deviceCapabilities.useWalkupScanToComp) {\n resourceURI = await registerWalkupScanToCompDestination(registrationConfig);\n } else {\n resourceURI = await registerWalkupScanDestination(registrationConfig);\n }\n\n console.log(\"Waiting scan event for:\", resourceURI);\n return await waitForScanEvent(resourceURI);\n}\n\nexport async function clearRegistrations() {\n const dests = await HPApi.getWalkupScanToCompDestinations();\n for (let i = 0; i < dests.destinations.length; i++) {\n console.log(`Removing: ${dests.destinations[i].name}`);\n await HPApi.removeDestination(dests.destinations[i]);\n }\n}\n"]}
|
|
@@ -26,15 +26,20 @@ async function readDeviceCapabilities() {
|
|
|
26
26
|
else {
|
|
27
27
|
console.log("Unknown device!");
|
|
28
28
|
}
|
|
29
|
+
let scanCaps = null;
|
|
29
30
|
if (discoveryTree.ScanJobManifestURI != null) {
|
|
30
31
|
const scanJobManifest = await HPApi_1.default.getScanJobManifest(discoveryTree.ScanJobManifestURI);
|
|
31
32
|
if (scanJobManifest.ScanCapsURI != null) {
|
|
32
|
-
await HPApi_1.default.getScanCaps(scanJobManifest.ScanCapsURI);
|
|
33
|
+
scanCaps = await HPApi_1.default.getScanCaps(scanJobManifest.ScanCapsURI);
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
36
|
return {
|
|
36
37
|
supportsMultiItemScanFromPlaten,
|
|
37
38
|
useWalkupScanToComp: walkupScanToCompCaps != null,
|
|
39
|
+
platenMaxWidth: (scanCaps === null || scanCaps === void 0 ? void 0 : scanCaps.PlatenMaxWidth) || null,
|
|
40
|
+
platenMaxHeight: (scanCaps === null || scanCaps === void 0 ? void 0 : scanCaps.PlatenMaxHeight) || null,
|
|
41
|
+
adfMaxWidth: (scanCaps === null || scanCaps === void 0 ? void 0 : scanCaps.AdfMaxWidth) || null,
|
|
42
|
+
adfMaxHeight: (scanCaps === null || scanCaps === void 0 ? void 0 : scanCaps.AdfMaxHeight) || null,
|
|
38
43
|
};
|
|
39
44
|
}
|
|
40
45
|
exports.readDeviceCapabilities = readDeviceCapabilities;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readDeviceCapabilities.js","sourceRoot":"","sources":["../src/readDeviceCapabilities.ts"],"names":[],"mappings":";;;;;;AACA,oDAA4B;
|
|
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"]}
|
package/dist/scanProcessing.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import Event from "./Event";
|
|
2
2
|
import { DeviceCapabilities } from "./DeviceCapabilities";
|
|
3
|
+
export declare function getScanWidth(scanConfig: ScanConfig, inputSource: "Adf" | "Platen", deviceCapabilities: DeviceCapabilities): number | null;
|
|
4
|
+
export declare function getScanHeight(scanConfig: ScanConfig, inputSource: "Adf" | "Platen", deviceCapabilities: DeviceCapabilities): number | null;
|
|
3
5
|
export declare function saveScan(event: Event, folder: string, tempFolder: string, scanCount: number, deviceCapabilities: DeviceCapabilities, scanConfig: ScanConfig): Promise<void>;
|
|
4
6
|
export type DirectoryConfig = {
|
|
5
7
|
directory: string | undefined;
|
|
@@ -8,6 +10,8 @@ export type DirectoryConfig = {
|
|
|
8
10
|
};
|
|
9
11
|
export type ScanConfig = {
|
|
10
12
|
resolution: number;
|
|
13
|
+
width: number | null;
|
|
14
|
+
height: number | null;
|
|
11
15
|
directoryConfig: DirectoryConfig;
|
|
12
16
|
};
|
|
13
17
|
export type AdfAutoScanConfig = ScanConfig & {
|
|
@@ -16,5 +20,5 @@ export type AdfAutoScanConfig = ScanConfig & {
|
|
|
16
20
|
pollingInterval: number;
|
|
17
21
|
startScanDelay: number;
|
|
18
22
|
};
|
|
19
|
-
export declare function scanFromAdf(scanCount: number, folder: string, tempFolder: string, adfAutoScanConfig: AdfAutoScanConfig): Promise<void>;
|
|
23
|
+
export declare function scanFromAdf(scanCount: number, folder: string, tempFolder: string, adfAutoScanConfig: AdfAutoScanConfig, deviceCapabilities: DeviceCapabilities, date: Date): Promise<void>;
|
|
20
24
|
export declare function waitAdfLoaded(pollingInterval: number, startScanDelay: number): Promise<void>;
|
package/dist/scanProcessing.js
CHANGED
|
@@ -3,7 +3,7 @@ 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 = void 0;
|
|
6
|
+
exports.waitAdfLoaded = exports.scanFromAdf = exports.saveScan = 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"));
|
|
@@ -12,6 +12,7 @@ const ScanJobSettings_1 = __importDefault(require("./ScanJobSettings"));
|
|
|
12
12
|
const ScanContent_1 = require("./ScanContent");
|
|
13
13
|
const delay_1 = require("./delay");
|
|
14
14
|
const PathHelper_1 = __importDefault(require("./PathHelper"));
|
|
15
|
+
const InputSource_1 = require("./InputSource");
|
|
15
16
|
async function waitDeviceUntilItIsReadyToUploadOrCompleted(jobUrl) {
|
|
16
17
|
let job = null;
|
|
17
18
|
let isReadyToUpload = false;
|
|
@@ -76,19 +77,19 @@ function createScanPage(job, currentPageNumber, filePath, sizeFixed) {
|
|
|
76
77
|
width: (_a = job.imageWidth) !== null && _a !== void 0 ? _a : 0,
|
|
77
78
|
height: height !== null && height !== void 0 ? height : 0,
|
|
78
79
|
xResolution: (_b = job.xResolution) !== null && _b !== void 0 ? _b : 200,
|
|
79
|
-
yResolution: (_c = job.yResolution) !== null && _c !== void 0 ? _c : 200
|
|
80
|
+
yResolution: (_c = job.yResolution) !== null && _c !== void 0 ? _c : 200,
|
|
80
81
|
};
|
|
81
82
|
}
|
|
82
|
-
async function handleProcessingState(job, inputSource, folder, scanCount, currentPageNumber, filePattern) {
|
|
83
|
+
async function handleProcessingState(job, inputSource, folder, scanCount, currentPageNumber, filePattern, date) {
|
|
83
84
|
if (job.pageState == "ReadyToUpload" &&
|
|
84
85
|
job.binaryURL != null &&
|
|
85
86
|
job.currentPageNumber != null) {
|
|
86
87
|
console.log(`Ready to download page job page ${job.currentPageNumber} at:`, job.binaryURL);
|
|
87
|
-
const destinationFilePath = PathHelper_1.default.getFileForPage(folder, scanCount, currentPageNumber, filePattern, "jpg");
|
|
88
|
+
const destinationFilePath = PathHelper_1.default.getFileForPage(folder, scanCount, currentPageNumber, filePattern, "jpg", date);
|
|
88
89
|
const filePath = await HPApi_1.default.downloadPage(job.binaryURL, destinationFilePath);
|
|
89
90
|
console.log("Page downloaded to:", filePath);
|
|
90
91
|
let sizeFixed = null;
|
|
91
|
-
if (inputSource ==
|
|
92
|
+
if (inputSource == InputSource_1.InputSource.Adf) {
|
|
92
93
|
sizeFixed = await scanProcessing(filePath);
|
|
93
94
|
if (sizeFixed == null) {
|
|
94
95
|
console.log(`File size has not been fixed, DNF may not have been found and approximate height is: ${job.imageHeight}`);
|
|
@@ -102,7 +103,7 @@ async function handleProcessingState(job, inputSource, folder, scanCount, curren
|
|
|
102
103
|
return null;
|
|
103
104
|
}
|
|
104
105
|
}
|
|
105
|
-
async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern) {
|
|
106
|
+
async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern, date) {
|
|
106
107
|
const jobUrl = await HPApi_1.default.postJob(scanJobSettings);
|
|
107
108
|
console.log("New job created:", jobUrl);
|
|
108
109
|
let job = await HPApi_1.default.getJob(jobUrl);
|
|
@@ -112,7 +113,7 @@ async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, s
|
|
|
112
113
|
continue;
|
|
113
114
|
}
|
|
114
115
|
if (job.jobState === "Processing") {
|
|
115
|
-
const page = await handleProcessingState(job, inputSource, folder, scanCount, scanJobContent.elements.length + 1, filePattern);
|
|
116
|
+
const page = await handleProcessingState(job, inputSource, folder, scanCount, scanJobContent.elements.length + 1, filePattern, date);
|
|
116
117
|
job = await HPApi_1.default.getJob(jobUrl);
|
|
117
118
|
if (page != null && job.jobState != "Canceled") {
|
|
118
119
|
scanJobContent.elements.push(page);
|
|
@@ -154,12 +155,12 @@ async function waitScanNewPageRequest(compEventURI) {
|
|
|
154
155
|
}
|
|
155
156
|
return startNewScanJob;
|
|
156
157
|
}
|
|
157
|
-
async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount, scanJobContent, firstEvent, deviceCapabilities, filePattern) {
|
|
158
|
-
let jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern);
|
|
158
|
+
async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount, scanJobContent, firstEvent, deviceCapabilities, filePattern, date) {
|
|
159
|
+
let jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern, date);
|
|
159
160
|
let lastEvent = firstEvent;
|
|
160
161
|
if (jobState === "Completed" &&
|
|
161
162
|
lastEvent.compEventURI &&
|
|
162
|
-
inputSource !==
|
|
163
|
+
inputSource !== InputSource_1.InputSource.Adf &&
|
|
163
164
|
lastEvent.destinationURI &&
|
|
164
165
|
deviceCapabilities.supportsMultiItemScanFromPlaten) {
|
|
165
166
|
lastEvent = await (0, listening_1.waitForScanEvent)(lastEvent.destinationURI, lastEvent.agingStamp);
|
|
@@ -168,7 +169,7 @@ async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount,
|
|
|
168
169
|
}
|
|
169
170
|
let startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);
|
|
170
171
|
while (startNewScanJob) {
|
|
171
|
-
jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern);
|
|
172
|
+
jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern, new Date());
|
|
172
173
|
if (jobState !== "Completed") {
|
|
173
174
|
return;
|
|
174
175
|
}
|
|
@@ -183,9 +184,9 @@ async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount,
|
|
|
183
184
|
}
|
|
184
185
|
}
|
|
185
186
|
}
|
|
186
|
-
async function mergeToPdf(folder, scanCount, scanJobContent, filePattern) {
|
|
187
|
+
async function mergeToPdf(folder, scanCount, scanJobContent, filePattern, date) {
|
|
187
188
|
if (scanJobContent.elements.length > 0) {
|
|
188
|
-
const pdfFilePath = PathHelper_1.default.getFileForScan(folder, scanCount, filePattern, "pdf");
|
|
189
|
+
const pdfFilePath = PathHelper_1.default.getFileForScan(folder, scanCount, filePattern, "pdf", date);
|
|
189
190
|
await (0, ScanContent_1.createPdfFrom)(scanJobContent, pdfFilePath);
|
|
190
191
|
scanJobContent.elements.forEach((e) => promises_1.default.unlink(e.path));
|
|
191
192
|
return pdfFilePath;
|
|
@@ -219,6 +220,40 @@ function isPdf(destination) {
|
|
|
219
220
|
return false;
|
|
220
221
|
}
|
|
221
222
|
}
|
|
223
|
+
function getScanWidth(scanConfig, inputSource, deviceCapabilities) {
|
|
224
|
+
if (scanConfig.width && scanConfig.width > 0) {
|
|
225
|
+
const maxWidth = inputSource === "Adf"
|
|
226
|
+
? deviceCapabilities.adfMaxWidth
|
|
227
|
+
: deviceCapabilities.platenMaxWidth;
|
|
228
|
+
if (maxWidth && scanConfig.width > maxWidth) {
|
|
229
|
+
return maxWidth;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
return scanConfig.width;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
exports.getScanWidth = getScanWidth;
|
|
240
|
+
function getScanHeight(scanConfig, inputSource, deviceCapabilities) {
|
|
241
|
+
if (scanConfig.height && scanConfig.height > 0) {
|
|
242
|
+
const maxHeight = inputSource === "Adf"
|
|
243
|
+
? deviceCapabilities.adfMaxHeight
|
|
244
|
+
: deviceCapabilities.platenMaxHeight;
|
|
245
|
+
if (maxHeight && scanConfig.height > maxHeight) {
|
|
246
|
+
return maxHeight;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
return scanConfig.height;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.getScanHeight = getScanHeight;
|
|
222
257
|
async function saveScan(event, folder, tempFolder, scanCount, deviceCapabilities, scanConfig) {
|
|
223
258
|
if (event.compEventURI) {
|
|
224
259
|
const proceedToScan = await (0, listening_1.waitScanRequest)(event.compEventURI);
|
|
@@ -251,12 +286,15 @@ async function saveScan(event, folder, tempFolder, scanCount, deviceCapabilities
|
|
|
251
286
|
const scanStatus = await HPApi_1.default.getScanStatus();
|
|
252
287
|
console.log("Afd is : " + scanStatus.adfState);
|
|
253
288
|
const inputSource = scanStatus.getInputSource();
|
|
254
|
-
const
|
|
289
|
+
const scanWidth = getScanWidth(scanConfig, inputSource, deviceCapabilities);
|
|
290
|
+
const scanHeight = getScanHeight(scanConfig, inputSource, deviceCapabilities);
|
|
291
|
+
const scanJobSettings = new ScanJobSettings_1.default(inputSource, contentType, scanConfig.resolution, scanWidth, scanHeight, isDuplex);
|
|
255
292
|
const scanJobContent = { elements: [] };
|
|
256
|
-
|
|
293
|
+
const scanDate = new Date();
|
|
294
|
+
await executeScanJobs(scanJobSettings, inputSource, destinationFolder, scanCount, scanJobContent, event, deviceCapabilities, scanConfig.directoryConfig.filePattern, scanDate);
|
|
257
295
|
console.log(`Scan of page(s) completed totalPages: ${scanJobContent.elements.length}:`);
|
|
258
296
|
if (toPdf) {
|
|
259
|
-
const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, scanConfig.directoryConfig.filePattern);
|
|
297
|
+
const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, scanConfig.directoryConfig.filePattern, scanDate);
|
|
260
298
|
displayPdfScan(pdfFilePath, scanJobContent);
|
|
261
299
|
}
|
|
262
300
|
else {
|
|
@@ -264,7 +302,7 @@ async function saveScan(event, folder, tempFolder, scanCount, deviceCapabilities
|
|
|
264
302
|
}
|
|
265
303
|
}
|
|
266
304
|
exports.saveScan = saveScan;
|
|
267
|
-
async function scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig) {
|
|
305
|
+
async function scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig, deviceCapabilities, date) {
|
|
268
306
|
let destinationFolder;
|
|
269
307
|
let contentType;
|
|
270
308
|
if (adfAutoScanConfig.generatePdf) {
|
|
@@ -276,12 +314,14 @@ async function scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig) {
|
|
|
276
314
|
contentType = "Photo";
|
|
277
315
|
destinationFolder = folder;
|
|
278
316
|
}
|
|
279
|
-
const
|
|
317
|
+
const scanWidth = getScanWidth(adfAutoScanConfig, "Adf", deviceCapabilities);
|
|
318
|
+
const scanHeight = getScanHeight(adfAutoScanConfig, "Adf", deviceCapabilities);
|
|
319
|
+
const scanJobSettings = new ScanJobSettings_1.default(InputSource_1.InputSource.Adf, contentType, adfAutoScanConfig.resolution, scanWidth, scanHeight, adfAutoScanConfig.isDuplex);
|
|
280
320
|
const scanJobContent = { elements: [] };
|
|
281
|
-
await executeScanJob(scanJobSettings,
|
|
282
|
-
console.log(`Scan of page(s) completed
|
|
321
|
+
await executeScanJob(scanJobSettings, InputSource_1.InputSource.Adf, destinationFolder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern, date);
|
|
322
|
+
console.log(`Scan of page(s) completed, total pages: ${scanJobContent.elements.length}:`);
|
|
283
323
|
if (adfAutoScanConfig.generatePdf) {
|
|
284
|
-
const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern);
|
|
324
|
+
const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern, date);
|
|
285
325
|
displayPdfScan(pdfFilePath, scanJobContent);
|
|
286
326
|
}
|
|
287
327
|
else {
|
|
@@ -1 +1 @@
|
|
|
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 { createPdfFrom, ScanContent, ScanPage } from \"./ScanContent\";\nimport Job from \"./Job\";\nimport { delay } from \"./delay\";\nimport PathHelper from \"./PathHelper\";\nimport ScanStatus from \"./ScanStatus\";\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: \"Adf\" | \"Platen\",\n folder: string,\n scanCount: number,\n currentPageNumber: number,\n filePattern: string | undefined\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 );\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 == \"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: \"Adf\" | \"Platen\",\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 );\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 = await HPApi.getWalkupScanToCompEvent(\n compEventURI\n );\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: \"Adf\" | \"Platen\",\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 !== \"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): Promise<string | null> {\n if (scanJobContent.elements.length > 0) {\n const pdfFilePath = PathHelper.getFileForScan(\n folder,\n scanCount,\n filePattern,\n \"pdf\"\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 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 console.log(\"Afd is : \" + scanStatus.adfState);\n\n const inputSource = scanStatus.getInputSource();\n\n const scanJobSettings = new ScanJobSettings(\n inputSource,\n contentType,\n scanConfig.resolution,\n isDuplex\n );\n\n const scanJobContent: ScanContent = { elements: [] };\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 );\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 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) {\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 scanJobSettings = new ScanJobSettings(\n \"Adf\",\n contentType,\n adfAutoScanConfig.resolution,\n adfAutoScanConfig.isDuplex\n );\n\n const scanJobContent: ScanContent = { elements: [] };\n\n await executeScanJob(\n scanJobSettings,\n \"Adf\",\n destinationFolder,\n scanCount,\n scanJobContent,\n adfAutoScanConfig.directoryConfig.filePattern\n );\n\n console.log(\n `Scan of page(s) completed totalPages: ${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 );\n displayPdfScan(pdfFilePath, scanJobContent);\n } else {\n displayJpegScan(scanJobContent);\n }\n}\n\nexport async function waitAdfLoaded(pollingInterval: number, startScanDelay: number) {\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}"]}
|
|
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 { 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 date: Date,\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 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 date: Date,\n) {\n let jobState = await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent,\n filePattern,\n date,\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 new Date(),\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: \"Adf\" | \"Platen\",\n deviceCapabilities: DeviceCapabilities,\n) {\n if (scanConfig.width && scanConfig.width > 0) {\n const maxWidth =\n 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: \"Adf\" | \"Platen\",\n deviceCapabilities: DeviceCapabilities,\n) {\n if (scanConfig.height && scanConfig.height > 0) {\n const maxHeight =\n 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 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 scanDate,\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(adfAutoScanConfig, \"Adf\", deviceCapabilities);\n const scanHeight = getScanHeight(\n adfAutoScanConfig,\n \"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 date,\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"]}
|