作者: Vikram Goyal 10/16/2002
出處: http://www.onjava.com/pub/a/onjava/2002/10/16/fop.Html
格式對象處理器 (FOP) 是一個源碼開放的Java API,可以把xml數(shù)據(jù)轉(zhuǎn)換成PDF格式,同樣的,也可以轉(zhuǎn)成其他相關(guān)的格式,象TXT, SVG, AWT, MIF, 和 PS. 該軟件是在Apache XML項目下開發(fā)的,可以免費使用。
這篇文章展示了如何開始使用FOP。FOP的主要優(yōu)點是它轉(zhuǎn)換XML數(shù)據(jù)到PDF格式報告的性能,使用的了格式化樹結(jié)構(gòu)。我們提供的絕大多數(shù)的例子將會集中展示這個特別的轉(zhuǎn)換,但也會把XML數(shù)據(jù)轉(zhuǎn)成Java AWT格式.
這篇文章的面向于精通XML和XSLT的開發(fā)者的。要獲取更多的關(guān)于XML的信息,可以到XML.com。
安裝
FOP 可以從FOP 發(fā)布目錄上面下載。下載文件是一個gzip 文件包,它包括兩個發(fā)行包。其中fop-0.20.4-src 發(fā)行包包含源代碼,使用它可以自己用Ant 進(jìn)行編譯。fop-0.20.4-bin 發(fā)行包包含了運行部分, 里面沒有源代碼和Java文檔。
把源碼包解壓到你選擇的一個目錄下。你會得到程序解壓生成的fop-0.20.4主目錄 和一系列子目錄:build, conf, docs, hyph, lib 和 src.
? build 包含最新的FOP運行文件fop.jar, 這個文件應(yīng)該被放在應(yīng)用程序的CLASSPATH 中。
? conf 包含了確定的配置文件,這個我們將在后面進(jìn)行討論。
? docs 包含了各種各樣的例子,文檔,和一些圖形圖片。
? hyph 包含了不同語言的連字符信息。
? lib 包含了所有的外部.jar 文件,這些文件對于FOP自己的運行是必需的。他們包括Avalon, Batik, Xalan, 和 Xerces。 由于這篇文章
? 是著重介紹FOP的, 我們不會深入討論這些API。只需要知道FOP使用這些API就夠了。在配置的時候我們需要把這些庫放到應(yīng)用程序的CLASSPATH 中。
? src 包含了所有源代碼。
FOP 簡介
圖形1. FOP 架構(gòu).
FOP 是一個被3W組織在XSL 說明書 中指定的用于理解格式化對象的工具。說明書的第一部分說明了XSLT的轉(zhuǎn)化處理。我們感興趣的是第二部分, 里面說明了我們所說的格式化對象(FO)的處理。 說明書中的這一部分定義了獨立輸出的格式化對象, 它由一系列的文檔風(fēng)格以及布局的詞表組成。舉個例子來說, 其中的一個格式化對象是fo:simple-page-master, 它用來說明一個頁面模板,它包含一些相關(guān)的屬性 (邊界,頁頭, 等等)。就這樣,象FOP這樣的工具可以讀吃這些信息并且把這些信息轉(zhuǎn)化成想要的格式輸出(PDF/TXT)。很重要的一點是相同的風(fēng)格信息可以產(chǎn)生不同的輸出。
一篇FO 文檔簡單的說就是一篇XML文檔。 它的命名空間由W3C 站點 定義。它 可以包含任何在這個命名空間中元素。你能夠手工的創(chuàng)建這樣的文檔并且為每一個元素指定確切的值,每一個元素應(yīng)該被輸出。然而,更為通用的方法是寫一個XSLT的樣式表,來管理你的XML數(shù)據(jù)文件, 根據(jù)你的樣式標(biāo)的規(guī)則來進(jìn)行轉(zhuǎn)換, 從而產(chǎn)生最終的FO文檔。動態(tài)生成的數(shù)據(jù)能夠跟一個存在的樣式表綁定來產(chǎn)生FO 文檔。
雖然fop的主要意圖是處理fo文檔, 但是他也能夠通過一個樣式表完成已存在數(shù)據(jù)文件(XML)的轉(zhuǎn)換。我們假定在一XSL文件的表中有你的以XML個是存放的商務(wù)數(shù)據(jù)以及樣式表信息。如果你把這兩者提供給FOP, FOP 將會把這些信息轉(zhuǎn)換成一篇臨時的FO文檔并且最終生成你期望的輸出。
一個簡單的例子
例子文件
下載這篇文章中的例子文件 。這個 .zip 文件包含了下列文件:
krusty.fo, krusty.pdf, krusty.xml, and krusty.xsl.
了解了原理以后,讓我們實際運行一下FOP。 打開一個命令窗口并且定位到你的FOP安裝目錄下。FOP 的根目錄下面包含了兩個運行體:一部分是可運行在Unix系統(tǒng)上的shell腳本,另一部分是用于windows環(huán)境的一系列文件,通過這些文件FOP能夠通過命令行來運行。根據(jù)你的系統(tǒng)情況來運行相關(guān)的腳本。FOP將會報沒有輸入?yún)?shù)的提示,從而輸出一系列的運行例子。好的—這意味著你現(xiàn)在可以開始使用FOP了。
讓我們從創(chuàng)建一個簡單的FO 文件開始。如果你想要看到最終結(jié)果, 可以點擊這里krusty.fo.
就像我前面所講到過的,一個FO文件是一個簡單的類似表的Xml文件。因此開開你的文本編輯器并輸入第一行:
所有的FO文件必須有這個外層元素作為根
page-width="21cm"
margin-top="1cm"
margin-bottom="2cm"
margin-left="2.5cm"
margin-right="2.5cm">
就像你看到的, 主要的布局設(shè)置包括不同的簡單的可以放在里面的頁面布局定義。在我們的例子中,已經(jīng)定義了一個單獨的簡單頁面管理者,在里面,我們可以看到簡單頁面的屬性,我們給它起的名字simple (這個名字以后我們會用到), 這個頁面的高度是29.7 厘米, 寬度是21 厘米, 頂端空白為1 厘米, 等等。我們可以定義許多我們想要的簡單頁面并且賦給他們不同的名字,這些名字我們會在后面飲用這些頁面的時候用到。
現(xiàn)在我們已經(jīng)定義了頁面隊列術(shù)語和大小與它們將來看上去模樣的對應(yīng),進(jìn)而我們需要定義實際的目錄持有者。下面是我們使用
注意在定義頁面順序的時候,我們引用到了簡單的頁面管理者, 之所以稱為簡單, 是因為我們在前面已經(jīng)定義了。這意味著我們的內(nèi)容將被簡單頁面管理者限定在一個頁面之內(nèi)。 實際的內(nèi)容被放在
line-height="24pt"
space-after.optimum="15pt"
background-color="blue"
color="white"
text-align="center"
padding-top="3pt">
Krusty the Clown
line-height="15pt"
space-after.optimum="3pt"
text-align="justify">
這個備忘錄解釋了為什末Krusty the Clown 是我們做好的客戶。我們需要從現(xiàn)在開始關(guān)心他的需求,從而確保他的寵物猴子有足夠的香蕉可以吃。
最后, 關(guān)閉所有打開的標(biāo)記并且保存為文件krusty.fo,這個文件存放在FOP根目錄下。
現(xiàn)在是看FOP運作的時候了。在FOP的根目錄下,敲入如下的命令:
fop krusty.fo krusty.pdf
fop 將會運行并且在相同的目錄下將我們的krusty.fo 文件轉(zhuǎn)化為一個krusty.pdf 文檔。通過雙擊打開文件,檢查最終的輸出是否真的符合我們的要求。 對FO 文件進(jìn)行一點改變,然后看看在輸出中有什末影響。 從改變內(nèi)容中的文字開始,繼而試著改變風(fēng)格,邊界, 顏色, 字體, 等等, 然后看所有的變化是怎樣的。
XSL + XML
通過運行簡單的例子, 你將會注意到手工的產(chǎn)生一個FO文檔是很難的。直接的修改和改變FO文件實在是令人討厭的,我們正在失去內(nèi)容獨立性的優(yōu)越性。因此通常地, 你將會換用一個XSLT樣式表來把你的XML數(shù)據(jù)轉(zhuǎn)化成為一篇XSL-FO 文件。你不需要在外部或者為這個轉(zhuǎn)換明確地做什末事情來轉(zhuǎn)換到FOP。你可以為FOP指定樣式表和XML文件,這樣FOP就可以自己進(jìn)行轉(zhuǎn)化了。讓我們看看下面的例子,它會告訴我們這些是怎樣實現(xiàn)的。
我們將從前面的例子中把數(shù)據(jù)提取出來放到一個XML 文件 中。因此我們的XML 數(shù)據(jù)文件看書去就會使這個樣子的:
Krusty the Clown
這個備忘錄解釋了為什末Krusty the Clown 是我們做好的客戶。我們需要從現(xiàn)在開始關(guān)心他的需求,從而確保他的寵物猴子有足夠的香蕉可以吃。
把這個文件保存在FOP的根目錄下。
我們現(xiàn)在需要生成一個樣式表,然后用它來轉(zhuǎn)化這個數(shù)據(jù)文件為FO文件。要想察看最后的結(jié)果,可以下載最后的XSL 文件 (這個文件也在FOP.zip 例子文件中)。
xmlns:fo="http://www.w3.org/1999/XSL/Format">
像期望的那樣, XSL文檔的開頭是XML聲明, 緊跟著是命名空間的聲明。
如果你以前曾經(jīng)用過XSLT, 你會注意到現(xiàn)在我們試圖做的是對我們的XML中的標(biāo)記進(jìn)行匹配,替換并使用它們來轉(zhuǎn)化為另一個XML文件,也就是我們的FO文件。因此上面的文本行尋找和匹配根 標(biāo)記并使用它后面的內(nèi)容來替換它。這個內(nèi)容, 下面是它的概要, 基本來說,它是我們簡單布局管理者的定義,正如我們上面對FO文件所描述的那樣。
page-width="21cm"
margin-top="1cm"
margin-bottom="2cm"
margin-left="2.5cm"
margin-right="2.5cm">
用實際的格式化信息替換數(shù)據(jù)標(biāo)記從而形成我們的XSL 文件。
line-height="24pt"
space-after.optimum="15pt"
background-color="blue"
color="white"
text-align="center"
padding-top="3pt">
line-height="15pt"
space-after.optimum="3pt"
text-align="justify">
正如你所看到的, 在FO標(biāo)記術(shù)語中的模板匹配項被相應(yīng)的格式化信息替換了
。樣式表包括樣式表的結(jié)束標(biāo)記。把這個文件保存為krusty.xsl文件,并存放在 FOP根目錄下。
下面通過運行來看看我們努力的結(jié)果, 在FOP的根目錄下輸入下面的命令行:
fop -xml krusty.xml -xsl krusty.xsl -pdf krusty.pdf
因而, 你正在指定輸入的XSL 和 XML 文件以及輸出的PDF文件。當(dāng)你打開這個PDF文件的時候, 你將會看到結(jié)果跟你運行FOP處理FO文件是一樣的。
第二種途徑的優(yōu)點應(yīng)該很清楚的了。我們的輸入XMl數(shù)據(jù)在不同的環(huán)境中是不同的。今天我們正為Krusty the Clown準(zhǔn)備報告, 明天它可能是Bart the Kid。我們的數(shù)據(jù)文件將會改變,但是樣式表不會改變。
轉(zhuǎn)化為AWT
我不需要做多少事情就會輸出不同的格式。FOP 在內(nèi)部會自動處理。我們要輸出Java 的 AWT, 我們所有要做的就是:
fop -xml krusty.xml -xsl krusty.xsl -awt
That is, 指定輸出為AWT 而不是PDF。 FOP 會創(chuàng)建一個AWT 閱讀器給你, as 如圖 2所示。
圖形2. AWT 閱讀器。
嵌入的FOP
不管是作為WEB程序一部分還是桌面程序的一部分,在你自己的程序中使用嵌入FOP的步驟是簡單的。
1. org.apache.fop.apps.Driver的示例。
Driver driver = new Driver();
2. 設(shè)定你想要的轉(zhuǎn)換類型。
driver.setRenderer(Driver.RENDER_PDF);
3. 設(shè)置一個跟蹤對象。
driver.setLogger(log);
4. 設(shè)定輸入資源。
driver.setInputSource(new FileInputSource(file));
5. 設(shè)定一個要轉(zhuǎn)換的輸出流。
driver.setOutputStream(new FileOutputStream(out));
6. 最后,運行并輸出結(jié)果。
driver.run();
如果你指定了一個FO文件作為輸入,上面的處理就是有效的。如果你在前面指定的是XSL 和 XML 文件作為輸入, 你需要按照下面的做法來修改第四步和第六步:
4. 聲明一個設(shè)定XSLTInputHandler類型作為一個輸入處理句柄。
InputHandler inputHandler = new XSLTInputHandler(xmlfile, xslfile);
6. 獲得處理者和轉(zhuǎn)換者的解析器。
driver.render(inputHandler.getParser(), inputHandler.getInputSource());
上面我們對嵌入應(yīng)用程序中的FOP,作了一個系統(tǒng)的闡述。在docs/examples/embedding 目錄下還有一個完整的例子來說明嵌入到servlet中的FOP的應(yīng)用的。
資源
? FOP 站點 是一個獲取所有FOP文檔的好地方; 然而,這些信息并不總是最新的。
? XSL 說明書 被W3C維護,是個獲取所有格式化信息的好地方。
? O'Reilly'的 XML.com 可以很好的獲取到通常的XML 和 XSL 信息。
? 最后, 在XML圣經(jīng)摘錄上面有很有用的FOP介紹。
其他的XML 資源
? 什末是 XSL-FO?
? 從XML打印: 一個對XSL-FO的介紹
? XSL 格式化對象的使用
? XSL 格式化對象,第二部分
? O'Reilly的 XSL-FO - Making XML 被打印技術(shù)看好
? 一個FOP的Web Service 實現(xiàn)
結(jié)論
FOP是一個開發(fā)源碼的處理格式化對象的工具。它轉(zhuǎn)換這些對象到我們需要的不同的媒體上。你可以單獨運行FOP,也可以在你的應(yīng)用程序中調(diào)用它。
Vikram Goyal 是一個地道的Java愛好者,有6年以上的相關(guān)經(jīng)驗。
(出處:http://m.survivalescaperooms.com)
新聞熱點
疑難解答