5

如何将 org.docx4j.openpackaging.packages.WordprocessingMLPackage 实例保存到 ByteArrayInputStream 中,然后可以从服务器下载。

谢谢。

4

3 回答 3

4

我遇到了同样的问题,并找到了一种更简单的方法,无需更改 save() 函数。来源here,我做了一些编辑:

对于 WordMLPackage p 和 HttpServletResponse 响应:

response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
String fileName = "MyDocument.docx";
response.setHeader("Content-disposition", "attachment;filename=${fileName}");
SaveToZipFile saver = new SaveToZipFile(p);
saver.save( response.getOutputStream() );

进口声明:

import org.docx4j.openpackaging.io.*
于 2013-11-05T23:33:11.913 回答
3

你不能保存到ByteArrayInputStream...永远。AByteArrayInputStream是一个InputStream,你不/不能写一个InputStream

但是,您可以向 a 写入一些内容ByteArrayOutputStream,获取字节数组,并ByteArrayInputStream为该数组创建一个包装器。

(我假设有一种方法可以将其中一个实例保存到 OutputStream 或 Writer ...)


好吧,我的假设是错误WordprocessingMLPackage的,唯一的save方法是保存到File. (我猜有人没有得到关于如何设计灵活 I/O api 的备忘录……)

但是源代码(这里)提供了一些关于如何自己实现它的线索。方法如下:

public void save(java.io.File docxFile) throws Docx4JException {

    if (docxFile.getName().endsWith(".xml")) {

        // Create a org.docx4j.wml.Package object
        FlatOpcXmlCreator worker = new FlatOpcXmlCreator(this);
        org.docx4j.xmlPackage.Package pkg = worker.get();

        // Now marshall it
        JAXBContext jc = Context.jcXmlPackage;
        try {
            Marshaller marshaller=jc.createMarshaller();

            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                                                   Boolean.TRUE);
            NamespacePrefixMapperUtils.setProperty(marshaller, 
                    NamespacePrefixMapperUtils.getPrefixMapper());          

            marshaller.marshal(pkg, new FileOutputStream(docxFile));
        } catch (Exception e) {
            throw new Docx4JException("Error saving Flat OPC XML", e);
        }   
        return;
    }

    SaveToZipFile saver = new SaveToZipFile(this); 
    saver.save(docxFile);
}

看起来您应该能够在帮助程序类中复制此代码,并对其进行调整以保存到 aOutputStream而不是(特别是) a FileOutputStream。请注意,SaveToZipFile该类具有save写入到OutputStream.

于 2012-11-13T12:40:46.937 回答
2

从 3.1.0 版本开始,您可以使用save(OutputStream outStream)

/**
     *  Save this pkg to an OutputStream in the usual zipped up format
     *  (Docx4J.FLAG_SAVE_ZIP_FILE)
     *  
     *  @since 3.1.0
     */ 
    public void save(OutputStream outStream) throws Docx4JException {
        save(outStream, Docx4J.FLAG_SAVE_ZIP_FILE);                     
    }
于 2017-07-29T16:57:36.367 回答