Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将WordprocessingMLPackage保存到ByteArrayInputStream_Java_Openxml_Docx_Docx4j - Fatal编程技术网

Java 将WordprocessingMLPackage保存到ByteArrayInputStream

Java 将WordprocessingMLPackage保存到ByteArrayInputStream,java,openxml,docx,docx4j,Java,Openxml,Docx,Docx4j,如何将org.docx4j.openpackaging.packaging.WordprocessingMLPackage实例保存到ByteArrayInputStream中,然后从服务器下载该实例 谢谢。您无法通过tearrayinputstream保存到。。。曾经ByteArrayInputStream是一个InputStream,您不能写入InputStream 但是,您可以向ByteArrayInputStream写入内容,获取字节数组,并为数组创建ByteArrayInputStrea

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


谢谢。

您无法通过tearrayinputstream保存到
。。。曾经
ByteArrayInputStream
是一个
InputStream
,您不能写入
InputStream

但是,您可以向
ByteArrayInputStream
写入内容,获取字节数组,并为数组创建
ByteArrayInputStream
包装器

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


嗯,我的假设是错误的,
WordprocessingMLPackage
唯一的
save
方法保存到
文件中。(我猜有人没有收到关于如何设计灵活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);
}

看起来您应该能够在助手类中复制此代码,并将其调整为保存为
OutputStream
,而不是(具体地说)文件OutputStream
。请注意,
SaveToZipFile
类具有替代的
save
方法,这些方法可以写入
OutputStream

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

对于WordMLP包和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.*

从3.1.0版开始,您可以使用
保存(OutputStream outStream)


最后,我将生成的docx保存到临时文件夹中,并将其转换为ByteArrayOutputStream,谢谢。@user200340您是如何转换的?
/**
     *  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);                     
    }