Java与XML(五)xml的转换之pdf (xml+xsl 2 pdf)

pdf转换是很实用的工作。已然存在的的转换工具就有很多,其中包括一些成熟的商业软件。而作为java程序开发,我们将借助一个叫FOP的开源工具。

在开始转换之前,我们不得不认识先一下FOP并对它的使用做简单的了解。

FOP (Formatting Objects Processor) 是第一个基于XSL:FO的打印格式处理器,也是第一个与输出无关的格式处理器。它是一个Java程序,能够从对象树中读入然后生成渲染过的页面输出到指定的流。目前支持的输出格式有PDF,PCL,PS,SVG,XML(以树形结构表示),打印机,AWT,MIFTXT。最主要的输出指的是PDF
James Tauber 
 FOP 的最初作者。他开发了该工具的原始版本,而且很大方地开放了该代码,后来又将它移交给 Apache XML Project。(他还给该工具选了一个极好的名称;除了该名称是字首组合词之外,Webster  fop 的定义是过分讲究外表的人。)现在 James  Bowstreet 的首席 XML 设计师。Apache XML项目以开放与合作的方式开发的,提供商业品质的基于XML标准的解决方案。从标准的实施角度看,它能给标准机构(比如IETFW3C)提供反馈信息。

FOP主页 http://xml.apache.org/fop/

 

FOP使用方式

FOP3种使用方式,分别为命令行,程序嵌入,XT 嵌入。这里将主要介绍如何在程序中嵌入FOP功能。将XML文件转换为PDF实际上分为2步,第1步是利用XSLTXML转换为XSL-FO,第2步是将XSL-FO转换为PDF。这里只讲述如何进行第2步的转换编程。

 

下载fop包后,你需要CLASSPATH中添加下述jar文件:

{FOP安装目录}/build/fop.jar

{FOP安装目录}/lib/batik.jar

{FOP安装目录}/lib/xalan-2.0.0.jar

{FOP安装目录}/lib/xerces-1.2.3.jar

{FOP安装目录}/lib/avalon-framework-4.0.jar

{FOP安装目录}/lib/logkit-1.0b4.jar

{FOP安装目录}/lib/jimi-1.0.jar

我是使用Eclipse,只需要在工程属性->构建路径中加入他们,就可以使用这个伟大的工具了。

 

下面是具体的程序:

 

这是一个xml文件 test.xml


objective here

scope here

responsibilities here

reference here

term here

definition here

summary here

breakdown here

content here.

content2 here.

featureInteractions here

estring here

resourceid here

rqmt here.

 

这是它的xsl文件 test.xsl

 



Cardiac Feature SRS

1. Intruction

1.1 Objective

1.2 Scope

1.3. Responsibilities

1.4. References

1.5. Definitions, Acronyms, and Abbreviations

Term

Definition

2. General Description

2.1. Feature Name

2.1.1. Feature Summary

2.1.2. Feature Breakdown

2.2. Feature Requirements

2.3. Feature Interactions

3. String Resources

English String

Resource ID

Rqmt

 

注意,以上文件不要加: 这句。

 

转换的java代码 ExampleXML2PDF.java

 

package src;

import java.io.File;

import java.io.IOException;

import java.io.OutputStream;

import javax.xml.transform.Result;

import javax.xml.transform.Source;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerException;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.sax.SAXResult;

import javax.xml.transform.stream.StreamSource;

import org.apache.avalon.framework.ExceptionUtil;

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

import org.apache.fop.apps.Driver;

import org.apache.fop.messaging.MessageHandler;

 

public class ExampleXML2PDF{

 

public void convertXML2PDF(File xml, File xslt, File pdf)

throws TransformerException, IOException {

Driver driver = new Driver();

ConsoleLogger logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO);

driver.setLogger((org.apache.avalon.framework.logger.Logger) logger);

MessageHandler.setScreenLogger((org.apache.avalon.framework.logger.Logger) logger);

 

//Setup Renderer (output format)

driver.setRenderer(Driver.RENDER_PDF);

 

//Setup output

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

try {

driver.setOutputStream(out);

 

//Setup XSLT

TransformerFactory factory = TransformerFactory.newInstance();

Transformer transformer = factory.newTransformer(new StreamSource(xslt));

 

//Setup input for XSLT transformation

Source src = new StreamSource(xml);

 

//Resulting SAX events (the generated FO) must be piped through to FOP

Result res = new SAXResult(driver.getContentHandler());

 

//Start XSLT transformation and FOP processing

transformer.transform(src, res);

} finally {

out.close();

}

}

 

public static void main(String[] args) {

try {

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

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

 

//Setup directories

File baseDir = new File(".");

File outDir = new File(baseDir, "out");

outDir.mkdirs();

 

File xmlfile = new File("f://tomcat5//webapps//myxml//xmldata//test.xml");

File xsltfile = new File("f://tomcat5//webapps//myxml//xmldata//test.xsl");

File pdffile = new File("f://tomcat5//webapps//myxml//xmldata//test.pdf");

 

System.out.println("Input: XML (" + xmlfile + ")");

System.out.println("Stylesheet: " + xsltfile);

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

System.out.println();

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

 

ExampleXML2PDF app = new ExampleXML2PDF();

app.convertXML2PDF(xmlfile, xsltfile, pdffile);

 

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

} catch (Exception e) {

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

System.exit(-1);

}

}

}

 

编译执行即可。

你可能感兴趣的:(3,Java)