您的位置:首页 > 编程语言 > Java开发

jsf中用java导出pdf文件

2013-07-27 12:34 323 查看
前面提到用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~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jsf java 导出pdf