2011-08-01 72 views
3

我正在尋找更新應用程序以使用最新的fop API。 應用程序使用庫的版本0.20,例如Driver類仍在使用中。更新到最新的FOP API

我似乎無法找到任何有關如何更新到最新的fop版本的明智信息。我發現了一些片段,例如應該使用FOPFactory。

所以我想知道是否有人可以給我一個更新到新(EST)fop API的資源推? 或者是不是真的可以更新,我是否需要重寫這部分的應用程序?

PS我找到了fop upgrading頁面(當然),但它似乎沒有指出兩個版本的類/ API之間的相似之處。

+0

我剛纔讀的頁面@ApacheFop「從早期版本升級」,並在我看來,你有一些重寫要做。 – Wivani

+0

@Wivani,我很害怕,但我希望能有一些簡單的方法可用。 – Veger

+1

如果你願意,你可以爲這兩個API編寫一個'Facade'並將其提供給Apache FOP項目;-) – Wivani

回答

2

答案是,這取決於您使用FOP的程度。

當我們從0.2更新版本*向.9那麼1.0版本中,我們不得不修改了不少,但我們產生了大量的各種FO的(我們FO轉化成PostScript),我們需要產生各種PostScripts來查看新版本中的工作和失敗。根據您以前的工作情況,您可能會發現任何可能已經消失的東西很容易替代。

幸運的是,我們已經將對Driver和Fop類的引用合併到了一個自定義實用程序中,因此它沒有那麼糟糕,只是換出了一個使用FopFactory的新實用程序引用。

您的第一步應該是編寫一個抽象Facade作爲@Wivani建議整合您的舊的fop引用調用,確保它在您的代碼中有效,然後通過用一個使用新代碼的實現替換舊的Facade 。

唯一令我不滿的是Fop社區需要相當長的一段時間才能應用bug修補程序並生成新版本。我們在生產中使用了v1和XML Graphics 1.4,沒有任何問題(生成PostScript和TIFF文件的基本FO)。

如果你需要的話,我會在星期一補充這個貼子的幫助代碼。

UPDATE 下面是我們以前使用的FO文件轉換成PostScript:

String foAsString = "your_fo_as_string"; 
File destination = new File("path_to_file""); 

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(destination)); 
Driver driver = new Driver(new InputSource(new StringReader(foAsString)), out); 
driver.setRenderer(Driver.RENDER_PS); 
driver.run(); 

out.close(); 

return destination; 

這裏是我們現在使用抽象。

FopFactory作爲實例級創建爲

this.fopFactory = FopFactory.newInstance(); 

代碼:

import javax.xml.transform.Source; 
import javax.xml.transform.Templates; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMResult; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.sax.SAXResult; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

import org.apache.fop.apps.Fop; 
import org.apache.fop.apps.FopFactory; 
import org.apache.fop.apps.MimeConstants; 

// ... 

String foAsString = "your_fo_as_string"; 
File destination = new File("path_to_file""); 

OutputStream outStream = new BufferedOutputStream(new FileOutputStream(destination)); 
Fop fop = fopFactory.newFop(MimeConstants.MIME_POSTSCRIPT, outStream); 

Transformer transformer = transformerFactory.newTransformer(); 
Source source = new StreamSource(new StringReader(foAsString)); 
Result result = new SAXResult(fop.getDefaultHandler()); 

transformer.transform(source, result); 

outStream.close(); 

return destination; 
+0

感謝您的回答!我會在以後看看它真的!如果你願意發佈一些示例代碼,它會真的幫助,但它取決於你:) – Veger

+0

答案已經更新的代碼。請記住,您仍然需要仔細檢查由您的FO生成的任何錯誤,並確定問題所在。測試很多! – JoshDM