使用Apache XML项目FOP生成PDF文件(上)
使用Apache XML項目FOP生成PDF文件(上)
一、前言:在項目中遇到要把文檔保存成PDF文件,在網(wǎng)上找了很久之方面的資料,終于發(fā)現(xiàn)了Apache的FOP項目有這個功能。
二、適合讀者對象:想學(xué)就學(xué)吧!
三、介紹:FOP全稱為Formatting Objects Processor,譯為格式化對象處理器,簡單點,它就是一種打印格式驅(qū)動,通過這種驅(qū)動,可以很方便的生成相應(yīng)格式化的文件。FOP現(xiàn)在支持的格式化的文件包括PDF, PCL, PS, SVG, XML, Print, AWT, MIF and TXT.最主要也是最常使用的也是我們熟悉的PDF文件。下面就用簡單的幾個例子來說明FOP是如何做到的。
四、內(nèi)容:
1、?? 安裝:從http://xml.apache.org/dist/fop/? 外下載一個文件包fop-0.20.5rc-bin.tar.gz 文件包解壓縮以后生成一個文件夾假設(shè)為F:/fop
目錄結(jié)構(gòu)為
?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;
在系統(tǒng)的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
如果安裝配置沒有問題,就會看到在當(dāng)前目錄下生成一個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的標(biāo)準(zhǔn)XML文檔,它包括兩種:XSLT和XSLFO,而XSLFO即eXtensible Stylesheet Language Formatting Objects,也就是具有格式化對象的擴展樣式語言文件。使用FOP的函數(shù)可以直接把一個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轉(zhuǎn)化為ResultFO2PDF.pdf
?
?
參考資料:http://xml.apache.org/
作者郵箱:Jasea@sina.com
總結(jié)
以上是生活随笔為你收集整理的使用Apache XML项目FOP生成PDF文件(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创新产品 google glass
- 下一篇: InstallShield2015 制作