Created
April 4, 2020 12:01
-
-
Save teknosains/3ae3c8141f2219b90ff0b20ab8454a59 to your computer and use it in GitHub Desktop.
JS Bin // source https://jsbin.com/tevedaf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8"> | |
<meta name="viewport" content="width=device-width"> | |
<title>JS Bin</title> | |
</head> | |
<body> | |
<h3>Upload KTP-OCR</h3> | |
Recognize On the Fly | |
<br> | |
<input type="file" id="uploader"> | |
<hr> | |
Atau pakai yang ini | |
<br> | |
<button type="button" id="readFile">Recognize AFter Upload. Klik to read below KTP</button> | |
<hr> | |
<h4>Sample KTP</h4> | |
<img width="320" height="220" src="https://res.cloudinary.com/cepot/image/upload/v1585908365/KTP2_va8fdl.jpg"> | |
<fieldset> | |
<legend>Extracted Text:</legend> | |
<div id="result"></div> | |
</fieldset> | |
</body> | |
<!-- v2 --> | |
<script src='https://unpkg.com/[email protected]/dist/tesseract.min.js'></script> | |
<script> | |
/** | |
- Author: Budy K | |
- Desc: OCR Testing | |
**/ | |
const OCRKtp = (function(window, document, undefined) { | |
'use strict'; | |
const languange = 'ind'; // bahasa indonesia | |
/* #1 Recognize on the fly lsg saat orang upload*/ | |
async function recognize(files, fn) { | |
document.getElementById('result').innerHTML = "Starting.."; | |
const { data: { text } } = await Tesseract.recognize(files[0], languange, { | |
logger: function(m) { | |
if (m.status == 'recognizing text' && m.progress !=1) { | |
fn((m.progress * 100).toFixed(2), {}); | |
} | |
} | |
}); | |
fn(100, resultFormater(text)); | |
} | |
/* #2 Recognize ketika sudah upload, baca Path file nya*/ | |
function recognize2(filePath, fn) { | |
Tesseract.recognize( | |
filePath, | |
languange, | |
{ | |
logger: function(m){ | |
if (m.status == 'recognizing text' && m.progress !=1) { | |
fn((m.progress * 100).toFixed(2), {}); | |
} | |
} | |
} | |
).then(function({ data: { text } }) { | |
fn(100, resultFormater(text)); | |
}); | |
} | |
/* | |
* Hand Sanitizer | |
*/ | |
const KTPSanitizer = { | |
Alpha: function(text = '') { | |
return text.replace(/[^A-Za-z ]/g, "").trim(); | |
}, | |
Numeric: function(text = '') { | |
return text.replace(/[^0-9]/g, ''); | |
}, | |
AlphaNumeric: function(text = '') { | |
return text.replace(/[^a-zA-Z0-9 \.]/g, "").trim(); | |
}, | |
Name: function(text = '') { | |
if (text.length <= 2) return ""; | |
return text.replace(/[^A-Za-z '-]/g, "").trim(); | |
}, | |
TTL: function(text = '') { | |
return text.replace(/[^a-zA-Z0-9_\-,]/g, "").trim(); | |
}, | |
RtRw: function(text = '') { | |
return text.replace(/[^0-9\/]/g, '').trim(); | |
}, | |
toDate: function(text = '') { | |
let rs = ''; | |
text.split('').forEach(function(itx, idx) { | |
rs += itx; | |
if (idx == 1 || idx == 3) rs += '-'; | |
}); | |
return rs; | |
}, | |
Kelamin: function(text = '') { | |
if (text.length < 3) return ""; | |
if (text.includes('laki') || text.includes('aki')) { | |
return 'Laki-Laki' | |
} | |
return 'Perempuan' | |
} | |
} | |
function resultFormater(text) { | |
if (text.length < 150 || text.length > 400) { | |
document.getElementById('result').innerHTML = "Photo KTP Tidak bisa dibaca. Silahkan melakukan pengisian data manual ya"; | |
return {status: false, message: 'Image not recognized'}; | |
} else { | |
let result = ''; | |
text.split('').forEach(function(letter, idx) { | |
result += letter; | |
if (letter == '\n') { | |
result += '\n'; | |
} | |
}); | |
let result2 = []; | |
result.split('\n').forEach(function(word, idx) { | |
let txt = word.trim().toLowerCase(); | |
if ( txt.toLowerCase().includes('darah') ) { | |
let sp = txt.split('darah'); | |
let sp1 = sp[0] || 'Jenis Kelamin :UNKNOWN'; // jenis kelamin | |
let sp2 = sp[1] || 'Gol. Darah :UNKNOWN'; // Gol Darah | |
// split jenis kelamin : | |
if (sp1.includes(':')) { | |
let jk = sp1.split(':'); | |
let jkf = jk[1] || 'UNKNOWN'; | |
result2.push(jkf.trim()); | |
} | |
if (sp2.includes(':')) { | |
let gd = sp2.split(':'); | |
let gdf = gd[1] || 'UNKNOWN'; | |
result2.push(gdf.trim()); | |
} | |
} else { | |
// yang ada : nya aja | |
if (txt !== '' && txt.includes(':')) { | |
let spl = txt.split(':'); | |
let spl1 = spl[1] || 'UNKNOWN'; | |
result2.push(spl1.trim()); | |
} | |
} | |
}); | |
// TTL modifier | |
let ttl = KTPSanitizer.TTL(result2[2]); | |
let tempatLahir = KTPSanitizer.Alpha(ttl); | |
let tglLahir = KTPSanitizer.toDate( | |
(KTPSanitizer.Numeric(ttl)).slice(0,8) | |
); | |
let TempatTglLahir = tempatLahir + ', ' + tglLahir; | |
console.log(result2); | |
//assign every array | |
let KTP_Object = { | |
NIK: KTPSanitizer.Numeric(result2[0]), | |
Nama: KTPSanitizer.Name(result2[1]), | |
TempatTglLahir: TempatTglLahir, | |
TempatLahir: tempatLahir, | |
TglLahir: tglLahir, | |
JenisKelamin: KTPSanitizer.Kelamin(KTPSanitizer.Alpha(result2[3])), | |
GolDarah: KTPSanitizer.Alpha(result2[4]), | |
Alamat: KTPSanitizer.AlphaNumeric(result2[5]), | |
RtRw: KTPSanitizer.RtRw(result2[6]), | |
Kelurahan: KTPSanitizer.Alpha(result2[7]), | |
Kecamatan: KTPSanitizer.Alpha(result2[8]), | |
Agama: KTPSanitizer.Alpha(result2[9]), | |
StatusPerkawinan: KTPSanitizer.Alpha(result2[10]), | |
Pekerjaan: KTPSanitizer.Alpha(result2[11]), | |
Kewarganegaraan: KTPSanitizer.Alpha(result2[12]), | |
BerlakuHingga: KTPSanitizer.toDate((KTPSanitizer.Numeric(result2[13])).slice(0,8)) | |
}; | |
console.log(KTP_Object); | |
return { | |
status: true, | |
message: 'Image rezognized', | |
object: KTP_Object | |
}; | |
} | |
} | |
return { | |
upload: recognize, | |
read: recognize2 | |
}; | |
})(this, document); // end of OCR Helper | |
// OCR Read a ready file | |
const KTP = 'https://res.cloudinary.com/cepot/image/upload/v1585908365/KTP2_va8fdl.jpg'; | |
document.getElementById('readFile').addEventListener('click', function(e) { | |
e.preventDefault(); | |
document.getElementById('result').innerHTML = "Starting.."; | |
OCRKtp.read(KTP, function(progress, result) { | |
let progressText = 'Prosesing. Progress: ' + progress + '%'; | |
console.log(progressText) | |
if (progress == 100) { | |
document.getElementById('result').innerHTML = JSON.stringify(result); | |
} else { | |
document.getElementById('result').innerHTML = progressText; | |
} | |
}); | |
}); | |
// OCR KTP Upload file | |
document.getElementById('uploader').addEventListener('change', function(e) { | |
e.preventDefault(); | |
document.getElementById('result').innerHTML = "Starting.."; | |
OCRKtp.upload({ target: { files } }, function(progress, result) { | |
let progressText = 'Prosesing. Progress: ' + progress + '%'; | |
console.log(progressText) | |
if (progress == 100) { | |
document.getElementById('result').innerHTML = JSON.stringify(result); | |
} else { | |
document.getElementById('result').innerHTML = progressText; | |
} | |
}); | |
}); | |
</script> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment