OpenOffice,将文档写入servlet响应

时间:2010-06-22 22:28:16

标签: java openoffice.org uno

目前,我们使用OpenOffice来获取模板文件文档中的书签,并通过Java将其替换为我们的数据库中的内容。实际保存文件的代码行看起来像这样......

  XStorable storable = UnoRuntime.queryInterface(XStorable.class, document);


        // Save as Word 97 Document
        PropertyValue[] properties = new PropertyValue[1];
        PropertyValue property = new PropertyValue();
        property.Name = "FilterName";
        property.Value = FORMAT_WORD_97;
        properties[0] = property;
        storable.storeAsURL(saveFileURL, properties);

我们想直接将文件写入servlet响应输出流,是否有人知道通过OpenOffice的Java中的UNO api直接将文档作为字节数组或输入流获取的方法?

3 个答案:

答案 0 :(得分:2)

这取决于UNO API的实现。我们能够用PDF做到这一点,

    OutputStream os = response.getOutputStream();

    PropertyValue[] properties = new PropertyValue[2];
    PropertyValue property = new PropertyValue();
    property.Name = "FilterName";
    property.Value = FORMAT_WORD_97;
    properties[0] = property;
    PropertyValue streamProp = new PropertyValue();
    streamProp.Name = "OutputStream;
    streamProp.Value = os;
    properties[1] = streamProp;

    storable.storeAsURL("private:stream", properties);

答案 1 :(得分:0)

对于 10 年后遇到此问题的任何人,我必须包装输出流才能使其正常工作

PropertyValue[] properties = new PropertyValue[2];
properties[0] = new PropertyValue();
properties[0].Name = "FilterName";
properties[0].Value = "writer_pdf_Export";
properties[1] = new PropertyValue();
properties[1].Name = "OutputStream";
properties[1].Value = new OutputStreamToXOutputStreamAdapter(outputStream);
storable.storeAsURL("private:stream", properties);

没有这个我一直遇到com.sun.star.lang.DisposedException

答案 2 :(得分:-1)

我建议首先在本地保存文件(从UNO API),然后在删除[temp]文件之前从java代码中流式传输结果。这样做的原因是,您可以将OpenOffice生成文档的问题从交付到客户端中分离出来。例如,如果您的文档无法生成,则可以产生错误,而无需担心流式传输到客户端的部分书写响应。此外,如果您尚未查看工具,则可能需要查看Docmosis,它提供冗余,性能优化和数据合并功能。它可以直接呈现给您提供的流(并且可能会处理部分流式结果问题)。