使用iText输出PDF文件

来源:互联网 发布:淘宝购物少件拒收 编辑:程序博客网 时间:2024/06/10 10:21
  
如今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建第一个Hello World程序
 */
package test1;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
public class HelloWorld {
    public static void main(String[] args) {
        //建一个文档
        Document doc=new Document();
        try {
        //义输出位置并把文档象装入象中
    PdfWriter.getInstance(doc, new FileOutputStream("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代表一个格子,基本上里的TableSwing中的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象就可以了,里的ImageAWT中的Image使用方法是一的。
//一个
           Image jpeg = Image.getInstance("C:/matrix.jpg");
            //片居中
        jpeg.setAlignment(Image.ALIGN_CENTER);
iText的使用我就大致介绍这些,更深入的西只有大家参考源代自己体会了。
如何利用iTextJSP中生成PDF(转载)
1    背景
2
    iText
3
    如何利用iTextjava程序中生成PDF
4
    如何利用iTextJSP中生成PDF
1
    直接在服器上生成PDF文件
2
    jsp生成PDF文件流出到客
3
    Servlet生成PDF文件流出到客
5
    总结
 
1.背景
    前不久做了一个通JSP生成PDF表的小目,算得上了一次眼界。企的一些信息通形成Html表,IE可以直接打印示在其中的内容,但是从界面上来看,如果直接将Html果打印出来,得不太美。如果将它PDF文件再打印,打印效果会好很多。
2iText
    iText是一个放源Java类库,可以用来方便地生成PDF文件。大家通过访问http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948最新版本的类库,下完成之后会得到一个.jar包,把个包加入JDKclasspath即可使用。如果生成的PDF文件中需要出中文、日文、文字符,则还需要通过访问http://itext.sourceforge.net/downloads/iTextAsian.jariTextAsian.jar包。
于iText类库的使用,http://www.lowagie.com/iText/tutorial/index.html有比较详细的教程。教程从入门开始,比地介了在PDF文件中放入文字、片、表格等的方法和技巧。片教程,大致就可以做一些从简单复杂PDF文件了。不试图教程解决在生成PDF文件程中遇到的所有困无疑是一奢望。所以,阅读iTextapi文档得非常重要。者在下载类库的同,也可以下载类库的文档。
3.如何利用iTextjava程序中生成PDF
    以下是上述教程中一个最简单的例子,个例子刻画了通iText生成PDF文件的一般
程序框架。者只需要在document.open();document.close();两条句中加入自己希望放在PDF文件中的内容即可。例子只在PDF文件中加了“Hello World“一行文字。
        Document document = new Document();
        try { 
            PdfWriter.getInstance(document, new FileOutputStream          ("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, new FileOutputStream(filename) );
            document.open();
            document.add(new Paragraph("Hello World"));
            document.close();
    }
            catch(java/lang/Exception.java.html" target="_blank">Exception e){}
%>
   上面的程序在服器上生成了一个静PDF文件。然,次运行所得的PDF文件的名称应该是独一无二不能有重的。本程序通随机函数来命名生成的PDF文件。本程序的缺点就是,次运行都会在服器上生一个PDF文件,如果不及时删除,数量会越来越大,这显然是站点维护者所不愿意看到的。
2
)将PDF文件通流的形式送到客端的存。这样做的好是不会在服器上留下任何
i)直接通JSP面生成
<%@
       page import="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 = new java/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();
}

5
 我在目中采用的是第二方法。本文的源在我的tomcat4上面都是调试的。希望可以大家来方便。

原创粉丝点击