如何利用iText在java程序中生成PDF文件

使用iText输出PDF文件。

如今PDF格式文档的使用已经越来越普遍,它在文档压缩、安全等方面都表现的非常优秀,有关它的好处我就不在这里多说了。那么如何使用Java语言开发应用来输出PDF格式的文档呢?在这里给大家介绍iText,它是一个开发源代码的项目,你可以使用iText方便的实现PDF的输出。这篇文章我将向大家介绍如何使用iText来生成PDF文档。

HelloWorld

作为一个程序开发人员,对于HelloWorld程序并不陌生,几乎每一种语言或应用开始总是会举一个HelloWorld的例子来向大家介绍。在开始介绍iText时,我们不妨也从HelloWorld开始 

现在运行上面的代码(记住在这之前把itext.jar放到你的ClassPath之中),如果一切正常的话你会在”c:/”看到一个名为hello.pdf的文件。打开这个文件,看到了什么?是的文档里有一行字符“HelloWorld”,如下图。

怎么样是不是很简单?当然我们在实际应用时不可能只是简单的输出一个字符串就完事了,还要作很多的工作,输出更复杂的PDF,下面就让我们开始进一步了解iText的其他功能。

更复杂的设置

  分析一下Document的构造方法,我们发现除了我们上一个例子中的无参数构造以外还有两个:

/*

 * Created on 2004-1-3,创建第一个HelloWorld程序

 */

package test1;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import com.lowagie.text.*;

import com.lowagie.text.pdf.*;

public class HelloWorld {

    publicstatic void main(String[] args) {

       //创建一个文档对象

       Document doc=new Document();

       try {

       //定义输出位置并把文档对象装入输出对象中

   PdfWriter.getInstance(doc, newFileOutputStream("c:/hello.pdf"));

           //打开文档对象

           doc.open();

        // 加入文字“Hello World”

           doc.add(new Paragraph("HelloWorld"));

        //  关闭文档对象,释放资源

           doc.close();           

      } catch (FileNotFoundException e) {

          e.printStackTrace();

      } catch (DocumentException e) {

          e.printStackTrace();

      }

    }

}

public Document();

public Document(Rectangle pageSize);

public Document(Rectangle pageSize,

   int marginLeft,

   int marginRight,

   int marginTop,

   int marginBottom);

 

第一个设置文档的页面大小,第二个除了设置文档的页面大小还设置页面边距。下面我分别给出例子。

Rectangle pSize=new Rectangle(144,90);

  //文档的背景色

       pSize.setBackgroundColor(Color.blue);       

       //创建一个文档对象,并设置他的初始化大小

       Document doc=new Document(pSize);

 

 Rectangle pSize=new Rectangle(144,90);

       //文档的背景色

       pSize.setBackgroundColor(Color.blue);          

  

       //创建一个文档对象,设置初始化大小和页边距

       Document doc=new Document(pSize,5,5,5,5);

将第一个例子中的代码按上面的方法修改然后运行,你可以看到输出的PDF文档将是这个样子,文档变得很小而且背景是蓝色:


在上面的例子中我们通过Rectangle设置了文档的大小,其实iText已经为我们定义好了许多常用的页面,比如:A0-A10,LEGAL,LETTER等等,这些都放在com.lowagie.text.PageSize这个类中,你可以通过调用PageSize中的静态方法直接引用页面信息。比如:

PageSize.A4;

设置字体

  使用iText可以设置文字的字体,对于我们中国的程序员来说如何显示中文是最紧要的问题。幸好iText中有一个专门的包用来设置亚洲国家的字体你可以从http://itext.sourceforge.net/downloads/iTextAsian.jar下载这个包。然后把它直接放到你的ClassPath中就可以了。如何设置字体呢?

 

BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);

在上面的代码中设置了中文字体的显示,你只要使用下面的代码就可以包中文加到PDF中了

String title = "我爱喝咖啡";

Paragraph t = new Paragraph(title, FontChinese);

doc.add(t);

如果你觉得这样设置很麻烦的话,呵呵,那你要自己扩展它的源代码了,设置字体全部在那个BaseFont里边。

编辑表格

iText中的表格很像HTML中表格的使用不过它有一个cell代表一个格子,基本上这里的Table和Swing中的Table对象是一致的,比如上面代码中对于表格的设置:

//定义一个表格

          Table table = new Table(2);

           //设置表格边框

          table.setBorderWidth(1);

           Cell cell = new Cell("Matrix III");

          cell.setHeader(true);

           //分列

          cell.setColspan(2);

           cell.setBackgroundColor(Color.blue);

          table.addCell(cell);


放置图片

现在你一定知道如何把一个图片加到文档中了,没错只要声明一个Image对象就可以了,这里的Image和AWT中的Image使用方法是一样的。

//定义一个图片

          Image jpeg = Image.getInstance("C:/matrix.jpg");

           //图片居中

       jpeg.setAlignment(Image.ALIGN_CENTER);

结束

有关iText的使用我就大致介绍这些,更深入的东西只有大家参考源代码自己体会了。

如何利用iText在JSP中生成PDF报表(转载)
1.      背景
2. 
    介绍iText
3. 
    如何利用iText在java程序中生成PDF报表
4. 
    如何利用iText在JSP中生成PDF报表
1) 
    直接在服务器上生成PDF文件
2) 
    通过jsp生成PDF文件流输出到客户端
3) 
    通过Servlet生成PDF文件流输出到客户端
5. 
    总结
 
1.背景
      前不久做了一个通过JSP生成PDF报表的小项目,算得上开了一次眼界。企业的一些信息通过网络形成Html报表,虽然IE可以直接打印显示在其中的内容,但是从界面上来看,如果直接将Html的显示结果打印出来,显得不太美观。如果将它转成PDF文件再打印,则打印效果会好很多。
2.iText简介
      iText是一个开放源码的Java类库,可以用来方便地生成PDF文件。大家通过访问http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948下载最新版本的类库,下载完成之后会得到一个.jar包,把这个包加入JDK的classpath即可使用。如果生成的PDF文件中需要出现中文、日文、韩文字符,则还需要通过访问http://itext.sourceforge.net/downloads/iTextAsian.jar下载iTextAsian.jar包。
关于iText类库的使用,http://www.lowagie.com/iText/tutorial/index.html有比较详细的教程。该教程从入门开始,比较系统地介绍了在PDF文件中放入文字、图片、表格等的方法和技巧。读完这片教程,大致就可以做一些从简单到复杂的PDF文件了。不过,试图通过教程解决在生成PDF文件过程中遇到的所有困难无疑是一种奢望。所以,阅读iText的api文档显得非常重要。读者在下载类库的同时,也可以下载类库的文档。
3.如何利用iText在java程序中生成PDF报表
      以下是上述教程中一个最简单的例子,这个例子刻画了通过iText生成PDF文件的一般
程序框架。读者只需要在document.open();和document.close();两条语句中间加入自己希望放在PDF文件中的内容即可。该例子只在PDF文件中加了“HelloWorld“一行文字。
              Document document = new Document();
 
            try { 
 
                    PdfWriter.getInstance(document, newFileOutputStream                  ("Chap0101.pdf"));
 
                    document.open();
 
                    document.add(new Paragraph("Hello World"));
 
            }
 
            catch(DocumentException de) {
 
                    java/lang/System.java.html"target="_blank">System.err.println(de.getMessage());
 
            }
 
            catch(IOException ioe) {
 
                    java/lang/System.java.html"target="_blank">System.err.println(ioe.getMessage());
 
            }
 
            document.close();
      由以上的例子可见,程序的框架十分清楚明了。然而在PDF中指定文字、图画、表格的位置是一件非常麻烦的事情。除了不断地在程序中修改位置、然后运行程序、生成PDF文件、观察元素在PDF中的位置是否合理这样的过程以外,似乎还没有其它更好的方法。
4.如何通过JSP生成PDF报表
      这一部分是在iText的教程中所没有的,网上的相关资料也比较少。我曾在CSDN上看过有人开帖询问实现细节,有人回复了实现的原理:先在服务器上生成PDF文件,然后用户通过点击指向PDF文件的超链接选择下载或打开。这是一个思路,或者说是思路之一。本文实现了这个思路,又给出另外一个思路并通过两种途径实现之。
1)直接在服务器上生成PDF文件。
<%@ page import="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%>
<%
 
            java/lang/String.java.html" target="_blank">String filename ="PDF"+(new Random()).nextInt()+".pdf" ;
 
            Document document = new Document(PageSize.A4);
 
            ServletOutputStream out1 = response.getOutputStream();
 
try{
 
                    PdfWriter writer = PdfWriter.getInstance(document, newFileOutputStream(filename) );
 
                    document.open();
 
                    document.add(new Paragraph("Hello World"));
 
                    document.close();
 
    }
 
                    catch(java/lang/Exception.java.html" target="_blank">Exceptione){}
%>
    上面的程序在服务器上生成了一个静态的PDF文件。显然,每次运行所得的PDF文件的名称应该是独一无二不能有重的。本程序通过随机函数来命名生成的PDF文件。本程序的缺点就是,每次运行都会在服务器上产生一个PDF文件,如果不及时删除,数量会越来越大,这显然是站点维护者所不愿意看到的。
2)将PDF文件通过流的形式输送到客户端的缓存。这样做的好处是不会在服务器上留下任何“遗迹”。
i)直接通过JSP页面生成
<%@
 
          pageimport="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
response.setContentType( "application/pdf" );
Document document = new Document();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PdfWriter writer=PdfWriter.getInstance( document, buffer );
document.open();
document.add(new Paragraph("Hello World"));
document.close();
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] ); }
%>
ii)通过Servlet生成
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
public void doGet(javax/servlet/http/HttpServletRequest.java.html"target="_blank">HttpServletRequest request,
 
                                                          javax/servlet/http/HttpServletResponse.java.html"target="_blank">HttpServletResponse response)
 
throws java/io/IOException.java.html"target="_blank">IOException,javax/servlet/ServletException.java.html"target="_blank">ServletException
{
 
Document document = new Document(PageSize.A4,36,36,36,36);
 
java/io/ByteArrayOutputStream.java.html"target="_blank">ByteArrayOutputStream ba = newjava/io/ByteArrayOutputStream.java.html"target="_blank">ByteArrayOutputStream();
 
try
 
{
 
      PdfWriter writer = PdfWriter.getInstance(document, ba);
 
      document.open();
 
      document.add(new Paragraph("Hello World"));
 
}
 
catch(DocumentException de)
 
{
 
    de.printStackTrace();
 
    java/lang/System.java.html"target="_blank">System.err.println("A Document error:"+de.getMessage());
 
  }
 
document.close();
 
response.setContentType("application/pdf");
 
response.setContentLength(ba.size());
 
javax/servlet/ServletOutputStream.java.html"target="_blank">ServletOutputStream out =response.getOutputStream();
 
ba.writeTo(out);
 
out.flush();
}
A Good Artical:
  http://dev.csdn.net/author/lyj_china/3d58e4ea25454e358def5e331dbbf970.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值