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

原创 2004年09月15日 11:27:00

使用Apache XML项目FOP生成PDF文件(下<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

四、       内容:

2、(2XMLàXSL-FOàPDF

有时我们在程序中会遇到要把一个只具有数据,没有格式的XML文件转化成PDF文件,这时我们就需要一个JAXP兼容的XSLT处理器:如Apachexalan(或者IBMxercesSunJDOM等),请将它的库文件加入CLASSPATH。通过JAXPAPI我们就可以先使用XSLTXML文件转化为XML-FO文件,再把XML-FO文件转化为PDF处理流程如下:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

XLS-FO

PDF

FOP

XML

XSLT

JAXP

 

 

 


(a)     第一步让我们先看一下如何把XML文件转化为XLS-FO文件,处理流程如下:

XLS-FO

XML

XSLT

JAXP

 

 

 

 


//例二:ExampleXML2FO.java

 

//Java

import java.io.File;

import java.io.IOException;

import java.io.OutputStream;

 

//JAXP

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.TransformerException;

import javax.xml.transform.Source;

import javax.xml.transform.Result;

import javax.xml.transform.stream.StreamResult;

import javax.xml.transform.stream.StreamSource;

 

//Avalon

import org.apache.avalon.framework.ExceptionUtil;

 

/**

 * This class demonstrates the conversion of an XML file to an XSL-FO file

 * using JAXP (XSLT).

 */

public class ExampleXML2FO {

 

    public void convertXML2FO(File xml, File xslt, File fo)

                throws IOException, TransformerException {

      

        //Setup output

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

        try {

            //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 StreamResult(out);

 

            //Start XSLT transformation and FOP processing

            transformer.transform(src, res);

        } finally {

            out.close();

        }

    }

 

 

    public static void main(String[] args) {

        try {

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

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

 

            //Setup directories

            File baseDir = new File(".");

 

 

            //Setup input and output files           

            File xmlfile = new File(baseDir, "projectteam.xml");

            File xsltfile = new File(baseDir, "projectteam2FO.xsl");

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

 

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

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

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

            System.out.println();

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

           

            ExampleXML2FO app = new ExampleXML2FO();

            app.convertXML2FO(xmlfile, xsltfile, fofile);

           

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

        } catch (Exception e) {

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

            System.exit(-1);

        }

    }

}

 

              编译运行上面的程序使用XSLT文件projectteam2FO.xslXML文件projectteam.xml转化为XML-FO文件ResultXML2FO.fo

 

(b)    进一步,我们看一下如何把XML文件转化为PDF文件。

处理流程如下:

XLS-FO

PDF

FOP

XML

XSLT

JAXP

 

 

 

 


//例三:ExampleXML2PDF.java

 

//Java

import java.io.File;

import java.io.IOException;

import java.io.OutputStream;

 

//JAXP

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.TransformerException;

import javax.xml.transform.Source;

import javax.xml.transform.Result;

import javax.xml.transform.stream.StreamSource;

import javax.xml.transform.sax.SAXResult;

 

//Avalon

import org.apache.avalon.framework.ExceptionUtil;

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

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

 

//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 XML file to PDF using

 * JAXP (XSLT) and FOP (XSL:FO).

 */

public class ExampleXML2PDF {

 

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

                throws IOException, FOPException, TransformerException {

        //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 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(".");

 

            //Setup input and output files           

            File xmlfile = new File(baseDir, "projectteam.xml");

            File xsltfile = new File(baseDir, "projectteam2FO.xsl");

            File pdffile = new File(baseDir, "ResultXML2PDF.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);

        }

    }

}

 

 

              编译运行上面的程序使用XSLT文件projectteam2FO.xslXML文件projectteam.xml转化为PDF文件ResultXML2PDF.pdf

 

3JAVAàXMLàXSL-FOàPDF

这种情况有兴趣的读者可以参考http://xml.apache.org/ 关于FOP的介绍。

 

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

作者邮箱:jasea@sina.com

使用FOP将xsl-fo转pdf

第三步骤:将生成的fo文件转成pdf。【由于.xsl文件不能识别中文,我在root路径下,给root添加了一个属性,font-family,让其可以识别中文。其余需要修改的属性或者样式,需要你自己修改...
  • shihengli2010
  • shihengli2010
  • 2016年09月09日 09:33
  • 1573

使用Apache FOP将XML导出成PDF

     FOP是由James Tauber发起的一个开源项目,最初的目的是利用xsl-fo将xml文件转换成pdf文件。目前最新的版本是2001年9月29日发布的 0.20.2,它可以将xml文件转...
  • youjianbo_han_87
  • youjianbo_han_87
  • 2008年06月19日 11:27
  • 4884

xml与xsl-fo生成PDF

保存数据窗口到PDF文件,现在有两种技术,一种是利用distiller和ghostscript(详见http://community.csdn.net/Expert/FAQ/FAQ_Index.asp...
  • sinbh2
  • sinbh2
  • 2009年08月05日 15:43
  • 1566

fop生成pdf的中文乱码问题

1.建立font metrics文件,对ttc或ttf有不同的方法。 确定系统字体文件夹下的字体文件(微软雅黑字体的路径为C:\WINDOWS\Fonts\msyh.ttf)。 然后在命令...
  • hulua2010
  • hulua2010
  • 2015年05月17日 18:08
  • 1400

根据xsl模板及xml数据文件生成pdf(文字内容复制不乱码)

使用FOP技术,配合xsl模板及XML数据生成PDF报表和线上打印业务
  • Angelahedl
  • Angelahedl
  • 2017年05月23日 15:33
  • 476

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

使用Apache XML项目FOP生成PDF文件(上)一、前言:在项目中遇到要把文档保存成PDF文件,在网上找了很久之方面的资料,终于发现了Apache的FOP项目有这个功能。二、适合读者对象:想学就...
  • s00n
  • s00n
  • 2004年09月15日 11:25
  • 2321

FOP生成PDF时的中文换行问题

我是可以自动换行的,因为我有wrap-option="wrap" language="zh"这个属性,哈哈哈.
  • sinbh2
  • sinbh2
  • 2009年08月05日 15:41
  • 934

pb9中Fop生成PDF试用手记

  保存数据窗口到PDF文件,现在有两种技术,一种是利用distiller和ghostscript(详见http://community.csdn.net/Expert/FAQ/FAQ_Index.a...
  • wu_07
  • wu_07
  • 2005年12月22日 16:59
  • 4294

FOP使用嵌入字体

FOP使用嵌入字体在使用FOP转换文件的时候会遇到没有中文字体,中文显示成##的问题。...
  • zhu_free
  • zhu_free
  • 2016年01月19日 22:07
  • 1116

Apache FOP使用(续)

下面显示了用于将 XML 文档转换为 PDF 文档的 Java 应用程序。 FOP.java package fop.pdf;import org.apache.fop.apps.Driver;...
  • youjianbo_han_87
  • youjianbo_han_87
  • 2008年06月19日 12:18
  • 3275
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Apache XML项目FOP生成PDF文件(下)
举报原因:
原因补充:

(最多只允许输入30个字)