- 浏览: 81678 次
- 性别:
- 来自: 西安
文章分类
最新评论
iText组件简介
在企业的信息系统中,报表处理一直占比较重要的作用,本章将介绍一种生成PDF报表的Java组件——iText。通过在服务器端使用JSP或JavaBean生成PDF报表,客户端采用超级链接显示或下载得到生成的报表,这样就很好地解决了B/S系统的报表处理问题。本章的主要内容为iText组件的简介、开发以及典型应用。
15.1 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类库了。
15.2 iText组件开发
iText作为一个文本输出的Java开源代码,提供了PDF、HTML、RTF等多种文件格式的输出功能。为输出各种文本提供了一个比较好的封装。对于PDF报表的输出,仅用到了整个开源代码很小的一个部分。
15.2.1 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文件的输出,总共只需要以下5个步骤。
步骤1:创建一个Document实例。
Document document = new Document();
在上述代码中,建立com.lowagie.text.Document对象的实例。该对象的构造方法有3个:
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();
15.2.2 PDF文档的页面设置与生成
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文件生成在服务器端。
15.2.3 中文的输出
中文的输出是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]);
}
%>
15.2.4 表格的设置
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行,表格会出错,导致整个表格无法写到文档中。
15.2.5 图像处理
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()方法打开图片。
注意:如果想对图片进行各种设置,可以根据本小节中介绍的内容自行设置。
15.3 iText组件的典型应用
15.3.1 访问Servlet,读取PDF报表
实例位置:光盘/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>
15.3.2 查询数据表中的信息并显示在PDF报表
实例位置:光盘/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]);
}
%>
相关推荐
`core-renderer.jar`可能是与HTML渲染相关的组件,但具体功能需要查看其文档或源码来确认。 以下是一个简单的示例代码,展示了如何使用iText和Flying Saucer将HTML转换为PDF: ```java import ...
在这个特定的压缩包中,我们看到三个版本号不同的iText组件:iText-2.1.3、iTextAsian以及iText-rtf-2.1.3。这些组件在Linux环境下能够帮助用户生成DOC和Word文档。 iText-2.1.3是iText的一个早期版本,它提供了...
在给定的压缩包文件中,我们看到了"itext+itext-rtf"的文件,这意味着它可能包含了iText的基本库和iText-RTF的组件。通常,这些JAR(Java Archive)文件会被添加到Java项目的类路径中,以便项目能够使用iText库的...
在处理中文内容时,iText通常需要额外的组件来支持汉字的正确显示和排版。 在Java开发中,JAR(Java Archive)文件是一种归档格式,用于封装多个类文件和资源,以便在运行时一起加载。"iText所需要的jar包"指的是...
这个"IText7jar集合"可能是指包含多个版本或不同组件的IText7 JAR文件的打包集合,供开发者在不同的项目环境中选择使用。在Java开发中,JAR(Java Archive)文件是一种归档格式,用于封装类库、资源和元数据,便于...
#### 二、iText简介 ##### 2.1 概述 iText是一个著名的开源项目,由SourceForge维护和支持。作为一个强大的Java类库,iText能够帮助开发者轻松生成包含文本、表格、图形等复杂元素的PDF文档。此外,它还具备将XML、...
这个压缩包包含了iText库的几个关键组件,具体包括: 1. **iText-2.1.7.jar**: 这是iText的主要库文件,版本为2.1.7。在这一版本中,iText提供了许多核心功能,如创建PDF文档、添加文本、图像和表格,以及处理PDF...
本资源"itext7-7.0.5.zip最全包"包含了iText7的核心组件及其相关模块,便于开发人员进行各种文件操作,如Word、PDF、Excel和TXT等。 1. **iText7-Kernel**: iText7的核心组件是iText7-Kernel,它包含了处理PDF...
4. **布局组件**:iText7提供了一套强大的布局组件,如Paragraph、Chunk、ColumnText等,这些可以帮助开发者更方便地控制文档的排版和样式。 5. **事件驱动的处理**:通过监听器接口,开发者可以在PDF文档的生命...
**itextpdf-5.3.0.jar** 是核心库文件,包含了运行时所需的类和资源,它是iText5的核心组件,用于在Java应用程序中直接引用和使用。 **itext-xtra-5.3.0-javadoc.jar** 和 **itext-xtra-5.3.0-sources.jar** 文件则...
以下是对这个库及其相关组件的详细说明: 1. **IText库**:IText是一个强大的Java库,允许开发人员在Java应用程序中创建、修改和处理PDF文档。它提供了丰富的API,用于添加文本、图像、表格、超链接、书签、表单...
在标题提到的"iText,iTextAsian_1.5.2"中,我们可以看到两个主要的组件:iText核心包和iTextAsian_1.5.2支持中文的jar包。 **iText核心包(iText.jar)** iText的核心包提供了处理PDF文档的基本功能。以下是一些...
本篇文章将深入探讨iText7的核心组件和使用方法,帮助读者掌握这一强大的工具。 首先,我们来看iText7的主要组成部分: 1. **iText7-kernel-7.0.2.jar**:这是iText7的核心模块,包含了创建和操作PDF文档的基本...
这个“报表组件iText_API”很可能是关于如何使用iText库来生成和处理报表的详细指南,特别是针对API的用法。 首先,iText的核心功能包括: 1. **创建PDF**:你可以使用iText轻松地创建新的PDF文档,添加页面,设置...
压缩包中的子文件名列表展示了iText7的不同组件及其对应的签名验证文件(.asc),这通常是用来确保软件包的完整性和未被篡改。以下是列表中的每个文件代表的组件: 1. itext7-forms-7.0.2.jar.asc:iText7表格处理...
iText 是一款功能强大的开源 Java 组件,用于生成 PDF 文档。通过 iText,可以生成 PDF 或 RTF 文档,并可以将 XML、HTML 文件转化为 PDF 文件。iText 的安装非常方便,只需要下载 iText.jar 文件并将其添加到系统的...
总的来说,iText 5.1.0通过引入iTextAsian组件,成功地解决了中文支持问题,为Java开发者提供了更全面的PDF处理解决方案。无论是在企业级应用还是个人项目中,它都是生成和处理中文PDF文档的理想选择。配合详细的...
本文将详细探讨iText5的5.5.12版本,以及其组件在PDF处理中的作用。 iText5是iText库的一个主要分支,提供了强大的PDF操作功能,包括创建、读取、更新和签名PDF文档。在5.5.12这个版本中,iText5进一步优化了性能和...
这些依赖涵盖了iText的基本组件,包括PDF核心操作、输入输出处理、布局管理、表单处理、PDF/A合规性支持、签名功能、条形码生成以及对亚洲字体的支持。 1. **创建一个空白PDF文档** 要创建一个新的PDF文档,首先...