import express,
{ Request, Response
} from
'express'; import bodyParser from 'body-parser';
import multer from 'multer';
import tesseract from 'node-tesseract-ocr';
import sharp from 'sharp';
const upload = multer({ storage: multer.memoryStorage() });
const app = express();
const tesseractConfig = {
lang: 'eng',
oem: 3,
psm: 12,
tessedit_char_whitelist: "'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,.?; ¢'"
};
app.use(bodyParser.text()); // To parse JSON bodies
app.
get('/',
(req
: Request, res
: Response
) => { res.send('WhatTheHex?');
});
app.post('/ocr', upload.array('images', 50), async (req, res) => {
if (!req.files || req.files.length === 0) {
return res.status(400).send('No image files uploaded.');
}
try {
// Process each image file
const results = await Promise.all(
(req.
files as Express.
Multer.
File[]).
map(async file
=> { const ocrText = await processImage(file.buffer, `${file.originalname}`);
const { decodedText, hexStrings } = processText(ocrText);
return { ocrText, decodedText, hexStrings };
})
);
// Send combined response
res.type('application/json');
res.send(results);
} catch (error) {
res.status(500).send(error.message);
}
});
const PORT: string | number = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
function hexToAscii(hexString: string): string {
let asciiString = '';
for (let i = 0; i < hexString.length; i += 2) {
const hexChar = hexString.substring(i, i + 2);
asciiString
+= String.
fromCharCode(parseInt
(hexChar,
16)); }
return asciiString;
}
async function processImage(buffer: Buffer, fileName: string): Promise<string> {
try {
const processedBuffer = await sharp(buffer)
.rotate()
//.grayscale()
//.sharpen()
//.normalise()
.threshold(150)
//.negate()
//.clahe({ width: 3, height: 3 })
//.linear(-1, 255)
.toBuffer();
await sharp(processedBuffer).toFile('processed_' + fileName);
let ocrText = await tesseract.recognize(processedBuffer, tesseractConfig);
// Remove newline characters
ocrText = ocrText.replace(/\n/g, ' ');
ocrText = ocrText.replace('¢', 'c');
return ocrText;
} catch (error) {
throw new Error('Error processing image: ' + error.
message); }
}
function processText(input: string): { decodedText: string; hexStrings: string[] } {
const hexPattern = /[0-9a-fA-F]{6,}/g;
let decodedText = '';
let hexStrings: string[] = [];
const matches = input.match(hexPattern);
if (matches) {
// Concatenate all matches into a single string
const combinedHex = matches.join('').replace(/\s/g, '');
decodedText = hexToAscii(combinedHex);
// Keep the original hex strings for reference
hexStrings = matches;
}
return { decodedText, hexStrings };
}
aW1wb3J0IGV4cHJlc3MsIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJzsKaW1wb3J0IGJvZHlQYXJzZXIgZnJvbSAnYm9keS1wYXJzZXInOwppbXBvcnQgbXVsdGVyIGZyb20gJ211bHRlcic7CmltcG9ydCB0ZXNzZXJhY3QgZnJvbSAnbm9kZS10ZXNzZXJhY3Qtb2NyJzsKaW1wb3J0IHNoYXJwIGZyb20gJ3NoYXJwJzsKY29uc3QgdXBsb2FkID0gbXVsdGVyKHsgc3RvcmFnZTogbXVsdGVyLm1lbW9yeVN0b3JhZ2UoKSB9KTsKY29uc3QgYXBwID0gZXhwcmVzcygpOwpjb25zdCB0ZXNzZXJhY3RDb25maWcgPSB7CiAgbGFuZzogJ2VuZycsCiAgb2VtOiAzLAogIHBzbTogMTIsCiAgdGVzc2VkaXRfY2hhcl93aGl0ZWxpc3Q6ICInQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODksLj87IMKiJyIKCn07CgphcHAudXNlKGJvZHlQYXJzZXIudGV4dCgpKTsgLy8gVG8gcGFyc2UgSlNPTiBib2RpZXMKCmFwcC5nZXQoJy8nLCAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7CiAgcmVzLnNlbmQoJ1doYXRUaGVIZXg/Jyk7Cn0pOwoKYXBwLnBvc3QoJy9vY3InLCB1cGxvYWQuYXJyYXkoJ2ltYWdlcycsIDUwKSwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7CiAgaWYgKCFyZXEuZmlsZXMgfHwgcmVxLmZpbGVzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKCdObyBpbWFnZSBmaWxlcyB1cGxvYWRlZC4nKTsKICB9CgogIHRyeSB7CiAgICAvLyBQcm9jZXNzIGVhY2ggaW1hZ2UgZmlsZQogICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKAogICAgICAocmVxLmZpbGVzIGFzIEV4cHJlc3MuTXVsdGVyLkZpbGVbXSkubWFwKGFzeW5jIGZpbGUgPT4gewogICAgICAgIGNvbnN0IG9jclRleHQgPSBhd2FpdCBwcm9jZXNzSW1hZ2UoZmlsZS5idWZmZXIsIGAke2ZpbGUub3JpZ2luYWxuYW1lfWApOwogICAgICAgIGNvbnN0IHsgZGVjb2RlZFRleHQsIGhleFN0cmluZ3MgfSA9IHByb2Nlc3NUZXh0KG9jclRleHQpOwogICAgICAgIHJldHVybiB7IG9jclRleHQsIGRlY29kZWRUZXh0LCBoZXhTdHJpbmdzIH07CiAgICAgIH0pCiAgICApOwoKICAgIC8vIFNlbmQgY29tYmluZWQgcmVzcG9uc2UKICAgIHJlcy50eXBlKCdhcHBsaWNhdGlvbi9qc29uJyk7CiAgICByZXMuc2VuZChyZXN1bHRzKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoZXJyb3IubWVzc2FnZSk7CiAgfQp9KTsKCmNvbnN0IFBPUlQ6IHN0cmluZyB8IG51bWJlciA9IHByb2Nlc3MuZW52LlBPUlQgfHwgMzAwMDsKYXBwLmxpc3RlbihQT1JULCAoKSA9PiB7CiAgY29uc29sZS5sb2coYFNlcnZlciBpcyBydW5uaW5nIG9uIHBvcnQgJHtQT1JUfWApOwp9KTsKCmZ1bmN0aW9uIGhleFRvQXNjaWkoaGV4U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcgewogIGxldCBhc2NpaVN0cmluZyA9ICcnOwogIGZvciAobGV0IGkgPSAwOyBpIDwgaGV4U3RyaW5nLmxlbmd0aDsgaSArPSAyKSB7CiAgICBjb25zdCBoZXhDaGFyID0gaGV4U3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMik7CiAgICBhc2NpaVN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleENoYXIsIDE2KSk7CiAgfQogIHJldHVybiBhc2NpaVN0cmluZzsKfQoKYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ltYWdlKGJ1ZmZlcjogQnVmZmVyLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHsKICB0cnkgewogICAgY29uc3QgcHJvY2Vzc2VkQnVmZmVyID0gYXdhaXQgc2hhcnAoYnVmZmVyKQogICAgICAucm90YXRlKCkKICAgICAgLy8uZ3JheXNjYWxlKCkKICAgICAgLy8uc2hhcnBlbigpCiAgICAgIC8vLm5vcm1hbGlzZSgpCiAgICAgIC50aHJlc2hvbGQoMTUwKQogICAgICAvLy5uZWdhdGUoKQogICAgICAvLy5jbGFoZSh7IHdpZHRoOiAzLCBoZWlnaHQ6IDMgfSkKICAgICAgLy8ubGluZWFyKC0xLCAyNTUpCiAgICAgIC50b0J1ZmZlcigpOwoKICAgIGF3YWl0IHNoYXJwKHByb2Nlc3NlZEJ1ZmZlcikudG9GaWxlKCdwcm9jZXNzZWRfJyArIGZpbGVOYW1lKTsKCiAgICBsZXQgb2NyVGV4dCA9IGF3YWl0IHRlc3NlcmFjdC5yZWNvZ25pemUocHJvY2Vzc2VkQnVmZmVyLCB0ZXNzZXJhY3RDb25maWcpOwogICAgLy8gUmVtb3ZlIG5ld2xpbmUgY2hhcmFjdGVycwogICAgb2NyVGV4dCA9IG9jclRleHQucmVwbGFjZSgvXG4vZywgJyAnKTsKICAgIG9jclRleHQgPSBvY3JUZXh0LnJlcGxhY2UoJ8KiJywgJ2MnKTsKICAgIHJldHVybiBvY3JUZXh0OwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgaW1hZ2U6ICcgKyBlcnJvci5tZXNzYWdlKTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NUZXh0KGlucHV0OiBzdHJpbmcpOiB7IGRlY29kZWRUZXh0OiBzdHJpbmc7IGhleFN0cmluZ3M6IHN0cmluZ1tdIH0gewogIGNvbnN0IGhleFBhdHRlcm4gPSAvWzAtOWEtZkEtRl17Nix9L2c7CiAgbGV0IGRlY29kZWRUZXh0ID0gJyc7CiAgbGV0IGhleFN0cmluZ3M6IHN0cmluZ1tdID0gW107CgogIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaChoZXhQYXR0ZXJuKTsKICBpZiAobWF0Y2hlcykgewogICAgLy8gQ29uY2F0ZW5hdGUgYWxsIG1hdGNoZXMgaW50byBhIHNpbmdsZSBzdHJpbmcKICAgIGNvbnN0IGNvbWJpbmVkSGV4ID0gbWF0Y2hlcy5qb2luKCcnKS5yZXBsYWNlKC9ccy9nLCAnJyk7CiAgICBkZWNvZGVkVGV4dCA9IGhleFRvQXNjaWkoY29tYmluZWRIZXgpOwoKICAgIC8vIEtlZXAgdGhlIG9yaWdpbmFsIGhleCBzdHJpbmdzIGZvciByZWZlcmVuY2UKICAgIGhleFN0cmluZ3MgPSBtYXRjaGVzOwogIH0KCiAgcmV0dXJuIHsgZGVjb2RlZFRleHQsIGhleFN0cmluZ3MgfTsKfQoK
Main.java:1: error: '.' expected
import express, { Request, Response } from 'express';
^
Main.java:1: error: unclosed character literal
import express, { Request, Response } from 'express';
^
Main.java:1: error: unclosed character literal
import express, { Request, Response } from 'express';
^
Main.java:2: error: '.' expected
import bodyParser from 'body-parser';
^
Main.java:2: error: unclosed character literal
import bodyParser from 'body-parser';
^
Main.java:2: error: unclosed character literal
import bodyParser from 'body-parser';
^
Main.java:3: error: '.' expected
import multer from 'multer';
^
Main.java:3: error: unclosed character literal
import multer from 'multer';
^
Main.java:3: error: unclosed character literal
import multer from 'multer';
^
Main.java:4: error: '.' expected
import tesseract from 'node-tesseract-ocr';
^
Main.java:4: error: unclosed character literal
import tesseract from 'node-tesseract-ocr';
^
Main.java:4: error: unclosed character literal
import tesseract from 'node-tesseract-ocr';
^
Main.java:5: error: '.' expected
import sharp from 'sharp';
^
Main.java:5: error: unclosed character literal
import sharp from 'sharp';
^
Main.java:5: error: unclosed character literal
import sharp from 'sharp';
^
Main.java:7: error: class, interface, or enum expected
const app = express();
^
Main.java:8: error: class, interface, or enum expected
const tesseractConfig = {
^
Main.java:9: error: unclosed character literal
lang: 'eng',
^
Main.java:9: error: unclosed character literal
lang: 'eng',
^
Main.java:16: error: class, interface, or enum expected
app.use(bodyParser.text()); // To parse JSON bodies
^
Main.java:18: error: class, interface, or enum expected
app.get('/', (req: Request, res: Response) => {
^
Main.java:19: error: unclosed character literal
res.send('WhatTheHex?');
^
Main.java:19: error: unclosed character literal
res.send('WhatTheHex?');
^
Main.java:20: error: class, interface, or enum expected
});
^
Main.java:22: error: class, interface, or enum expected
app.post('/ocr', upload.array('images', 50), async (req, res) => {
^
Main.java:22: error: unclosed character literal
app.post('/ocr', upload.array('images', 50), async (req, res) => {
^
Main.java:22: error: unclosed character literal
app.post('/ocr', upload.array('images', 50), async (req, res) => {
^
Main.java:22: error: unclosed character literal
app.post('/ocr', upload.array('images', 50), async (req, res) => {
^
Main.java:22: error: unclosed character literal
app.post('/ocr', upload.array('images', 50), async (req, res) => {
^
Main.java:24: error: unclosed character literal
return res.status(400).send('No image files uploaded.');
^
Main.java:24: error: unclosed character literal
return res.status(400).send('No image files uploaded.');
^
Main.java:25: error: class, interface, or enum expected
}
^
Main.java:31: error: illegal character: '`'
const ocrText = await processImage(file.buffer, `${file.originalname}`);
^
Main.java:31: error: illegal character: '`'
const ocrText = await processImage(file.buffer, `${file.originalname}`);
^
Main.java:32: error: class, interface, or enum expected
const { decodedText, hexStrings } = processText(ocrText);
^
Main.java:33: error: class, interface, or enum expected
return { ocrText, decodedText, hexStrings };
^
Main.java:34: error: class, interface, or enum expected
})
^
Main.java:38: error: class, interface, or enum expected
res.type('application/json');
^
Main.java:38: error: unclosed character literal
res.type('application/json');
^
Main.java:38: error: unclosed character literal
res.type('application/json');
^
Main.java:39: error: class, interface, or enum expected
res.send(results);
^
Main.java:40: error: class, interface, or enum expected
} catch (error) {
^
Main.java:42: error: class, interface, or enum expected
}
^
Main.java:45: error: class, interface, or enum expected
const PORT: string | number = process.env.PORT || 3000;
^
Main.java:46: error: class, interface, or enum expected
app.listen(PORT, () => {
^
Main.java:47: error: illegal character: '`'
console.log(`Server is running on port ${PORT}`);
^
Main.java:47: error: illegal character: '`'
console.log(`Server is running on port ${PORT}`);
^
Main.java:48: error: class, interface, or enum expected
});
^
Main.java:50: error: class, interface, or enum expected
function hexToAscii(hexString: string): string {
^
Main.java:51: error: empty character literal
let asciiString = '';
^
Main.java:52: error: class, interface, or enum expected
for (let i = 0; i < hexString.length; i += 2) {
^
Main.java:52: error: class, interface, or enum expected
for (let i = 0; i < hexString.length; i += 2) {
^
Main.java:52: error: class, interface, or enum expected
for (let i = 0; i < hexString.length; i += 2) {
^
Main.java:54: error: class, interface, or enum expected
asciiString += String.fromCharCode(parseInt(hexChar, 16));
^
Main.java:55: error: class, interface, or enum expected
}
^
Main.java:57: error: class, interface, or enum expected
}
^
Main.java:72: error: class, interface, or enum expected
await sharp(processedBuffer).toFile('processed_' + fileName);
^
Main.java:72: error: unclosed character literal
await sharp(processedBuffer).toFile('processed_' + fileName);
^
Main.java:72: error: unclosed character literal
await sharp(processedBuffer).toFile('processed_' + fileName);
^
Main.java:74: error: class, interface, or enum expected
let ocrText = await tesseract.recognize(processedBuffer, tesseractConfig);
^
Main.java:76: error: class, interface, or enum expected
ocrText = ocrText.replace(/\n/g, ' ');
^
Main.java:76: error: illegal character: '\'
ocrText = ocrText.replace(/\n/g, ' ');
^
Main.java:77: error: class, interface, or enum expected
ocrText = ocrText.replace('?', 'c');
^
Main.java:78: error: class, interface, or enum expected
return ocrText;
^
Main.java:79: error: class, interface, or enum expected
} catch (error) {
^
Main.java:80: error: unclosed character literal
throw new Error('Error processing image: ' + error.message);
^
Main.java:80: error: unclosed character literal
throw new Error('Error processing image: ' + error.message);
^
Main.java:81: error: class, interface, or enum expected
}
^
Main.java:84: error: class, interface, or enum expected
function processText(input: string): { decodedText: string; hexStrings: string[] } {
^
Main.java:86: error: class, interface, or enum expected
let decodedText = '';
^
Main.java:86: error: empty character literal
let decodedText = '';
^
Main.java:87: error: class, interface, or enum expected
let hexStrings: string[] = [];
^
Main.java:89: error: class, interface, or enum expected
const matches = input.match(hexPattern);
^
Main.java:90: error: class, interface, or enum expected
if (matches) {
^
Main.java:92: error: empty character literal
const combinedHex = matches.join('').replace(/\s/g, '');
^
Main.java:92: error: illegal character: '\'
const combinedHex = matches.join('').replace(/\s/g, '');
^
Main.java:92: error: empty character literal
const combinedHex = matches.join('').replace(/\s/g, '');
^
Main.java:93: error: class, interface, or enum expected
decodedText = hexToAscii(combinedHex);
^
Main.java:96: error: class, interface, or enum expected
hexStrings = matches;
^
Main.java:97: error: class, interface, or enum expected
}
^
Main.java:100: error: class, interface, or enum expected
}
^
81 errors