完整代碼
在這里貼出“txt轉pdf”完整的可運行的示例代碼:
import java.lang._; import java.io.File; import ooo.connector.BootstrapSocketConnector; import com.sun.star.lang.XComponent; import com.sun.star.uno.XComponentContext; import com.sun.star.uno.UnoRuntime; import com.sun.star.beans.PropertyValue; import com.sun.star.frame.XComponentLoader; import com.sun.star.frame.XStorable; import com.sun.star.util.XCloseable; object AnyToPdf extends Application { // get the remote office component context def createContext() : XComponentContext = { val oooExeFolder = "C:/Program Files/OpenOffice.org 3/program/" BootstrapSocketConnector.bootstrap(oooExeFolder) } def createComponentLoader(context: XComponentContext) : XComponentLoader = { // get the remote office service manager val mcf = context.getServiceManager() val desktop = mcf.createInstanceWithContext("com.sun.star.frame.Desktop", context) UnoRuntime.queryInterface(classOf[XComponentLoader], desktop) } def loadDocument(loader: XComponentLoader, inputFilePath: String) : Object = { // Preparing properties for loading the document val propertyValue = new PropertyValue() propertyValue.Name = "Hidden" propertyValue.Value = new Boolean(true) // Composing the URL by replacing all backslashs val inputFile = new File(inputFilePath) val inputUrl = "file:///" + inputFile.getAbsolutePath().replace('\\', '/') loader.loadComponentFromURL(inputUrl, "_blank", 0, Array(propertyValue)) } def convertDocument(doc: Object, outputFilePath: String, convertType: String) { // Preparing properties for converting the document // Setting the flag for overwriting val overwriteValue = new PropertyValue() overwriteValue.Name = "Overwrite" overwriteValue.Value = new Boolean(true) // Setting the filter name val filterValue = new PropertyValue() filterValue.Name = "FilterName" filterValue.Value = convertType // Composing the URL by replacing all backslashs val outputFile = new File(outputFilePath) val outputUrl = "file:///" + outputFile.getAbsolutePath().replace('\\', '/') // Getting an object that will offer a simple way to store // a document to a URL. val storable = UnoRuntime.queryInterface(classOf[XStorable], doc) // Storing and converting the document storable.storeToURL(outputUrl, Array(overwriteValue, filterValue)) } def closeDocument(doc: Object) { // Closing the converted document. Use XCloseable.clsoe if the // interface is supported, otherwise use XComponent.dispose val closeable = UnoRuntime.queryInterface(classOf[XCloseable], doc) if (closeable != null) { closeable.close(false) } else { val component = UnoRuntime.queryInterface(classOf[XComponent], doc) component.dispose() } } val inputFilePath = "D:\\convert\\input.txt" val outputFilePath = "D:\\convert\\output.pdf" // Getting the given type to convert to val convertType = "writer_pdf_Export" val context = createContext() println("connected to a running office ...") val loader = createComponentLoader(context) println("loader created ...") val doc = loadDocument(loader, inputFilePath) println("document loaded ...") convertDocument(doc, outputFilePath, convertType) println("document converted ...") closeDocument(doc) println("document closed ...") }
很顯然,這里不是我所厭惡的Java語言。這是一段Scala代碼,就從最基本的代碼使用上看,Scala也已經(jīng)比Java代碼要節(jié)省許多了。
總結
其實解決這個問題還是走了不少彎路的,究其原因可能是從示例代碼出發(fā)去尋找解決方案,而并沒有去系統(tǒng)地閱讀各種資料。在這個過程中,我找到了一些比較重要的文檔:
API/Tutorials/PDF export:對于PDF導出功能各種參數(shù)的詳細解釋。
Text Documents:關于文本文檔相關操作的詳細說明。
DocumentHanding:“文檔操作”示例代碼的解釋,包括文檔打印等等。
當然,最詳細文檔莫過于完整的開發(fā)人員指南了,如果您想要詳細了解這方面的內(nèi)容,這應該也屬于必讀內(nèi)容之一。
有了OpenOffice.org,就相當于我們擁有了一套完整的文檔操作類庫,可以用來實現(xiàn)各種功能。除了轉PDF以外,例如我們還可以將一篇數(shù)百萬字的小說加載為文檔,再每十頁導出一份圖片,方便用戶在線預覽順便防點拷貝。此外,雖然我是在Windows下操作OOo,但是OOo和Java本身都是跨平臺的,因此同樣的代碼也可以運行在Linux平臺上。我目前正在嘗試在Ubuntu Server上部署一份OOo和代碼,如果有什么特別的情況,我也會另行記錄。
事實上有一點我之前一直沒有提到:如果您使用Windows及.NET進行開發(fā),OOo也提供了C++/CLI接口,可以使用C#、F#進行編程,且代碼與本文描述的幾乎如出一轍(只要把queryInterface方法調用改成直接轉換),在.NET 4.0中也可正常使用。
如果您有其他解決方案,也請一起交流一下。
本文鏈接:http://www.95time.cn/tech/program/2010/7702.asp
出處:老趙點滴
責任編輯:bluehearts
上一頁 使用OpenOffice.org將各類文檔轉為PDF [3] 下一頁
◎進入論壇網(wǎng)絡編程版塊參加討論
|