68 lines
3.1 KiB
TypeScript
68 lines
3.1 KiB
TypeScript
import path from "node:path"
|
|
import { fileURLToPath } from "node:url"
|
|
import { AgentConfig, ScanResult } from "../types.js"
|
|
import { runCommand } from "../commands.js"
|
|
|
|
const agentRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..")
|
|
const documentScript = path.join(agentRoot, "scripts/scan_document.py")
|
|
|
|
type ProcessingOptions = { ocr: boolean; ocrLanguage: string; backgroundCleanup: boolean }
|
|
|
|
export const checkScanRuntime = async (config: AgentConfig, postprocess: boolean, options: ProcessingOptions) => {
|
|
const args = [documentScript, "--check-runtime", "--ocr-language", options.ocrLanguage]
|
|
if (postprocess) args.push("--postprocess")
|
|
if (config.postprocessStrict) args.push("--strict")
|
|
if (options.backgroundCleanup) args.push("--background-cleanup")
|
|
if (options.ocr) args.push("--ocr")
|
|
try {
|
|
const result = await runCommand(config.postprocessPython, args, { timeoutMs: 10_000 })
|
|
if (result.code === 0) return
|
|
throw new Error(result.stderr.trim())
|
|
} catch (error) {
|
|
// Report missing runtimes before the scanner consumes any paper.
|
|
const detail = error instanceof Error ? error.message : String(error)
|
|
throw new Error("Scan-Verarbeitung nicht verfügbar. Bitte den Agenten mit Python/Pillow, OpenCV und Tesseract samt OCR-Sprachpaketen installieren. " + detail)
|
|
}
|
|
}
|
|
|
|
export const processingCapabilities = async (config: AgentConfig) => {
|
|
const available = async (options: ProcessingOptions) => {
|
|
try { await checkScanRuntime(config, false, options); return true } catch { return false }
|
|
}
|
|
const [ocr, backgroundCleanup] = await Promise.all([
|
|
available({ ocr: true, ocrLanguage: config.scanOcrLanguage, backgroundCleanup: false }),
|
|
available({ ocr: false, ocrLanguage: config.scanOcrLanguage, backgroundCleanup: true }),
|
|
])
|
|
return { ocr, backgroundCleanup }
|
|
}
|
|
|
|
export const createScanDocument = async (
|
|
config: AgentConfig,
|
|
pages: string[],
|
|
outputPath: string,
|
|
resolution: number,
|
|
postprocess: boolean,
|
|
profile: AgentConfig["postprocessProfile"],
|
|
options: ProcessingOptions
|
|
): Promise<ScanResult> => {
|
|
const args = [documentScript, "--output", outputPath, "--resolution", String(resolution), "--profile", profile]
|
|
if (postprocess) args.push("--postprocess")
|
|
if (config.postprocessStrict) args.push("--strict")
|
|
if (options.backgroundCleanup) args.push("--background-cleanup")
|
|
if (options.ocr) args.push("--ocr", "--ocr-language", options.ocrLanguage)
|
|
args.push("--inputs", ...pages)
|
|
|
|
const result = await runCommand(config.postprocessPython, args, {
|
|
timeoutMs: config.scanTimeoutSeconds * 1000,
|
|
})
|
|
if (result.code !== 0) throw new Error(result.stderr || "Scan-Datei konnte nicht erstellt werden")
|
|
|
|
const details = JSON.parse(result.stdout) as { pageCount: number; warnings: string[] }
|
|
return {
|
|
path: outputPath,
|
|
filename: path.basename(outputPath),
|
|
mimeType: outputPath.endsWith(".pdf") ? "application/pdf" : outputPath.endsWith(".png") ? "image/png" : "image/tiff",
|
|
...details,
|
|
}
|
|
}
|