jsf中用java导出pdf文件
2013-07-27 12:34
323 查看
前面提到用java导出excel,然后头头一个心血来潮就想导出pdf了,废话不多说,直接上代码:
因为有了前面的经验,知道List里面如果放的是实体类,处理方法和Map不一样,所以同样用一个if 来判断类型,这里有一个要注意的地方,这个java文件要引入
itextpdf这个jar包,但是如果只引入这个jar包的话,里面默认的Font是不支持中文的,所以还要再引入一个iTextAsian.jar,但是引入之后还是有错。。。原因嘛:
iText5.x版本以上中的font和encoding文件都是从String RESOURCE_PATH = "com/itextpdf/text/pdf/fonts/"加载的,而老itextasian.jar的包名是com.lowagie.text.pdf.fonts, 包名不一致导致路径错误。
具体解决方法就是修改包的路径了,详细方法如下:
1.解压iTextAsian.jar 得到如下目录: iTextAsian --com --lowagie --text --pdf --fonts --...(字体属性文件)
2.将解压后的com目录下的包名lowagie更改为itextpdf
3.在命令行转至iTextAsian目录,重新打包为iTextAsian.jar文件
4.打包命令如下: jar cvf iTextAsian.jar com/itextpdf/text/pdf/fonts/*
5.执行后,将新的iTextAsian.jar加入classpath路径
基本上就这个问题要注意一下,其它的也没啥问题,调用的方法跟前面的一样,连传的参数都一样,灰常easy~
package com.zhangbinhui.ManageBean; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import com.itextpdf.text.Document; import com.itextpdf.text.Font; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPRow; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; @ManagedBean @ViewScoped public class MakePDF { String fileName; String[] Title; List<Object> listContent; public String exportPDF(ActionEvent event) { fileName = (String) event.getComponent().getAttributes() .get("filename"); String title = (String) event.getComponent().getAttributes() .get("titles"); Title = title.split(","); String result = "系统提示:Excel文件导出成功!"; // 定义输出流,以便打开保存对话框______________________begin FacesContext facesContext = FacesContext.getCurrentInstance(); //Get the context ONCE HttpServletResponse response = (HttpServletResponse)facesContext.getExternalContext().getResponse(); Document doc = new Document(); ByteArrayOutputStream ba = new ByteArrayOutputStream(); try { //用一个writer绑定输出流和文档 PdfWriter writer = PdfWriter.getInstance(doc, ba); doc.open(); //标题字体 BaseFont bfTitle = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font titleFont = new Font(bfTitle, 18, Font.NORMAL); //内容字体 BaseFont bfComic = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font font = new Font(bfComic, 9, Font.NORMAL); //添加文件名称 Paragraph titleP=new Paragraph(fileName,titleFont); titleP.setAlignment(titleP.ALIGN_CENTER); doc.add(titleP); // doc.add(new Paragraph("解压后的com目录下的包名lowagie更改为itextpdf",font)); doc.add(new Paragraph(" ",font)); //添加表格 PdfPTable table = new PdfPTable (Title.length); table.setWidthPercentage(100); for(int i=0; i<Title.length; i++){ table.addCell(new Paragraph(Title[i],font)); } //这里要分成两种情况,第一种传的是List<Map>,用Map的方式处理 //第二种传的是List<Object>,用普通类取属性的方式来处理; List list = (List) event.getComponent().getAttributes().get("content"); Iterator iterator = list.iterator(); Object o = iterator.next(); if(o instanceof Map){ Map m = (Map) o; System.out.println(m); Iterator iter = m.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String[] key_value = entry.toString().split("="); System.out.println(key_value[1]); table.addCell(new Paragraph(key_value[1],font)); } while(iterator.hasNext()){ Map row_map = (Map) iterator.next(); Iterator row_iterator = row_map.entrySet().iterator(); while(row_iterator.hasNext()){ Map.Entry entry_column = (Map.Entry) row_iterator.next(); String[] key_value = entry_column.toString().split("="); table.addCell(new Paragraph(key_value[1],font)); } } } else{ listContent = (List<Object>)event.getComponent().getAttributes().get("content"); Field[] fields = null; Field f_value = null; for (Object obj : listContent) { fields = obj.getClass().getDeclaredFields(); for (Field v : fields) { f_value = obj.getClass().getDeclaredField(v.getName()); f_value.setAccessible(true); Object va = f_value.get(obj); if (va == null) { va = ""; } table.addCell(new Paragraph(va.toString(),font)); } } } //判断是否有空的格子,把缓存里面的内容全部写到出来 for(PdfPRow row:(ArrayList<PdfPRow>)table.getRows()){ for (PdfPCell cells : row.getCells()) { if (cells != null) { cells.setPadding(10.0f); } } } doc.add (table); } catch (Exception e) { e.printStackTrace(); } doc.close(); try { response.reset();// 清空输出流 response.setHeader("Content-disposition","attachment; filename="+ new String(fileName.getBytes("GB2312"),"ISO8859-1")+".pdf"); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } response.setContentType("application/pdf"); // 定义输出类型 response.setContentLength(ba.size()); ServletOutputStream sos; try { sos = response.getOutputStream(); ba.writeTo(sos); sos.flush(); sos.close(); facesContext.responseComplete(); } catch (IOException e) { e.printStackTrace(); } return result; } }
因为有了前面的经验,知道List里面如果放的是实体类,处理方法和Map不一样,所以同样用一个if 来判断类型,这里有一个要注意的地方,这个java文件要引入
itextpdf这个jar包,但是如果只引入这个jar包的话,里面默认的Font是不支持中文的,所以还要再引入一个iTextAsian.jar,但是引入之后还是有错。。。原因嘛:
iText5.x版本以上中的font和encoding文件都是从String RESOURCE_PATH = "com/itextpdf/text/pdf/fonts/"加载的,而老itextasian.jar的包名是com.lowagie.text.pdf.fonts, 包名不一致导致路径错误。
具体解决方法就是修改包的路径了,详细方法如下:
1.解压iTextAsian.jar 得到如下目录: iTextAsian --com --lowagie --text --pdf --fonts --...(字体属性文件)
2.将解压后的com目录下的包名lowagie更改为itextpdf
3.在命令行转至iTextAsian目录,重新打包为iTextAsian.jar文件
4.打包命令如下: jar cvf iTextAsian.jar com/itextpdf/text/pdf/fonts/*
5.执行后,将新的iTextAsian.jar加入classpath路径
基本上就这个问题要注意一下,其它的也没啥问题,调用的方法跟前面的一样,连传的参数都一样,灰常easy~
相关文章推荐
- java导出PDF文件的实例
- java导出PDF文件
- Java导出pdf文件数据
- java PDF文件导出
- jsf中用java代码把一个list的内容导出到本地excel
- java导出pdf文件工具类
- java导出pdf文件(插入图片及信息)
- java篇——java导出pdf文件
- Java导出PDF文件
- java操作office和pdf文件(四)页面列表导出cvs,excel、pdf报表.
- Java中导出pdf文件,pdf工具类demo
- java操作office和pdf文件(四)页面列表导出cvs,excel、pdf报表.
- JAVA按模版导出PDF文件,含条码,二维码,表格
- java 导出pdf文件
- 在java jasperreport 导出pdf excel html 文件到本地
- Java根据模板生成pdf文件并导出
- java导出pdf文件(插入图片及信息)
- Java导出PDF文件的实现
- java操作office和pdf文件页面列表导出cvs,excel、pdf报表.
- Java程序员从笨鸟到菜鸟之(一百零六)java操作office和pdf文件(四)页面列表导出cvs,excel、pdf报表.