CSDN博客

img s00n

使用Apache XML项目FOP生成PDF文件(上)

发表于2004/9/15 11:25:00  2295人阅读

分类: J2SE+J2EE

使用Apache XML项目FOP生成PDF文件(上)

一、前言:在项目中遇到要把文档保存成PDF文件,在网上找了很久之方面的资料,终于发现了ApacheFOP项目有这个功能。

二、适合读者对象:想学就学吧!

三、介绍:FOP全称为Formatting Objects Processor,译为格式化对象处理器,简单点,它就是一种打印格式驱动,通过这种驱动,可以很方便的生成相应格式化的文件。FOP现在支持的格式化的文件包括PDF, PCL, PS, SVG, XML, Print, AWT, MIF and TXT.最主要也是最常使用的也是我们熟悉的PDF文件。下面就用简单的几个例子来说明FOP是如何做到的。

四、内容:

1、   安装:http://xml.apache.org/dist/fop/  外下载一个文件包fop-0.20.5rc-bin.tar.gz 文件包解压缩以后生成一个文件夹假设为F:/fop

目录结构为

 F:/fop 的目录

 

12/19/2002  04:00p      <DIR>          .

12/19/2002  04:00p      <DIR>          ..

12/11/2002  12:26a              46,124 CHANGES

12/11/2002  12:26a                 679 fop.bat

12/11/2002  12:26a               2,446 fop.sh

12/11/2002  12:26a               2,675 LICENSE

12/11/2002  12:26a               1,248 README

12/11/2002  12:26a                 597 ReleaseNotes.html

12/11/2002  12:26a                 884 STATUS

12/19/2002  04:00p      <DIR>          lib

12/19/2002  04:00p      <DIR>          docs

12/19/2002  04:00p      <DIR>          contrib

12/19/2002  04:00p      <DIR>          conf

12/19/2002  04:00p      <DIR>          build

12/11/2002  12:26a              14,899 bugs.html

 

其中lib目录包括几个需要的库:

aXMLAPIxml-apis.jar

bApacheXML的解析器:xercesImpl-2.2.1.jar

(c) ApacheXSLT的处理器:xalan-2.4.1.jar

(d) ApacheSVG的库文件,可以使PDF生成多彩图片:batik.jar

(e) Avalon  framework库文件:avalon-framework-cvs-20020806.jar

将它们加入CLASSPATH

在系统的PATH变量里加入:F:/fop

一个简单的测试:

先生成一个fo文件:

<?xml version="1.0" encoding="UTF-8"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

  <fo:layout-master-set>

    <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">

      <fo:region-body/>

    </fo:simple-page-master>

  </fo:layout-master-set>

  <fo:page-sequence master-reference="simpleA4">

    <fo:flow flow-name="xsl-region-body">

      <fo:block>Hello World!</fo:block>

    </fo:flow>

  </fo:page-sequence>

</fo:root>

打开DOS窗口:键入

              fop helloworld.fo helloworld.pdf

如果安装配置没有问题,就会看到在当前目录下生成一个helloworld.pdf文件。

2、   下面我们来看一下在JAVA程序中如何使用FOP库资源来生成PDF文件,具体会遇到几种情况:(1XLS-FOàPDF;(2XMLàXSL-FOàPDF;(3JAVAàXMLàXSL-FOàPDF

1XLS-FOàPDF

XSLW3C的标准XML文档,它包括两种:XSLTXSLFO,而XSLFOeXtensible Stylesheet Language Formatting Objects,也就是具有格式化对象的扩展样式语言文件。使用FOP的函数可以直接把一个XMLFO文件生成PDF文件。处理流程如下:

XLS-FO

PDF

FOP

 

 

 


//例一:ExampleFO2PDF.java

 

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

 

//SAX

import org.xml.sax.InputSource;

 

//Avalon

import org.apache.avalon.framework.ExceptionUtil;

import org.apache.avalon.framework.logger.Logger;

import org.apache.avalon.framework.logger.ConsoleLogger;

 

//FOP

import org.apache.fop.apps.Driver;

import org.apache.fop.apps.FOPException;

import org.apache.fop.messaging.MessageHandler;

 

/**

 * This class demonstrates the conversion of an FO file to PDF using FOP.

 */

public class ExampleFO2PDF {

 

    public void convertFO2PDF(File fo, File pdf) throws IOException, FOPException {

       

        //Construct driver

        Driver driver = new Driver();

       

        //Setup logger

        Logger logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO);

        driver.setLogger(logger);

        MessageHandler.setScreenLogger(logger);

 

        //Setup Renderer (output format)       

        driver.setRenderer(Driver.RENDER_PDF);

       

        //Setup output

        OutputStream out = new java.io.FileOutputStream(pdf);

        try {

            driver.setOutputStream(out);

 

            //Setup input

            InputStream in = new java.io.FileInputStream(fo);

            try {

                driver.setInputSource(new InputSource(in));

           

                //Process FO

                driver.run();

            } finally {

                in.close();

            }

        } finally {

            out.close();

        }

    }

 

 

    public static void main(String[] args) {

        try {

            System.out.println("FOP ExampleFO2PDF/n");

            System.out.println("Preparing...");

           

            //Setup directories

            File baseDir = new File(".");

 

            //Setup input and output files           

            File fofile = new File(baseDir, "helloworld.fo");

            File pdffile = new File(baseDir, "ResultFO2PDF.pdf");

 

            System.out.println("Input: XSL-FO (" + fofile + ")");

            System.out.println("Output: PDF (" + pdffile + ")");

            System.out.println();

            System.out.println("Transforming...");

           

            ExampleFO2PDF app = new ExampleFO2PDF();

            app.convertFO2PDF(fofile, pdffile);

           

            System.out.println("Success!");

        } catch (Exception e) {

            System.err.println(ExceptionUtil.printStackTrace(e));

            System.exit(-1);

        }

    }

}

 

              编译运行上面的程序把XMLFO文件helloworld.fo转化为ResultFO2PDF.pdf

 

 

参考资料:http://xml.apache.org/

作者邮箱:Jasea@sina.com

0 0

相关博文

我的热门文章

img
取 消
img