OpenOffice.org开源办公套件将各类文档转为PDF(4)
完整代码
在这里贴出“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中也可正常使用。
如果您有其他解决方案,也请一起交流一下。