基于BS的Java+iText导出PDF报表
2009-11-03 20:57:43 来源:WEB开发网核心提示: 常常会需要按照模板把数据库的数据整理打印出来,尝试过ireport、Word、PDF,基于BS的Java+iText导出PDF报表,各有各得优点,pdf在使用上是非常方便的,iText-2.1.3.jar(导出pdf所需包),iTextAsian.jar(亚洲语言包),只要制作好模板,基本上就算是成功了一半了
常常会需要按照模板把数据库的数据整理打印出来,尝试过ireport、Word、PDF,各有各得优点,pdf在使用上是非常方便的,只要制作好模板,基本上就算是成功了一半了。下面完整的把web工程中到处pdf的流程列出来,希望对网友们有点帮助。
1.制作模板
1) 首先,在word里面画好表格(注意是表格,刚开始的时候觉得表格对格式不好控制,就用画图工具里面的矩形画,那样是不行的),按照需要打印的格式。这一步是很重要的,因为如果word表格需要修改的话,会引起后面很多修改,工作量是很大的,所有提醒网友一定要确定最终模板后再进行操作。
2)然后就是导出pdf了。安装Adobe Acrobat (我用的是Adobe Acrobat 8 PRofessional),网上可以找到安装程序。安装后word里面会出现导出为pdf的控件,,如果没有的话也可以选择文件--打印,打印机中选择Adobe pdf,打印出pdf。
3)修改pdf模板。用Adobe Acrobat打开pdf模板,运行“表单--运行表单域识别”,该工具就会自动识别出需要填写内容的表格。如果有个别地方不能识别,可以点击“视图--工具栏--表单”找出表单工具,点击,可以在需要输入文本的地方画出文本域。双击识别出的文本域(),修改“名称(当作该文本域的标志,程序中给该字段赋值就是通过这个标志进行的,所以这个名字不能重复,而且最好是有一定意义的)”、“外观--字体()”,所有文本域都修改好保存。
2.导出代码
1)加载所需jar包,iText-2.1.3.jar(导出pdf所需包),iTextAsian.jar(亚洲语言包)。
2)整段代码如下:
public void genQRB() throws IOException {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
response.reset();
ByteArrayOutputStream ba = new ByteArrayOutputStream();
ByteArrayOutputStream totalba = new ByteArrayOutputStream();
PushbuttonField pushbuttonField = null;
String path = request.getsession().getServletContext().getRealPath("/");
try {
/* 打开已经定义好字段以后的pdf模板 */
String TemplatePDF = path + "pdf\\qrb_zsb.pdf";
/* 使用中文字体 */
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
BaseFont.NOT_EMBEDDED);
Font FontChinese = new Font(bf, 8, Font.NORMAL);
Font fontChinesesmall = new Font(bf, 6, Font.NORMAL);
PdfReader reader = null;
PdfStamper stamp = null;
AcroFields form = null;
PdfCopyFields copy = new PdfCopyFields(totalba);
reader = new PdfReader(TemplatePDF);
/* 将要生成的目标PDF文件名称 */
ba = new ByteArrayOutputStream();
stamp = new PdfStamper(reader, ba);
/* 取出报表模板中的所有字段 */
form = stamp.getAcroFields();
/* 为字段赋值,注意字段名称是区分大小写的 */
form.setFieldProperty("name", "textfont", bf, null);
... ...
//获取数据库中的数据
Bmxx bmxx = listBmxx();
form.setField("xm", bmxx.getXm());
stamp.setFormFlattening(true);
reader.close();
stamp.close();
copy.addDocument(new PdfReader(ba.toByteArray()));
ba.close();
copy.close();
reader = new PdfReader(totalba.toByteArray());
stamp = new PdfStamper(reader, ba);
form = stamp.getAcroFields();
stamp.close();
reader.close();
System.out.println("------------正在导出:ba.size:" + ba.size()
+ "||totalba.size():" + totalba.size());
} catch (DocumentException de) {
de.printStackTrace();
System.err.println("A Document error:" + de.getMessage());
}
// setting some response headers
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
/* 如果想出来让IE提示你是打开还是保存的对话框,加上下面这句就可以了 */
response.setHeader("Content-disposition", "attachment; filename="
+ "bmxxqrb.pdf");
response.setContentLength(ba.size());
try {
ServletOutputStream out = response.getOutputStream();
ba.writeTo(out);
// ba1.writeTo(out);
out.flush();
out.close();
ba.close();
totalba.close();
} catch (IOException e) {
e.printStackTrace();
System.err.println("A Document error:" + e.getMessage());
} finally {
if (ba != null)
ba.close();
if (totalba != null)
totalba.close();
}
}
1.制作模板
1) 首先,在word里面画好表格(注意是表格,刚开始的时候觉得表格对格式不好控制,就用画图工具里面的矩形画,那样是不行的),按照需要打印的格式。这一步是很重要的,因为如果word表格需要修改的话,会引起后面很多修改,工作量是很大的,所有提醒网友一定要确定最终模板后再进行操作。
2)然后就是导出pdf了。安装Adobe Acrobat (我用的是Adobe Acrobat 8 PRofessional),网上可以找到安装程序。安装后word里面会出现导出为pdf的控件,,如果没有的话也可以选择文件--打印,打印机中选择Adobe pdf,打印出pdf。
3)修改pdf模板。用Adobe Acrobat打开pdf模板,运行“表单--运行表单域识别”,该工具就会自动识别出需要填写内容的表格。如果有个别地方不能识别,可以点击“视图--工具栏--表单”找出表单工具,点击,可以在需要输入文本的地方画出文本域。双击识别出的文本域(),修改“名称(当作该文本域的标志,程序中给该字段赋值就是通过这个标志进行的,所以这个名字不能重复,而且最好是有一定意义的)”、“外观--字体()”,所有文本域都修改好保存。
2.导出代码
1)加载所需jar包,iText-2.1.3.jar(导出pdf所需包),iTextAsian.jar(亚洲语言包)。
2)整段代码如下:
public void genQRB() throws IOException {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
response.reset();
ByteArrayOutputStream ba = new ByteArrayOutputStream();
ByteArrayOutputStream totalba = new ByteArrayOutputStream();
PushbuttonField pushbuttonField = null;
String path = request.getsession().getServletContext().getRealPath("/");
try {
/* 打开已经定义好字段以后的pdf模板 */
String TemplatePDF = path + "pdf\\qrb_zsb.pdf";
/* 使用中文字体 */
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
BaseFont.NOT_EMBEDDED);
Font FontChinese = new Font(bf, 8, Font.NORMAL);
Font fontChinesesmall = new Font(bf, 6, Font.NORMAL);
PdfReader reader = null;
PdfStamper stamp = null;
AcroFields form = null;
PdfCopyFields copy = new PdfCopyFields(totalba);
reader = new PdfReader(TemplatePDF);
/* 将要生成的目标PDF文件名称 */
ba = new ByteArrayOutputStream();
stamp = new PdfStamper(reader, ba);
/* 取出报表模板中的所有字段 */
form = stamp.getAcroFields();
/* 为字段赋值,注意字段名称是区分大小写的 */
form.setFieldProperty("name", "textfont", bf, null);
... ...
//获取数据库中的数据
Bmxx bmxx = listBmxx();
form.setField("xm", bmxx.getXm());
stamp.setFormFlattening(true);
reader.close();
stamp.close();
copy.addDocument(new PdfReader(ba.toByteArray()));
ba.close();
copy.close();
reader = new PdfReader(totalba.toByteArray());
stamp = new PdfStamper(reader, ba);
form = stamp.getAcroFields();
stamp.close();
reader.close();
System.out.println("------------正在导出:ba.size:" + ba.size()
+ "||totalba.size():" + totalba.size());
} catch (DocumentException de) {
de.printStackTrace();
System.err.println("A Document error:" + de.getMessage());
}
// setting some response headers
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
/* 如果想出来让IE提示你是打开还是保存的对话框,加上下面这句就可以了 */
response.setHeader("Content-disposition", "attachment; filename="
+ "bmxxqrb.pdf");
response.setContentLength(ba.size());
try {
ServletOutputStream out = response.getOutputStream();
ba.writeTo(out);
// ba1.writeTo(out);
out.flush();
out.close();
ba.close();
totalba.close();
} catch (IOException e) {
e.printStackTrace();
System.err.println("A Document error:" + e.getMessage());
} finally {
if (ba != null)
ba.close();
if (totalba != null)
totalba.close();
}
}
更多精彩
赞助商链接