2011-10-02 52 views
14

Quiero poner un código de barras en mi página y puedo obtener una vista previa. El generador de códigos de barras es google.zxing y mi herramienta de informes es iReport.google.zxing generador de códigos de barras en iReport

pero no sé, cómo configurar y Image ExpressionExpression Class de una imagen en iReport.

+0

http://groups.google.com/group/zxing/browse_thread/thread/e8fbcde52f9efd80 –

+0

@AlexK: He intentado que antes, pero no es claro – deepmax

+0

Al menos debe decirnos qué tipo de código de barras que está intentando generar ... –

Respuesta

7

Las dos ideas clave son primero escribir un poco de código Java para crear la imagen relevante y luego diseñar el informe para hacer referencia a este código adecuadamente. Tal vez la forma más sencilla de generar la imagen está en un scriptlet como esto:

package com.jaspersoft.alliances.mdahlman; 
import com.google.zxing.BarcodeFormat; 
import com.google.zxing.WriterException; 
import com.google.zxing.common.BitMatrix; 
import com.google.zxing.qrcode.QRCodeWriter; 
import com.google.zxing.client.j2se.MatrixToImageWriter; 
import net.sf.jasperreports.engine.JRDefaultScriptlet; 
import net.sf.jasperreports.engine.JRScriptletException; 

public class QRCodeScriptlet extends JRDefaultScriptlet { 
    public void afterDetailEval() throws JRScriptletException { 
     QRCodeWriter writer = new QRCodeWriter(); 
     BitMatrix matrix = null; 
     try { 
      matrix = writer.encode(getFieldValue("barcode_text").toString(), BarcodeFormat.QR_CODE, 256, 256); 
      this.setVariableValue("BarCodeImage", MatrixToImageWriter.toBufferedImage(matrix)); 
     } catch (WriterException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

que está lleno de fealdad no modificable, pero las ideas principales se muestran todas. Luego hay que definir el informe como este: consulta

  1. muestra: select 'some text' as barcode_text que incluía esto sólo para reforzar el punto de que mi scriptlet duros códigos barcode_text el nombre del campo. (Esto es malo.)
  2. Variable: BarCodeImage del tipo java.awt.image.BufferedImage con el cálculo System. Este nombre también está codificado en el scriptlet. (Esto es igual de malo.)
  3. Añadir a la ruta de clase de iReport:
    • El archivo .jar scriplet compilado
    • core.jar (de ZXing)
    • javase.jar (de ZXing)
  4. Agregue un elemento de imagen al informe con la expresión $V{BarCodeImage}.

El resultado es un código QR feliz feliz en su JasperReport generada:

Generated QR-Code

Recuerdo una muestra que he visto, que hace las cosas mucho más limpia. De hecho, incluía un buen complemento para que pudiera instalar fácilmente esta funcionalidad en iReport con el mínimo esfuerzo. Si puedo rastrear eso, entonces actualizaré esta publicación. Pero hasta entonces esto al menos cubre todos los puntos críticos.

+0

Adicional hay una muy buena guía en el capítulo 15, cómo crear scriptlet http://www.opus-college.net/devcorner/iReport-Ultimate-Guide-3.pdf –

2

La expresión de imagen debe devolver cualquier subclase de java.awt.Image. La forma más fácil de lograr esto es usar su propia clase de ayuda para generar la imagen. Puede crear un método estático que genere un código de barras desde un String y llame a ese método desde IReport.

En el caso de ZXing no conozco el método a usar, pero puedo decir lo que uso como ImageExpression usando la biblioteca Barbecue.

 net.sourceforge.barbecue.BarcodeImageHandler.getImage(
MyBarcodeGenerator.getFromString($F{field}) 

MyBarcodeGenerator clase contiene el método que devuelve un getFromString(...)net.sourceforge.barbecue.Barcode en mi caso se ignora un net.sourceforge.barbecue.linear.code39.Code39Barcode

El Expression Class.

--Edited:

para codificar una imagen en ZXing se debe utilizar MatrixToImageWriter

El siguiente código codificará un QR en un BufferedImage que se puede utilizar en el campo Expresión Image:

MatrixToImageWriter.toBufferedImage(new QRCodeWriter().encode("BARCODE CONTENT", BarcodeFormat.QR_CODE,  400 /*Width*/, 400/*Height*/)); 
Cuestiones relacionadas