[Java] Retornar un PDF Stream en un Java Servlet
2 minutos de lecturaGenerando a un JasperPrint necesario para lograr un JasperExportManager.
import com.google.gson.Gson;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ReportDataFactoryDEL {
public static JasperPrint loadReport(String json) throws JRException {
List<Map<String,Object>> result = null;
result = new Gson().fromJson(json, List.class);
final String reportSource = "C:/jasper/report.jasper";
// Definimos cual sera nuestra fuente de datos
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(result);
// Rellenamos el informe con la conexion creada y sus parametros establecidos
Map<String,Object> reportParameters = new HashMap<String, Object>();
reportParameters.put("ofertas",ds);
JasperPrint print = JasperFillManager.fillReport(reportSource,reportParameters, new JREmptyDataSource());
return print;
}
}
Llamamos a la función que contiene el JasperPrint para enviarla al Cliente mediante un Response
import com.bice.precam.del.ReportDataFactoryDEL;
import net.sf.jasperreports.engine.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ReportOfertasService {
public void doPut(HttpServletRequest req, HttpServletResponse res) {
ReportDataFactoryDEL rf = new ReportDataFactoryDEL();
JasperPrint jasperPrint = new JasperPrint();
//Directorio donde se guardará una copia fisica
final String reportPdf = "C:/jasper/PREOFERTAS1.pdf";
//Definimos el tipo datos
jasperPrint = rf.loadReportOfertas(dtRequestDTO, codCampana);
res.setContentType("application/pdf");
res.setHeader("Content-Disposition", "inline; filename=report.pdf");
//Guardamos en el directorio
JasperExportManager.exportReportToPdfFile(jasperPrint, reportPdf);
//Enviamos el Stream al Cliente
JasperExportManager.exportReportToPdfStream(jasperPrint, res.getOutputStream());
}
}
Desde el Cliente enviamos los parámetros y el json de entrada, luego capturamos el PDF Stream y lo transformamos en un Archivo PDF. * Requiere Jquery.
$(document).ready(function() {
var req = new XMLHttpRequest();
req.open("PUT", "http://localhost:7001/PRECAM/PreServicesHub?_idr=REPORT_OFERTA&codCampana=472", true);
req.responseType = "blob";
req.onreadystatechange = function () {
if (req.readyState === 4 && req.status === 200) {
var filename = "PdfName-" + new Date().getTime() + ".pdf";
if (typeof window.chrome !== 'undefined') {
// Chrome version
var link = document.createElement('a');
link.href = window.URL.createObjectURL(req.response);
link.download = "PdfName-" + new Date().getTime() + ".pdf";
link.click();
} else if (typeof window.navigator.msSaveBlob !== 'undefined') {
// IE version
var blob = new Blob([req.response], { type: 'application/pdf' });
window.navigator.msSaveBlob(blob, filename);
} else {
// Firefox version
var file = new File([req.response], filename, { type: 'application/force-download' });
window.open(URL.createObjectURL(file));
}
}
};
req.send(JSON.stringify({"page":"1","pageLength":"10","columnOrderer":"NUM_IDEN","orderType":"1","filters":[{"dataType":"NUM","columnName":"COD_REGION","filterType":"2","botNumericRange":1,"topNumericRange":13}]}));
});