I have a file jrxml (create using Jasper Report) and I want show it in an HTML page without using for example pdf file. I want do this conversion by server side (spring).
I call the java method from the page HTML using:
<FORM NAME="formTicket" ACTION='http://localhost:8080/movies/ticket' METHOD="GET"> and in java I have:
@RequestMapping(value = "/movies/ticket", method = RequestMethod.GET)//stampa ticket public Document add(@RequestParam(value="id")int id, int numb) {//numb=numeroBigliettiDaStampare,Id=specificoMovie String xmlFile = serv.getPDF(id, numb); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder; try{ builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xmlFile))); return doc; }catch(Exception e){ e.printStackTrace(); } return null; } and the getPDF method, with JasperReports:
public String getPDF(int id, int number){ String fileJrxml = "/home/salvador/workspace/serverMovies/src/main/webapp/resources/Jasper/ticket.jrxml"; File jasperFileSource = new File(fileJrxml); //Log.debug("Crando il PDF"); try { ArrayList<Movie> film=new ArrayList<Movie>(); // film.add(moviedao.getMovie(id)); Movie f; int posto=1; int fila=1; for(int i=0; i<number; i++){ f = new Movie(moviedao.getMovie(id).getTitle(),moviedao.getMovie(id).getActor(),moviedao.getMovie(id).getGenre(),moviedao.getMovie(id).getYear(),moviedao.getMovie(id).getLanguage()); f.setDurata("80m"); posto = posto +1; fila = fila +1; f.setPosto(posto+""); f.setFila(fila+""); f.setPrezzo("8.50"); film.add(f); } JasperDesign jasperDesign = JRXmlLoader.load(jasperFileSource); JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); JRBeanCollectionDataSource jrDataSource = new JRBeanCollectionDataSource(film); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, jrDataSource); String xmlStr = JasperExportManager.exportReportToXml(jasperPrint); //JasperExportManager.exportReportToPdfFile(jasperPrint, "/home/salvador/workspace/serverMovies/src/main/webapp/resources/ticket.pdf"); //Log.debug("PDF creato"); //System.out.println("Pdf file successfully generated."); return xmlStr; }//try catch (JRException e) { System.out.println("Error during the generation of PDF file.\n"); e.printStackTrace(); } //catch return "errore"; }//getPDF I find the solution for this problem, this is my controller:
@RequestMapping(value = "/movies/ticket", method = RequestMethod.GET)//stampa ticket public void getTicket(@RequestParam(value="id")int id, int numb, HttpServletResponse response) throws Exception {//numb=numeroBigliettiDaStampare,Id=specificoMovie byte[] xmlFile = serv.getPDF(id, numb); serv.streamReport(response, xmlFile, "report.pdf"); }//add that call two methods, the first that create from JasperReport a byteStream:
public byte[] getPDF(int id, int number){ String fileJrxml = "/home/salvador/workspace/serverMovies/src/main/webapp/resources/Jasper/ticket.jrxml"; File jasperFileSource = new File(fileJrxml); //Log.debug("Crando il PDF"); try { ArrayList<Movie> film=new ArrayList<Movie>(); // film.add(moviedao.getMovie(id)); Movie f; int posto=1; int fila=1; for(int i=0; i<number; i++){ f = new Movie(moviedao.getMovie(id).getTitle(),moviedao.getMovie(id).getActor(),moviedao.getMovie(id).getGenre(),moviedao.getMovie(id).getYear(),moviedao.getMovie(id).getLanguage()); f.setDurata("80m"); posto = posto +1; fila = fila +1; f.setPosto(posto+""); f.setFila(fila+""); f.setPrezzo("8.50"); film.add(f); }//for i JasperDesign jasperDesign = JRXmlLoader.load(jasperFileSource); JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); JRBeanCollectionDataSource jrDataSource = new JRBeanCollectionDataSource(film); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, jrDataSource); byte[] data= JasperExportManager.exportReportToPdf(jasperPrint); return data; }//try catch (JRException e) { System.out.println("Error during the generation of PDF file.\n"); e.printStackTrace(); } //catch return null; }//getPDF and the second where I use the stream to show my JasperReport in the browser:
public void streamReport(HttpServletResponse response, byte[] data, String name) throws IOException { response.setContentType("application/pdf"); response.setHeader("Content-disposition", "attachment; filename=" + name); response.setContentLength(data.length); response.getOutputStream().write(data); response.getOutputStream().flush(); }// streamReport