fork download
  1. import express, { Request, Response } from 'express';
  2. import bodyParser from 'body-parser';
  3. import multer from 'multer';
  4. import tesseract from 'node-tesseract-ocr';
  5. import sharp from 'sharp';
  6. const upload = multer({ storage: multer.memoryStorage() });
  7. const app = express();
  8. const tesseractConfig = {
  9. lang: 'eng',
  10. oem: 3,
  11. psm: 12,
  12. tessedit_char_whitelist: "'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,.?; ¢'"
  13.  
  14. };
  15.  
  16. app.use(bodyParser.text()); // To parse JSON bodies
  17.  
  18. app.get('/', (req: Request, res: Response) => {
  19. res.send('WhatTheHex?');
  20. });
  21.  
  22. app.post('/ocr', upload.array('images', 50), async (req, res) => {
  23. if (!req.files || req.files.length === 0) {
  24. return res.status(400).send('No image files uploaded.');
  25. }
  26.  
  27. try {
  28. // Process each image file
  29. const results = await Promise.all(
  30. (req.files as Express.Multer.File[]).map(async file => {
  31. const ocrText = await processImage(file.buffer, `${file.originalname}`);
  32. const { decodedText, hexStrings } = processText(ocrText);
  33. return { ocrText, decodedText, hexStrings };
  34. })
  35. );
  36.  
  37. // Send combined response
  38. res.type('application/json');
  39. res.send(results);
  40. } catch (error) {
  41. res.status(500).send(error.message);
  42. }
  43. });
  44.  
  45. const PORT: string | number = process.env.PORT || 3000;
  46. app.listen(PORT, () => {
  47. console.log(`Server is running on port ${PORT}`);
  48. });
  49.  
  50. function hexToAscii(hexString: string): string {
  51. let asciiString = '';
  52. for (let i = 0; i < hexString.length; i += 2) {
  53. const hexChar = hexString.substring(i, i + 2);
  54. asciiString += String.fromCharCode(parseInt(hexChar, 16));
  55. }
  56. return asciiString;
  57. }
  58.  
  59. async function processImage(buffer: Buffer, fileName: string): Promise<string> {
  60. try {
  61. const processedBuffer = await sharp(buffer)
  62. .rotate()
  63. //.grayscale()
  64. //.sharpen()
  65. //.normalise()
  66. .threshold(150)
  67. //.negate()
  68. //.clahe({ width: 3, height: 3 })
  69. //.linear(-1, 255)
  70. .toBuffer();
  71.  
  72. await sharp(processedBuffer).toFile('processed_' + fileName);
  73.  
  74. let ocrText = await tesseract.recognize(processedBuffer, tesseractConfig);
  75. // Remove newline characters
  76. ocrText = ocrText.replace(/\n/g, ' ');
  77. ocrText = ocrText.replace('¢', 'c');
  78. return ocrText;
  79. } catch (error) {
  80. throw new Error('Error processing image: ' + error.message);
  81. }
  82. }
  83.  
  84. function processText(input: string): { decodedText: string; hexStrings: string[] } {
  85. const hexPattern = /[0-9a-fA-F]{6,}/g;
  86. let decodedText = '';
  87. let hexStrings: string[] = [];
  88.  
  89. const matches = input.match(hexPattern);
  90. if (matches) {
  91. // Concatenate all matches into a single string
  92. const combinedHex = matches.join('').replace(/\s/g, '');
  93. decodedText = hexToAscii(combinedHex);
  94.  
  95. // Keep the original hex strings for reference
  96. hexStrings = matches;
  97. }
  98.  
  99. return { decodedText, hexStrings };
  100. }
  101.  
  102.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
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
stdout
Standard output is empty