`
Java_Fan
  • 浏览: 73461 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

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]);

}

%>

分享到:
评论

相关推荐

    PDF iText操作简介

    PDF iText 使用简单介绍,一种生成PDF报表的Java组件--iText

    itext文档组件,生成PDF

    创建PDF文件,可由HTML代码生成PDF文件

    itext-1.3.1.jar+iTextAsian.jar

    iText组件是开源项目,不仅可以生成PDF、RTF文件格式,而且可以将XML、HTML文件格式转化为PDF文件格式。 该压缩包包含主文件包跟一语言包

    iText7 原生方法制作带斜线表格

    iText7 原生方法制作带斜线表格

    使用Java组件itext生成pdf介绍.docx

    iText是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。使用iText与PDF能够使你正确的控制Servlet的输出。

    使用iText生成PDF.doc

    此文档主要讲述了使用Java组件iText来生成PDF,操作PDF

    Itext.jar+itextpdf.jar

    一种生成PDF报表的Java组件--iText

    报表组件iText_API

    详细描述了iText的常用方法和说明,不错的查询api

    java使用itext实现pdf文件下载

    java使用itext实现pdf文件下载小案例,通过系统路径下载,和通过浏览器下载

    itext介绍和适用案例讲解

    本章将介绍一种生成PDF报表的Java组件——iText。通过在服务器端使用JSP或JavaBean生成PDF报表,客户端采用超级链接显示或下载得到生成的报表,这样就很好地...本章的主要内容为iText组件的简介、开发以及典型应用。

    iText使用简单介绍

    iText使用简单介绍. 本文将介绍一种生成PDF报表的Java组件--iText!

    itext jar包

    itext 是用来进行pdf操作的java组件,此压缩包包括了itext一些jar包

    iText-html转pdf

    itext用于进行转化pdf操作的组件,压缩包为java操作的一些所需jar包

    itext7jar包和源码

    在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样就很好的解决了B/S系统的...

    itext.jar包

    在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样就很好的解决了B/S系统的...

    itext in action官方推荐的教程(英文版)

    itext官方推荐的教程(英文版),使用iText组件创建PDF格式文件。

    iText多种jar包

    在企业的信息系统中,报表处理一直占比较重要的作用,iText正是一种可以帮助生成PDF报表的Java组件。

    itext3 开发包

    在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样就很好的解决了B/...

    Itext 文档

    在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText。iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF...

    iText和支持中文的jar包

    生成PDF报表的Java组件,包含处理中文的问题

Global site tag (gtag.js) - Google Analytics