从服务器获取报表模板到html页面显示报表pdf

来源:互联网 发布:js 添加卡片效果 编辑:程序博客网 时间:2024/06/03 19:17

  1、我用到的jar包为jasperreports-3.5.3jar包。制作报表模板用到的工具为:iReport-nb-3.5.0

2、首先将从数据库中获取到的数据转成list.

3、public static <T extends com.pwyec.utils.report.javabean.BasePrintEntity> JasperPrint getPrintDataSource(String path,List<T> dataSource) throwsClientProtocolException, IOException, JRException{
/*通过文件名,获得模板文件*/
HttpClient httpclient = new DefaultHttpClient(); 
HttpGet httpgets = new HttpGet(path); 
/*将模板文件转成流*/
    HttpResponse response = httpclient.execute(httpgets);    
    HttpEntity entity = response.getEntity();  
    InputStream instreams = null;
    if (entity != null) {    
    instreams  = entity.getContent(); 
     
    }   
    JasperReport jasperReport = JasperCompileManager.compileReport(instreams);    
    JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataSource);
    Map parameters = new HashMap();
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, beanColDataSource);
    return jasperPrint;
}

其中 path为模板配置文件的路径。dataSource为数据源。

用该方法将之转成JasperPrint

4、在控制器 我们拿到JasperPrint

@Token(save = true)
@RequestMapping(value = "printPdf", method = RequestMethod.GET)
public void printPdf(String id,
HttpServletRequest request, HttpServletResponse response) {
JasperPrint jasperPrint = null;
StoreJumpSession jump = (StoreJumpSession) WebUtil.getPrincipal();
IStoreSessionUser user = jump.getStoreUser();
try {
jasperPrint =getPrintDataSource(String path,List<T> dataSource);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


JRPdfExporter pdfExporter = new JRPdfExporter();
pdfExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
OutputStream stream = null;
ByteArrayOutputStream exportStream = new ByteArrayOutputStream();
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/pdf");
pdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
exportStream);
pdfExporter.setParameter(JRExporterParameter.CHARACTER_ENCODING,
"UTF-8");
try {
pdfExporter.exportReport();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PdfReader reader = new PdfReader(new ByteArrayInputStream(
exportStream.toByteArray()));
stream = response.getOutputStream();
PdfStamper pdfStamper = new PdfStamper(reader, stream);
pdfStamper.setViewerPreferences(PdfWriter.HideMenubar
| PdfWriter.HideToolbar | PdfWriter.HideWindowUI);
pdfStamper.addJavaScript(PrintHelper.getPrintScript());
pdfStamper.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (exportStream != null) {
try {
exportStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

public static String getPrintScript(){

StringBuffer script = new StringBuffer(); 
script.append("this.print({bUI: false,bSilent: true,bShrinkToFit: false});")
.append("\r\nthis.closeDoc();");

return script.toString();

然后在js写一个调用该控制器的方法就可以了

0 0