将WordprocessingMLPackage保存到ByteArrayInputStream

use*_*340 5 java docx openxml docx4j

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

谢谢.

Ste*_*n C 4

您无法保存到ByteArrayInputStream...永远。AByteArrayInputStream是 anInputStream并且你不能/不能写入 an 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);
}
Run Code Online (Sandbox Code Playgroud)

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