使用Apache XML项目FOP生成PDF文件(上)
使用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 |
|
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文件(上)相关推荐
- php html小项目,使用PHP把HTML生成PDF文件的几个开源项目介绍
这篇文章主要介绍了使用PHP把HTML生成PDF文件的几个开源项目介绍,本文罗列了FPDF.DomPDF.TCPDF等项目的特点,需要的朋友可以参考下 利用PHP编码生成PDF文件是一个非常耗时的工作 ...
- 如何动态生成pdf文件?
pdfService系统 一. 背景 在许多开发需求中都有动态生成pdf文件的需求,例如根据已有的json字符串渲染到一个表格中,然后生成对应的PDF文档,以往的解决方法是调用许多个接口生产pdf文件 ...
- [itext]Java生成PDF文件
一.前言 最近在做也导出试卷的功能,刚开始是导出为doc,可是导出来格式都有变化,最后说直接将word转为pdf,可是各种不稳定,各种报错.最后想到直接将文件写入pdf(参考:http://www.c ...
- freemarker+itext生成PDF文件
介绍 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是 ...
- Java生成PDF文件,java面试题,java初级笔试题
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...
- Java生成PDF文件_自用
Java生成PDF文件 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库.废话不多说,进入正题. 二.iText简介 ...
- 根据word模板生成pdf文件
1.首先建一个word,插入一个表格,需要填充的值用${parame}代替 (注意:这里的参数要和java实体类里面的参数对应起来,代码放在下面) 2.制作完成后另存为xml格式 3.然后用文本编辑工 ...
- java在linux生成pdf文件,从 Java 应用程序动态生成 PDF 文件
简介: 如果您的应用程序需要动态生成 PDF 文档,那么您需要 iText 库.开源的 iText 库使得 PDF 的创建变得轻松易行.本文介绍了 iText 并提供了一个使用它从 Java 技术应用 ...
- Itext生成pdf文件,itext+Freemarker生成pdf,(中文空白解决)
来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...
最新文章
- Lync Server 2013 部署前端池支持NLB吗?
- Win XP2实用的修复工具
- What day is that day?(快速幂,打表找周期,或者求通项公式)
- response.end后抛了异常_(七)异常处理
- 2021住房消费品质服务报告
- Docker的常用操作
- 荷兰国旗问题(三元素数组排序问题)
- Anders Hejlsberg语录
- Query DSL(2)----Full text queries
- nest.js 使用express需要提供多个静态目录的操作
- Express框架学习笔记-静态资源的处理
- 超级简易的加法计算器
- 2021服务器cpu性能天梯图,显卡天梯图2021年3月最新版 显卡性能排行天梯图2021
- 电脑老是显示断开资产管理服务器,史上最强开机维护通道2016年0825重大功能更新(网络版、电脑资产管理、分层桌面秀)...
- OutMan——C语言中字符串处理函数、内存管理和内存分区
- 计算机碎片整理的作用,磁盘碎片整理有什么用,详细教您磁盘碎片整理有什么作用...
- 刘冲 擦干你的泪水 试听,刘冲 擦干你的泪水歌词
- 'wx' is not defined no-undef
- linux上cgconfig服务,linux系统调优-Cgroups
- Linux一句话将文件夹的用户用户组设置为wps:wps
热门文章
- 如何一步步成为一名架构师?满满干货指导
- 【国产MCU学步随笔------兆易创新GD32f103CBT6,及vscode编辑环境配置】
- ActivityNet数据集简介及下载分享(百度网盘)
- jQuery实现文件上传大小限制
- ubuntu driver及R9000P安装ubuntu20.04解决NVIDIA驱动、黑屏、光标问题
- 2-微信红包(2016腾讯校招)
- STL——queue、priority_queue、deque
- Eclipse在线集成maven M2eclipse插件
- 在以太坊生成随机数的几种方式(含代码)
- 网络字体的中文用法(一)