jsf中用java导出pdf文件

前面提到用java导出excel,然后头头一个心血来潮就想导出pdf了,废话不多说,直接上代码:

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~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值