报表处理在企业信息系统中一直起着重要的作用,本章将介绍一种生成PDF报表的Java组件——iText。在服务器端使用JSP或JavaBean生成PDF报告,客户端使用超链接显示或下载生成的报告,这是一个很好的解决方案B/S系统报表处理问题。本章的主要内容是iText组件的介绍、开发和典型应用。
iText是著名的开放源码站sourceforge用于生成的项目PDF文档的一个Java类库。通过iText不仅可以生成PDF或RTF文档,可以XML、HTML文件转化为PDF文件。iText组件的下载方式如下:
在IE输入地址栏输入地址栏http://www.lowagie.com/iText/download.html进入如图15.1所示页面。
图15.1 iText下载链接类库
当前最新的iText类库版本为2.0.2,单击如图15.1所示的“itext-2.0.2.jar可以下载超链接iText类库文件(itext-2.0.2.jar)。下载itext-2.0.2.jar文件完成后,系统环境变量只需要CLASSPATH中加入itext-2.0.2.jar可用于程序iText类库了。
iText作为文本输出Java提供开源代码PDF、HTML、RTF各种文件格式的输出功能。为输出各种文本提供了更好的包装。PDF该报表的输出只使用了整个开源代码的一小部分。
作为最基本的程序设计实践,最经典的例子仍然是Hello World请参见以下示例。
示例15-01 在JSP页面生成PDF
实现这个例子JSP在页面写代码,输出Hello World,输出格式为PDF。程序运行结果如图15.2所示。
图15.2 输出“Hello World”
程序代码如下:
代码15-01 光盘位置:光盘\mingrisoft\15\sl\01
<%@ page language="java" pageEncoding="gb2312"%>
<%@ page import="java.io.*,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
response.reset();
response.setContentType("application/pdf");
//步骤1
Document document = new Document();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
//步骤2
PdfWriter.getInstance(document, buffer);
//步骤3
document.open();
//步骤4
document.add(new Paragraph("Hello World"));
//步骤5
document.close();
out.clear();
out = pageContext.pushBody();
DataOutput output = new DataOutputStream(response.getOutputStream());
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for (int i = 0; i < bytes.length; i ) {
output.writeByte(bytes[i]);
}
%>
在上述代码中,解释了以下两个问题。
(1)一个PDF输出文件只需要以下五个步骤。
第一步:创建一个Document实例。
Document document = new Document();
在上述代码中建立com.lowagie.text.Document对象的例子。对象有三种结构方法:
public Document();
public Document(Rectangle pageSize); //定义页面的大小
public Document(Rectangle pageSize,int marginLeft,int marginRight,int marginTop,int marginBottom); /*定义页面的大小,参数marginLeft、marginRight、marginTop、marginBottom分别为左、右、上、下的页边距*/
通过Rectangle类对象的参数可以设定页面大小、页面背景色、以及页面横向/纵向等属性。iText定义了A0-A10、AL、LETTER、HALFLETTER、_11x17、LEDGER、NOTE、B0-B5、ARCH_A-ARCH_E、FLSA 和FLSE等纸张类型,也可以通过下面的代码自定义纸张:
Rectangle pageSize = new Rectangle(144,720);
当然,通过Rectangle类中的rotate()方法也可以将页面设置成横向。
步骤2:将Document实例和文件输出流用PdfWriter类绑定在一起。
PdfWriter.getInstance(document, buffer);
当文档(Document)对象建立完毕,需要建立一个或多个书写器(Writer)对象与之关联。通过书写器对象可以将具体文档存盘成需要的格式,如com.lowagie.text.PDF.PDFWriter可以将文档存成PDF文件,com.lowagie.text.html.HtmlWriter可以将文档存成html文件。
步骤3:开文档。
document.open();
步骤4:在文档中添加文字。
document.add(new Paragraph("Hello World"));
步骤5:关闭文档。
document.close();
通过上述5个步骤,就可以生成一个PDF文档了。
其中关键的是步骤2和步骤4。步骤2将一个文件流绑定到了PDF文档中;步骤4向文档中添加了一些文字,在这两个步骤中稍作改动,一个PDF文档就可以做出来了。
(2)response.getOutputStream()抛出IllegalStateException异常。
在JSP使用如下代码:
response.reset();
response.setContentType("application/pdf");
DataOutput output = new DataOutputStream(response.getOutputStream());
抛出异常结果如下:
ERROR [Engine] StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exceptionjava.lang.IllegalStateException: getOutputStream() has already been called for this response
造成上述异常的主要是Web容器生成的Servlet代码中有out.write(""),这个和JSP中调用的response.getOutputStream()产生冲突。Servlet规范说明,不能既调用response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时应会抛出IllegalStateException,因为在jsp中,out变量是通过response.getWriter()方法得到的,在程序中既用了response.getOutputStream,又用了out变量,故出现以上错误。解决方案是在程序中添加如下代码即可:
out.clear();
out=pageContext.pushBody();
1.PDF文档的页面设置
通常情况下,需要将报表打印出来,这就涉及了一个页面的设置问题,作为报表的PDF文件,一定要适合打印机的输出打印。在iText组件中,可以通过下面的代码实现将PDF文档设定成A4页面大小:
Rectangle rectPageSize = new Rectangle(PageSize.A4);
//定义A4页面大小
rectPageSize = rectPageSize.rotate();
//加上这句可以实现A4页面的横置
Document doc = new Document(rectPageSize,50,50,50,50);
//其余4个参数设置了页面的4个边距
在上述代码中,Rectangle类在提供了大小自定义设置的同时,也可以传入一个PageSize类的属性,其中的属性提供了几种常用的页面样式。
2.PDF文档的生成
如果想要生成一个PDF文档,可以执行下面的代码:
Document document = new Document();
PdfWriter.getInstance(document,new FileOutputStream("mingri.pdf"));
//生成一个名称为minri的PDF文件
document.addTitle("Hello mingri example");
document.addAuthor("wolf");
document.addSubject("This example explains how to add metadata.");
document.addKeywords("iText, Hello mingri");
document.addCreator("My program using iText");
//以上代码是生成的PDF文件的属性
document.open();
document.add(new Paragraph("Hello mingri!"));//在PDF文件中加入文字
document.close();
在上述代码中,直接将PDF文件生成在服务器端。
中文的输出是Java本身的问题,为了解决中文的输出问题,需要多下载一个名为iTextAsian.jar的类库文件。该文件的下载地址为“http://prdownloads.sourceforge.net/itext/iText Asian.jar”。这个类库文件定义了与中文输出相关的一些文件。
为了输出中文,可以通过以下代码进行解决:
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
在上述代码中,定义了中文的基础字体。其中,“STSong-Light”定义了使用的中文字体,iTextAsian.jar类库中提供了几个可供使用的字体,都是以properties结尾的文件。“UniGB-UCS2-H”定义文字的编码标准和样式,GB代表编码方式为gb2312,H代表横排字,V代表竖排字,iTextAsian.jar类库中以cmap结尾的几个文件都是关于编码和样式定义的。
注意:这里需要说明的是iText的一个特点,出错的时候,不会有什么提示,只会把出错的部分跳过去。例如,在没有用中文字体的情况下输出中文,中文部分的段落会是空白的,再例如,如果一个文档中出现一些错误,PDF文件还是照样输出,不过整个文档会是空白的。
Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
用这个中文的基础字体实例化了一个字体类。
Paragraph par = new Paragraph("世界你好",FontChinese)
将字体类用到了一个段落中。
document.add(par);
将段落添加到了文档中。
示例15-02 在JSP页面生成PDF,输出中文
在JSP页面中编写代码,输出“您好,明日科技”,并且输出的格式为PDF。程序运行结果如图15.3所示。
图15.3 输出“您好,明日科技”
程序代码如下:
代码15-02 光盘位置:光盘\mingrisoft\15\sl\02
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ page
import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
response.reset();
response.setContentType("application/pdf");
Document document = new Document();
//下面进行中文设置
BaseFont bfChinese = BaseFont.createFont("STSong-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
Paragraph par = new Paragraph("您好,明日科技",FontChinese);
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PdfWriter.getInstance(document, buffer);
document.open();
document.add(par);
document.close();
out.clear();
out = pageContext.pushBody();
DataOutput output = new DataOutputStream(response.getOutputStream());
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for (int i = 0; i < bytes.length; i++) {
output.writeByte(bytes[i]);
}
%>
iText中处理表格的类为com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable,对于比较简单的表格处理可以用com.lowagie.text.Table,但是如果要处理复杂的表格,就需要com.lowagie.text.PDF.PDFPTable进行处理。
1.com.lowagie.text.Table类
com.lowagie.text.Table类的构造函数有3个:
Table (int columns)
Table(int columns, int rows)
Table(Properties attributes)
参数columns、rows、attributes分别为表格的列数、行数、表格属性。创建表格时必须指定表格的列数,而行数可以不指定。建立表格之后,可以设定表格的属性,如边框宽度、边框颜色、单元格之间的间距大小等属性。
示例15-03 在JSP页面生成PDF,输出表格和中文
本示例主要实现的功能是在PDF报表中输出表格内容,程序运行结果如图15.4所示。
图15.4 输出表格和中文
代码15-03 光盘位置:光盘\mingrisoft\15\sl\03
程序开发步骤如下:
(1)创建名称为PDFParagraph.java的类文件,该文件的代码如下:
package com;
import java.io.IOException;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
public class PDFParagraph extends Paragraph {
public PDFParagraph(String content) {
super(content, getChineseFont()); //通过构造方法实现字体定义功能
}
//设置转型字体的方法
private static final Font getChineseFont() {
Font FontChinese = null;
try {
BaseFont bfChinese = BaseFont.createFont("STSong-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
FontChinese = new Font(bfChinese, 12, Font.NORMAL);
} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}
return FontChinese;
}
}
在上述代码中,PDFParagraph.java继承了Paragraph类,通过构造方法中的super()方法,将传入的参数通过getChineseFont()方法进行转型。
(2)创建名称为index.jsp的页面文件,该文件的代码主要实现通过PDF输出表格的功能,具体代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ page
import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<jsp:directive.page import="com.PDFParagraph"/>
<%
response.reset();
response.setContentType("application/pdf");
Document document = new Document();
//设置表格的形式
Table table = new Table(3);//设置列数为3个表格
table.setBorderWidth(1); //将边框宽度设为1
table.setBorderColor(new Color(0, 0, 255)); //将边框的颜色设置为蓝色
table.setPadding(5);
table.setSpacing(5);
//上面两行代码是设置单元格的间距
Cell cell = new Cell(new PDFParagraph("表头设置")); //设置表头的名称
cell.setHeader(True);//将该单元格作为表头信息显示
cell.setColspan(3);//指定了该单元格占3列,为表格添加表头信息
table.addCell(cell);
table.endHeaders();/*要注意的是一旦表头信息添加完了之后,必须调用endHeaders()方法,否则当表格跨页后,表头信息不会再显示*/
cell = new Cell(new PDFParagraph("上下占据两个单元格子"));
cell.setRowspan(2);//将文字上下占据两个单元格
cell.setBorderColor(new Color(255, 0, 0)); //将单元格设置为红色
table.addCell(cell);
table.addCell(new PDFParagraph("占据单元格1"));
table.addCell(new PDFParagraph("占据单元格2"));
table.addCell(new PDFParagraph("占据单元格3"));
table.addCell(new PDFParagraph("占据单元格4"));
table.addCell(new PDFParagraph("占据单元格5"));
//以上代码是加载文字
cell = new Cell(new PDFParagraph("上下左右占据四个单元"));
cell.setRowspan(2);
cell.setColspan(2);
//以上代码将文字占据4个单元格
table.addCell(cell);
table.addCell(new PDFParagraph("占据单元格6"));
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PdfWriter.getInstance(document, buffer);
document.open();
document.add(table);
document.close();
out.clear();
out = pageContext.pushBody();
DataOutput output = new DataOutputStream(response.getOutputStream());
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for (int i = 0; i < bytes.length; i++) {
output.writeByte(bytes[i]);
}
%>
说明:表格的设置请查看上述代码的说明部分。
2.com.lowagie.text.PdfPTable类
通过上面的介绍,可以正常地输出中文了,再加上一些合适的表格,就可以很好地输出一个PDF报表了。
iText中一个文档可以有很多个表格,一个表格可以有很多个单元格,一个单元格里面可以放很多个段落,一个段落里面可以放一些文字。但是,必须明确以下两点。
(1)在iText中没有行的概念,一个表格里面直接放单元格,如果一个3列的表格中放进6个单元格的话,那么就是两行的表格。
(2)如果一个3列的表格放入5个最基本的没有任何跨列设置的单元格,表格会出错。例如,表格根本添加不到文档中,而且不会有任何的提示。
下面的示例将通过com.lowagie.text.PdfPTable类实现一个3行3列的表格。
示例15-04 在JSP页面生成PDF,输出3行3列的表格
本示例将通过com.lowagie.text.PdfPTable类输出一个3行3列的表格,程序运行结果如图15.5所示。
图15.5 输出3行3列的表格
代码15-04 光盘位置:光盘\mingrisoft\15\sl\04
创建名称为index.jsp页面,该页面通过PdfPTable类定义3列表格,并通过for语句循环输出表格。index.jsp页面的关键代码如下:
<%@ page
import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
response.reset();
response.setContentType("application/pdf");
Document document = new Document();
//设置表格的形式
PdfPTable table = new PdfPTable(3);
for (int i = 0; i < 9; i++) {
PdfPCell cell = new PdfPCell();
cell.addElement(new Paragraph(String.valueOf(i)));
table.addCell(cell);
}
//以下代码与示例15-03中的index.jsp是相同的,这里不再给出
%>
对于一个表格,经常会遇到的另外一个问题就是跨列。在这里,只要通过PdfPCell类对象的实例设置跨列的数字即可。例如下面的代码:
cell.setColSpan(3); //这个单元格就相当于3个单元格添加到表格中了
在报表中,有时候会碰到非常大的表格,如果希望在浏览第二页时仍能够看到表头就需要用到表格头的设置,简单地调用PdfPTable类实例的setHeaderRows()方法就可以设定表格头有几行了。例如:
able.setHeaderRows(2);//设置了头两行为表格头
注意:如果设置了一个n行的表格头,但最终结果中表格仅有n行或者还不够n行,表格会出错,导致整个表格无法写到文档中。
iText中处理表格的类为com.lowagie.text.Image,目前iText支持的图像格式有GIF、jpg、PNG、wmf等,对于不同的图像格式,iText用同样的构造方法自动识别图像格式。通过下面的代码分别获得GIF、jpg、PNG图像的实例。
Image gif = Image.getInstance("vonnegut.gif");
Image jpeg = Image.getInstance("myKids.jpg");
Image png = Image.getInstance("hitchcock.png");
1.图像的位置
图像的位置主要是指图像在文档中的对齐方式、图像和文本的位置关系。例如:
public void setAlignment(int alignment)
该方法属于Image类中的方法,该方法主要处理图像的各种位置,参数alignment的可选值为Image.RIGHT、Image.MIDDLE和Image.LEFT,分别指右对齐、居中和左对齐;当参数alignment为Image.TEXTWRAP、Image.UNDERLYING时,分别指文字绕图形显示、图形作为文字的背景显示。这两种参数可以结合以达到预期的效果,例如:
setAlignment(Image.RIGHT|Image.TEXTWRAP)
上述代码实现的显示效果为图像右对齐,文字围绕图像显示。
2.图像的尺寸和旋转
如果图像在文档中不按原尺寸显示,可以通过下面的代码进行设定:
public void scaleAbsolute(int newWidth, int newHeight)
//直接设定显示尺寸
public void scalePercent(int percent)
//设定显示比例,如scalePercent(50)表示显示的大小为原尺寸的50%
public void scalePercent(int percentX, int percentY)
//图像高宽的显示比例
如果图像需要旋转一定角度之后在文档中显示,可以通过下面的代码进行实现:
public void setRotation(double r)
上述方法中,参数r为弧度,如果旋转角度为30度,则参数r= Math.PI / 6。
示例15-05 在JSP页面生成PDF,输出图片内容
本示例将图片内容通过PDF显示出来,程序运行结果如图15.6所示。
图15.6 输出图片内容
(1)创建PDFParagraph.java类文件,该类继承了Paragraph,主要功能是定义字体的类型,程序代码与代码15-03中的代码相同。
(2)创建名称为index.jsp的页面,该页面的关键代码如下:
代码15-05 光盘位置:光盘\mingrisoft\15\sl\05
<%@ page
import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*,com.lowagie.text.pdf.*"%>
<%
response.reset();
response.setContentType("application/pdf");
Document document = new Document();
//获取图片的路径
String filePath=pageContext.getServletContext().getRealPath("ALJX.jpg");
Image jpg = Image.getInstance(filePath);
Table table=new Table(2);
table.setBorderWidth(1); //将边框宽度设为0
table.setBorderColor(new Color(255, 255, 255)); //将边框的颜色设置为白色
//将图片加载在表格中
table.addCell(new Cell(jpg));
table.addCell(new com.PDFParagraph("JSP数据库系统开发案例精选"));
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PdfWriter.getInstance(document, buffer);
document.open();
//通过表格进行输出图片的内容
document.add(table);
document.close();
out.clear();
out = pageContext.pushBody();
DataOutput output = new DataOutputStream(response.getOutputStream());
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for (int i = 0; i < bytes.length; i++) {
output.writeByte(bytes[i]);
}
%>
在上述代码中,首先定义1列表格,接着通过下面这段代码获取图片的路径:
pageContext.getServletContext().getRealPath("ALJX.jpg")
其次通过下面的代码将图片加载到Table表格中:
table.addCell(new Cell(jpg));
最后通过document.add()方法打开图片。
注意:如果想对图片进行各种设置,可以根据本小节中介绍的内容自行设置.
实例位置:光盘\mingrisoft\15\dxyy\01
本实例将实现通过访问Servlet,读取PDF报表。程序发布后,在IE地址栏中输入“http://localhost:8080/01/PDFServlet”,运行结果如图15.7所示。
图15.7 读取PDF报表
程序开发步骤如下。
(1)创建名称为PDFServlet.java的类文件,该类继承了HttpServlet,关键代码如下:
package com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import javax.servlet.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
public class PDFServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Document document = new Document(PageSize.A4, 36, 36, 36, 36);
ByteArrayOutputStream ba = new ByteArrayOutputStream();
try {
PdfWriter.getInstance(document, ba);
document.open();
document.add(new Paragraph("Hello MingRiSoft"));
} catch (DocumentException de) {
de.printStackTrace();
}
document.close();
response.setContentType("application/pdf");
response.setContentLength(ba.size());
ServletOutputStream out = response.getOutputStream();
ba.writeTo(out);
out.flush();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
在上述代码中,将PDF信息通过ServletOutputStream类的对象out输出。
(2)在web.xml中配置PDFServlet.java类文件,配置代码如下:
<servlet>
<description>Simple Servlet</description>
<display-name>Servlet</display-name>
<servlet-name>PDFServlet</servlet-name>
<servlet-class>com.PDFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PDFServlet</servlet-name>
<url-pattern>/PDFServlet</url-pattern>
</servlet-mapping>
</web-app>
实例位置:光盘\mingrisoft\15\dxyy\02
本实例将数据表查询出的信息循环显示在PDF文档中,程序运行结果如图15.8所示。
图15.8 将数据表信息显示在PDF文档中
程序开发步骤如下。
(1)创建名称为ProductInfo.java的类文件,该类的属性与数据表中字段的名称一一对应,并实现getXXX()和setXXX()方法,程序代码如下:
package com;
public class ProductInfo {
private Integer id=new Integer(-1); //映射产品编号
private String name=""; //映射产品名称
private String number=""; //映射产品数量
private String bron=""; //映射产品产地
public String getBron() {
return bron;
}
public void setBron(String bron) {
this.bron = bron;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
(2)创建PDFParagraph.java类文件,该类继承了Paragraph,主要功能是定义字体的类型,程序代码与示例15-03中的代码相同。
(3)创建JDBConnection.java类文件,该类主要实现数据库连接与数据表的各种操作,程序代码如下:
package com;
import java.sql.*;
import java.util.*;
public class JDBConnection {
private final String dbDriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
private final String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_JSDQ15";
private final String userName = "sa";
private final String password = "";
private Connection con = null;
// 通过构造方法加载数据库驱动
public JDBConnection() {
try {
Class.forName(dbDriver).newInstance();
con = DriverManager.getConnection(url, userName, password);
con.setAutoCommit(True);
} catch (Exception ex) {
System.out.println("数据库加载失败");
}
}
// 对数据库的查询操作
public ResultSet executeQuery(String sql) {
ResultSet rs;
try {
Statement stmt = con.createStatement();
try {
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
System.out.println(e.getMessage());
return null;
}
} catch (SQLException e) {
System.out.println(e.getMessage());
System.out.println("executeQueryError!");
return null;
}
return rs;
}
// 关闭数据库
public void closeConnection() {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
con = null;
}
}
}
//实现数据表查询操作
public List selectProductList() {
List list = new ArrayList();
ProductInfo info = null;
String sql = "select * from tb_product";
ResultSet rs = this.executeQuery(sql);
try {
while (rs.next()) {
info = new ProductInfo();
info.setId(Integer.valueOf(rs.getString(1)));
info.setName(rs.getString(2));
info.setNumber(rs.getString(3));
info.setBron(rs.getString(4));
list.add(info);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
}
(4)创建名称为index.jsp的页面文件,该页面的主要功能是查询数据表中的信息并显示在PDF报表中,该页面的主要代码如下:
<%@ page language="java" pageEncoding="gb2312"%>
<%@ page
import="java.util.List,java.io.*,com.lowagie.text.*,com.lowagie.text.pdf.*,com.lowagie.text.pdf.*"%>
<jsp:directive.page import="com.*" />
<%
response.reset();
response.setContentType("application/pdf");
Document document = new Document();
//对表头进行设置
String title[] = { "编号", "姓名", "数量", "产地" };
PdfPTable table = new PdfPTable (title.length);//定义表格的列数
PdfPCell cell = null;
for (int i = 0; i < title.length; i++) {
cell = new PdfPCell ();
cell.addElement(new PDFParagraph(title[i]));
table.addCell(cell);
}
//表体设置
JDBConnection connection = new com.JDBConnection();
List list = connection.selectProductList();//调用数据表中的内容存放在List对象中
for (int j = 0; j < list.size(); j++) {
ProductInfo info = (ProductInfo) list.get(j);
table.addCell(info.getId().toString());
table.addCell(new PDFParagraph(info.getName()));
table.addCell(info.getNumber());
table.addCell(new PDFParagraph(info.getBron()));
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PdfWriter.getInstance(document, buffer);
document.open();
document.add(table);
document.close();
out.clear();
out = pageContext.pushBody();
DataOutput output = new DataOutputStream(response.getOutputStream());
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for (int i = 0; i < bytes.length; i++) {
output.writeByte(bytes[i]);
}
%>
======分割线==========
利用iText五步