2

我正在尝试使用JODConverter从上传的“.docx”文件生成 PDF 文档。对生成 PDF 的方法的调用是这样的:

File inputFile = new File("document.doc");
File outputFile = new File("document.pdf");

// connect to an OpenOffice.org instance running on port 8100
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();

// convert
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);

// close the connection
connection.disconnect();

我正在使用 apache commons FileUpload来处理 docx 文件的上传,我可以从中获取 InputStream 对象。我知道这Java.io.File只是对系统中文件的抽象引用。

我想避免磁盘写入(将 InputStream 保存到磁盘)和磁盘读取(读取 JODConverter 中保存的文件)。

有什么方法可以获取引用输入流的 File 对象吗?任何其他避免磁盘 IO 的方法也可以!

编辑:我不在乎这是否会最终使用大量系统内存。该应用程序将托管在一个只有很少到零数量的并行用户的 LAN 上。

4

3 回答 3

2

没有办法做到这一点并使代码可靠。一方面,该.convert()方法只需要两个Files 作为参数。

因此,这意味着您必须扩展File,这在理论上是可能的,但非常脆弱,因为您需要深入研究库代码,它可以随时更改并使您的扩展类不起作用。

(当然,如果您使用 RAM 支持的文件系统并从该文件系统读取/写入,则有一种方法可以避免磁盘写入

于 2013-01-05T05:53:02.290 回答
2

基于文件的转换比基于流的转换更快(由StreamOpenOfficeDocumentConverter提供),但它们需要 OpenOffice.org 服务在本地运行并且对文件具有正确的权限。

尝试使用文档以避免磁盘写入:

convert(java.io.InputStream inputStream, DocumentFormat inputFormat, java.io.OutputStream outputStream, DocumentFormat outputFormat) 
于 2013-01-05T06:31:38.133 回答
1

无论如何,commons fileupload 都有可能将上传内容写入文件系统。

检查您的 FileItem 是否是 DiskFileItem 的实例。如果是这种情况,DiskFileItem 的写入实现将尝试将文件移动到您传递的文件对象。由于写入已经发生,因此您不会导致任何额外的磁盘 io。

于 2013-01-05T06:53:23.630 回答