Skip to content

Instantly share code, notes, and snippets.

@pmogollons
Last active February 19, 2024 05:15
Show Gist options
  • Save pmogollons/52d76cc219ae74baacc19b3f7c46e882 to your computer and use it in GitHub Desktop.
Save pmogollons/52d76cc219ae74baacc19b3f7c46e882 to your computer and use it in GitHub Desktop.
Función para extraer los datos del codigo de barras PDF417 de una cedula colombiana usando React Native Camera en Javascript
import moment from 'moment';
export function extractColDocumentData(data) {
let dataString = data.barcodes[0]?.data.replace('PubDSK', '0');
const sI = dataString.match('[a-zA-Z]').index;
dataString = dataString.substring(sI - 10);
const idNumber = dataString.substring(0, 10).replace(/^0+/,'');
const lastName1 = capitalize(dataString.substring(10, 30).replace(/�/g, ''));
const lastName2 = capitalize(dataString.substring(30, 70).replace(/�/g, ''));
const firstName1 = capitalize(dataString.substring(70, 110).replace(/�/g, ''));
const middleName = capitalize(dataString.substring(110, 150).replace(/�/g, ''));
const edI = dataString.indexOf('�0');
dataString = dataString.substring(edI);
const birthDate = moment(`${dataString.substring(3, 11)}`, 'YYYYMMDD');
return {
idNumber,
lastName1,
lastName2,
firstName1,
middleName,
gender: dataString.substring(2, 3).includes('M') ? 'MALE' : 'FEMALE',
birthDate: birthDate,
bloodType: dataString.substring(17, 19),
fullName: `${firstName1}${middleName ? ` ${middleName}` : ''} ${lastName1} ${lastName2 || ''}`,
municipalityCode: dataString.substring(11, 13),
departmentCode: dataString.substring(13, 16),
};
}
function capitalize(string) {
return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
}
@daniel-parra-issatec
Copy link

Hola,

Disculpa, una pregunta: este código es para uso exclusivo con react native? hay alguna manera de llevarlo a javascript "común y corriente"? por así decirlo.

Gracias.

@pmogollons
Copy link
Author

Hola Daniel,

Claro que si, esta funcion no es dependiente de RN. Solo debes pasarle los datos del lector del codigo de barras que uses y listo.

Sin embargo, yo solo lo he usado con el lector de codigos de barras de la camara de RN.

@jlarteaga
Copy link

jlarteaga commented Apr 26, 2021

Hola,

Muchas gracias por compartir esta función! Quería preguntarte si habías deducido la estructura del código por tu cuenta o si habías utilizado alguna documentación oficial.

Gracias de antemano.

@SanCamiloHospital
Copy link

Bnos dias que lector uso y se puede de la cámara del pc ??

@SkiAndory
Copy link

Hola,

Muchas gracias por compartir esta función! Quería preguntarte si habías deducido la estructura del código por tu cuenta o si habías utilizado alguna documentación oficial.

Gracias de antemano.

lo que dijo el men x2

@foag1996
Copy link

hola se puede utilizar con la camara web?

@pmogollons
Copy link
Author

Hola @jlarteaga @SkiAndory,

La estructura la deduje por el contenido de los datos del código, sin embargo este no tiene siempre la misma estructura lamentablemente, o al menos no cuando se lee con la camara de React Native.

Este nuevo código es un poco mas claro de entender y sirve en mas casos que la versión anterior.

Saludos

@pmogollons
Copy link
Author

pmogollons commented Apr 20, 2023

Hola @foag1996 @SanCamiloHospital,

Esta funcion extra la info ya cuando lograste sacar los datos del código de barras. Con una webcam les va a quedar un poco complicado por la calidad de la imagen. Nosotros lo hacemos con la camara de celulares, pero requiere uno de mediana gama para funcionar de manera consistente.

Este repo les puede ayudar. https://github.com/PeculiarVentures/js-zxing-pdf417

Saludos.

@rodaheva
Copy link

rodaheva commented Feb 19, 2024

He estado probando y continúa generando errores al acceder a los índices. Es posible que haya habido cambios en los datos o en la estructura que estás tratando de procesar. He creado una versión en Java y la he integrado en una extensión para App Inventor, pero aún así persisten los errores.

public class ActivityCapture extends AndroidNonvisibleComponent {

// Activity and Context
private Context context;
private Activity activity;

public ActivityCapture(ComponentContainer container){
    super(container.$form());
    this.activity = container.$context();
    this.context = container.$context();
}

@SimpleFunction(description = "Extract Colombian Document Data")
public void ExtractColDocumentData(String data) {
    String dataString = data.replace("PubDSK", "0");
    Pattern pattern = Pattern.compile("[a-zA-Z]");
    Matcher matcher = pattern.matcher(dataString);
    int sI = 0;
    while (matcher.find()) {
        sI = matcher.start();
        break;
    }
    dataString = dataString.substring(sI - 10);
    String idNumber = dataString.substring(0, 10).replaceFirst("^0+(?!$)", "");
    String lastName1 = capitalize(dataString.substring(10, 30).replaceAll("�", ""));
    String lastName2 = capitalize(dataString.substring(30, 70).replaceAll("�", ""));
    String firstName1 = capitalize(dataString.substring(70, 110).replaceAll("�", ""));
    String middleName = capitalize(dataString.substring(110, 150).replaceAll("�", ""));

    int edI = dataString.indexOf("�0");
    dataString = dataString.substring(edI);

    String dateString = dataString.substring(3, 11);
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
    Date birthDate = null;
    try {
        birthDate = format.parse(dateString);
    } catch (Exception e) {
        e.printStackTrace();
    }

    String gender = dataString.substring(2, 3).contains("M") ? "MALE" : "FEMALE";
    String bloodType = dataString.substring(17, 19);
    String fullName = firstName1 + (middleName != null ? " " + middleName : "") + " " + lastName1 + " " + (lastName2 != null ? lastName2 : "");
    String municipalityCode = dataString.substring(11, 13);
    String departmentCode = dataString.substring(13, 16);

    // Dispatch event with extracted data
    ExtractedDataEvent(idNumber, lastName1, lastName2, firstName1, middleName, gender, dateString, bloodType, fullName, municipalityCode, departmentCode);
}

@SimpleEvent(description = "Event triggered after extracting Colombian Document Data")
public void ExtractedDataEvent(String idNumber, String lastName1, String lastName2, String firstName1, String middleName, String gender, String birthDate, String bloodType, String fullName, String municipalityCode, String departmentCode) {
    EventDispatcher.dispatchEvent(this, "ExtractedDataEvent", idNumber, lastName1, lastName2, firstName1, middleName, gender, birthDate, bloodType, fullName, municipalityCode, departmentCode);
}

private String capitalize(String string) {
    return string.charAt(0) + string.substring(1).toLowerCase();
}

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment