完整代码
在这里贴出“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也已经比Java代码要节省许多了。
总结
其实解决这个问题还是走了不少弯路的,究其原因可能是从示例代码出发去寻找解决方案,而并没有去系统地阅读各种资料。在这个过程中,我找到了一些比较重要的文档:
API/Tutorials/PDF export:对于PDF导出功能各种参数的详细解释。
Text Documents:关于文本文档相关操作的详细说明。
DocumentHanding:“文档操作”示例代码的解释,包括文档打印等等。
当然,最详细文档莫过于完整的开发人员指南了,如果您想要详细了解这方面的内容,这应该也属于必读内容之一。
有了OpenOffice.org,就相当于我们拥有了一套完整的文档操作类库,可以用来实现各种功能。除了转PDF以外,例如我们还可以将一篇数百万字的小说加载为文档,再每十页导出一份图片,方便用户在线预览顺便防点拷贝。此外,虽然我是在Windows下操作OOo,但是OOo和Java本身都是跨平台的,因此同样的代码也可以运行在Linux平台上。我目前正在尝试在Ubuntu Server上部署一份OOo和代码,如果有什么特别的情况,我也会另行记录。
事实上有一点我之前一直没有提到:如果您使用Windows及.NET进行开发,OOo也提供了C++/CLI接口,可以使用C#、F#进行编程,且代码与本文描述的几乎如出一辙(只要把queryInterface方法调用改成直接转换),在.NET 4.0中也可正常使用。
如果您有其他解决方案,也请一起交流一下。
本文链接:http://www.blueidea.com/tech/program/2010/7702.asp
出处:老赵点滴
责任编辑:bluehearts
上一页 使用OpenOffice.org将各类文档转为PDF [3] 下一页
◎进入论坛网络编程版块参加讨论
|