martes, 1 de julio de 2014

Codigo Barras EAN128 con iReport y Barcode4j

Código de barras generado utilizando iReport con la librería barcode4j

Incluir librerias: 

<dependency>
<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j</artifactId>
<version>2.1</version>
</dependency>

<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-bridge</artifactId>
<version>1.7</version>
</dependency>

Crear codigo para enviar a iReport

final char FNC1 = Code128LogicImpl.FNC_1;
final char CD = EAN128Bean.DEFAULT_CHECK_DIGIT_MARKER;
String cod = "415770105500005" + CD + FNC1 + "80209115675110080555" + FNC1 + "390000021170" + FNC1 + "9620080402";

Si se imprime la variabla cod veriamos lo siguiente:
415770105500005ðñ80209115675110080555ñ390000021170ñ9620080402

El texto del codigo de barras deseado es el siguiente:
(415)7701055000053(8020)9115675110080555(3900)00021170(96)20080402

En iReport campo "Code Expression", debes enviar el codigo generado en las lineas anteriores en Java.

*En iReport campo "Module Width", se puede adicionar un valor para modificar el tamaño de las barras permitiendo que se muestren todos los numeros del texto. En mi caso el valor utilizado es 1.0



10 comentarios:

  1. Gracias por tu post, fue de mucha ayuda, no encontre un ejemplo asi en ninguna pagina en ingles.

    ResponderEliminar
  2. Una pregunta. se puede introducir numeros con decimales, en este IA (3100), con formato n4+n6. ej. (3100)4500.15 ??

    ResponderEliminar
    Respuestas
    1. En este caso debes tener un numero de decimales exacto. Por ejemplo si defines dos decimales para el numero 450015, cuando obtengas el numero sabrás que los dos últimos dígitos son siempre decimales. Para evitar confusiones recomiendo siempre completar el numero con ceros a la izquierda para mayor estandarización, por ejemplo se define un numero de 8 dígitos quedaría: 00450015.

      Eliminar
  3. Hola buenas tardes muchisisisimas gracias estuve buscando por dias la solucion a este problemay gracias a ud funciono gracias gracias graciass!!

    ResponderEliminar
  4. Ola muchas gracias por tu aporte.. pero necesito hacerte una consulta

    estoy diseñando una factura con código de barras en web, y de prueba tome tu código:

    asi declaro tu codigo

    final char FNC1 = Code128LogicImpl.FNC_1;
    final char CD = EAN128Bean.DEFAULT_CHECK_DIGIT_MARKER;
    String cod = "4157709998511392" + CD + FNC1 + "80209115675110080555" + FNC1 + "390000021170" + FNC1 + "9620080402";

    así paso la variable por medio de parámetros al ireport

    File reportFile = new File(application.getRealPath("Factura/Factura.jasper"));

    Map parameters = new HashMap();
    parameters.put("NOFAC", NoFac);
    parameters.put("Barra", cod);


    byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, conecta.getConnection());

    response.setContentType("application/pdf");
    response.setContentLength(bytes.length);
    ServletOutputStream ouputStream = response.getOutputStream();
    ouputStream.write(bytes, 0, bytes.length);

    ouputStream.flush();
    ouputStream.close();
    conecta.desconectar();

    pero cuando ejecuta la pagina web me arroja este error

    net.sf.jasperreports.engine.JRRuntimeException: java.lang.IllegalArgumentException: Unable to read AI: Characters must be numerical! Accepted start of Message: "(415)7709998511392"

    cual seria el error agradezco tu ayuda

    ResponderEliminar
    Respuestas
    1. Hola Harold,

      El primer numero que tienes, "4157709998511392" corresponde al EAN/UCC 13. Esto es: 415 + (numero de 12 dígitos) + dígito de verificación.

      Este último, el dígito de verificación, se adiciona en la constante CD (EAN128Bean.DEFAULT_CHECK_DIGIT_MARKER), por lo que
      no es necesario que lo tengas en tu código.

      Tu código quedaría de la siguiente forma:

      String cod = "415770999851139" + CD + FNC1 + "80209115675110080555" + FNC1 + "390000021170" + FNC1 + "9620080402";

      Espero ser de ayuda.

      Eliminar
  5. después de 3 dias buscando y rompiéndome la cabeza, encuentro este pequeño tutorial, muchas gracias.

    ResponderEliminar
  6. Hola este post me ayudo mucho pero tengo un problema, me estan dando un numero de convenio de 5 digitos y al tratar de colocarle 0 delante para rellenar los 13 digitos me trae este error:

    Checkdigit is wrong! Correct is 5 but I found 6! Accepted start of Message: "(415)000000002241"

    llevo dias con este error, si alguien me ayuda se lo agradeceria mucho el numero del convenio es: 22416

    ResponderEliminar
  7. Hola, hace mucho no trabajo con esto.. y no tengo mas datos para ayudar con tu error!

    ResponderEliminar