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

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

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

三、介绍: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目录包括几个需要的库:

(a)XML的API:xml-apis.jar

(b)Apache的XML的解析器:xercesImpl-2.2.1.jar

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

(d) Apache的SVG的库文件,可以使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文件,具体会遇到几种情况:(1)XLS-FOàPDF;(2)XMLàXSL-FOàPDF;(3)JAVAàXMLàXSL-FOàPDF

(1)XLS-FOàPDF:

XSL是W3C的标准XML文档,它包括两种:XSLT和XSLFO,而XSLFO即eXtensible 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

使用Apache XML项目FOP生成PDF文件(上)相关推荐

  1. php html小项目,使用PHP把HTML生成PDF文件的几个开源项目介绍

    这篇文章主要介绍了使用PHP把HTML生成PDF文件的几个开源项目介绍,本文罗列了FPDF.DomPDF.TCPDF等项目的特点,需要的朋友可以参考下 利用PHP编码生成PDF文件是一个非常耗时的工作 ...

  2. 如何动态生成pdf文件?

    pdfService系统 一. 背景 在许多开发需求中都有动态生成pdf文件的需求,例如根据已有的json字符串渲染到一个表格中,然后生成对应的PDF文档,以往的解决方法是调用许多个接口生产pdf文件 ...

  3. [itext]Java生成PDF文件

    一.前言 最近在做也导出试卷的功能,刚开始是导出为doc,可是导出来格式都有变化,最后说直接将word转为pdf,可是各种不稳定,各种报错.最后想到直接将文件写入pdf(参考:http://www.c ...

  4. freemarker+itext生成PDF文件

    介绍 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是 ...

  5. Java生成PDF文件,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...

  6. Java生成PDF文件_自用

    Java生成PDF文件 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库.废话不多说,进入正题. 二.iText简介 ...

  7. 根据word模板生成pdf文件

    1.首先建一个word,插入一个表格,需要填充的值用${parame}代替 (注意:这里的参数要和java实体类里面的参数对应起来,代码放在下面) 2.制作完成后另存为xml格式 3.然后用文本编辑工 ...

  8. java在linux生成pdf文件,从 Java 应用程序动态生成 PDF 文件

    简介: 如果您的应用程序需要动态生成 PDF 文档,那么您需要 iText 库.开源的 iText 库使得 PDF 的创建变得轻松易行.本文介绍了 iText 并提供了一个使用它从 Java 技术应用 ...

  9. Itext生成pdf文件,itext+Freemarker生成pdf,(中文空白解决)

    来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...

最新文章

  1. Lync Server 2013 部署前端池支持NLB吗?
  2. Win XP2实用的修复工具
  3. What day is that day?(快速幂,打表找周期,或者求通项公式)
  4. response.end后抛了异常_(七)异常处理
  5. 2021住房消费品质服务报告
  6. Docker的常用操作
  7. 荷兰国旗问题(三元素数组排序问题)
  8. Anders Hejlsberg语录
  9. Query DSL(2)----Full text queries
  10. nest.js 使用express需要提供多个静态目录的操作
  11. Express框架学习笔记-静态资源的处理
  12. 超级简易的加法计算器
  13. 2021服务器cpu性能天梯图,显卡天梯图2021年3月最新版 显卡性能排行天梯图2021
  14. 电脑老是显示断开资产管理服务器,史上最强开机维护通道2016年0825重大功能更新(网络版、电脑资产管理、分层桌面秀)...
  15. OutMan——C语言中字符串处理函数、内存管理和内存分区
  16. 计算机碎片整理的作用,磁盘碎片整理有什么用,详细教您磁盘碎片整理有什么作用...
  17. 刘冲 擦干你的泪水 试听,刘冲 擦干你的泪水歌词
  18. 'wx' is not defined no-undef
  19. linux上cgconfig服务,linux系统调优-Cgroups
  20. Linux一句话将文件夹的用户用户组设置为wps:wps

热门文章

  1. 如何一步步成为一名架构师?满满干货指导
  2. 【国产MCU学步随笔------兆易创新GD32f103CBT6,及vscode编辑环境配置】
  3. ActivityNet数据集简介及下载分享(百度网盘)
  4. jQuery实现文件上传大小限制
  5. ubuntu driver及R9000P安装ubuntu20.04解决NVIDIA驱动、黑屏、光标问题
  6. 2-微信红包(2016腾讯校招)
  7. STL——queue、priority_queue、deque
  8. Eclipse在线集成maven M2eclipse插件
  9. 在以太坊生成随机数的几种方式(含代码)
  10. 网络字体的中文用法(一)