IREPORT- VARIOS REPORTES A LA VEZ

1,549 views
Skip to first unread message

FEDARK

unread,
Jun 15, 2009, 8:07:02 PM6/15/09
to JavaSOS
HOLA CHICOS

¿COMO PUEDO HACER PARA IMPRIMIR UN CONJUNTO DE FACTURAS CON SU
CORRESPONDIENTE DETALLE EN UNA SOLA IMPRESION.?
ES DECIR POR EJM: IMPRIMIR FACTURA DE FECHA 20/06/2009 A 25/06/2009 EN
ESTE RANGO DE FECHAS SUPONGAMOS QUE HAY 5 FACTURAS, POR LO QUE EL
REPORTE SE DEBERIA GENERAR CON 5 FACTURAS CON SU DETALLE, LO QUE NO SE
ES COMO HACERLO.

PARA UNA SOLA FACTURA NO TENGO PROBLEMAS, LO QUE PASA ES Q EN LA
REALIDAD SI QUIERO IMPRIMIR VARIAS FACTURAS SERIA MUY TEDIOSO GENERAR
REPORTES DE FACTURAS UNO POR UNO.

TENGO ESTA CLASE PARA GENERAR REPORTES, QUE CON UN DTO FUNCIONA
CORRECTAMENTE. EN EL TIPO DE DATO COLLECTION SE CARGA LO QUE VA EN EL
DETALLE Y EN EL HASHMAP LOS PARAMETROS QUE LE PASEMOS.

MUCHAS GRACIAS POR SU RESPUESTA.


package servicios;
import java.util.Collection;
import java.util.Map;

import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;

import java.awt.Dialog;

import javax.swing.JOptionPane;
public class Reporte{
private String reportName;
private Collection lista;
private Map map;

public Reporte(String reportName, Collection lista, Map map) {
this.reportName = reportName;
this.lista = lista;
this.map = map;
}

public void imprimir(){
try{
//1-Llenar el datasource con la informacion de la base de
datos o de donde este, en este caso "hardcode"
JRBeanCollectionDataSource dataSource = new
JRBeanCollectionDataSource(lista);

//2-Compilamos el archivo XML y lo cargamos en memoria
JasperReport jasperReport =
JasperCompileManager.compileReport(reportName+".jrxml");

//3-Llenamos el reporte con la informaci�n (de la DB) y
par�metros necesarios para la consulta
JasperPrint jasperPrint = JasperFillManager.fillReport
(jasperReport, map, dataSource);

//4-Exportamos el reporte a pdf y lo guardamos en disco
//JasperExportManager.exportReportToPdfFile(jasperPrint,
reportName+".pdf");

JasperViewer jviewer = new JasperViewer(jasperPrint,
false);
jviewer.setTitle(reportName+".pdf");
jviewer.setVisible(true);

}catch (Exception e){
JOptionPane.showMessageDialog(null, e.getMessage(), "",
javax.swing.JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
}

fjtorres

unread,
Jun 21, 2009, 6:13:58 AM6/21/09
to JavaSOS
Buenas,

yo para realizar algo similar en el trabajo lo que hacia era
concatenar los pdf en uno nuevo, ahora mismo no tengo el código fuente
aquí pero era usando la librería iText. El lunes te pongo el código
necesario. Era para web pero bueno seguro que te sirve.

Saludos.

fjtorres

unread,
Jun 22, 2009, 2:34:29 AM6/22/09
to JavaSOS
Buenas,

ya pude ver el código fuente. La clases que usaba eran:

PdfCopyFields y PdfReader ambas pertenecen a la librería iText. Lo
único que hacia era generar los reportes y guardar el byte[] de cada
uno de ellos. Luego con un método generaba otro pdf con todos los
reportes que había generado previamente. Te dejo el código:

/**
* Método que concatena la lista de byte[] que le llega como
parametro.
*
* @param pdfBytes
* Lista con los byte[] a concatenar.
* @return Concatenacion de byte[].
* @throws Exception
* si ocurre error.
*/
private byte[] concatenarPdf(List<byte[]> pdfBytes) throws
Exception
{
// Path del fichero temporal
final String pathFile = super.getServletContext().getRealPath
(ConstantesReports.RUTA_TEMPORAL)
+ this.getNombreDocumento();

// Creamos el fichero pdf necesario.
FileOutputStream file = new FileOutputStream(pathFile);

// Objeto reader para añadir los pdf.
PdfReader reader = null;

// Objeto para concatenar los pdf.
PdfCopyFields copy = new PdfCopyFields(file);

// tamaño total de bytes
int tam = 0;

// Recorremos los bytes y los vamos concatenando.
for (byte[] pdfByte : pdfBytes)
{
tam += pdfByte.length;
reader = new PdfReader(pdfByte);
copy.addDocument(reader);
}

copy.close();

FileInputStream archivo = new FileInputStream(pathFile);

byte[] bytesFinal = new byte[tam];

int c = 0;
int i = 0;
// Leemos y vamos añadiendo al array de bytes final.
while ((c = archivo.read()) != -1)
{
bytesFinal[i] = (byte) c;
i++;
}
// Cerramos.
archivo.close();
file.close();
File f = new File(pathFile);
// Borramos el fichero.
if (f.exists())
{
f.delete();
}
return bytesFinal;
}

No se si te servirá pero es la manera que encontré para hacer algo
similar en entorno web.

Saludos.
Reply all
Reply to author
Forward
0 new messages