首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将WordprocessingMLPackage保存到ByteArrayInputStream

将WordprocessingMLPackage保存到ByteArrayInputStream
EN

Stack Overflow用户
提问于 2012-11-13 20:33:57
回答 3查看 6.7K关注 0票数 5

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

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-13 20:40:47

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

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

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

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

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

代码语言:javascript
复制
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而不是(具体地说) FileOutputStream。请注意,SaveToZipFile类具有写入OutputStream的替代save方法。

票数 3
EN

Stack Overflow用户

发布于 2013-11-06 07:33:12

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

对于WordMLPackage p和HttpServletResponse响应:

代码语言:javascript
复制
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() );

导入语句:

代码语言:javascript
复制
import org.docx4j.openpackaging.io.*
票数 4
EN

Stack Overflow用户

发布于 2017-07-30 00:57:36

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

代码语言:javascript
复制
/**
     *  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);                     
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13360867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档