【问题标题】:Save WordprocessingMLPackage to ByteArrayInputStream将 WordprocessingMLPackage 保存到 ByteArrayInputStream
【发布时间】:2012-11-01 21:20:30
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: java openxml docx docx4j


    【解决方案1】:

    我遇到了同样的问题,并找到了一种更简单的方法,无需更改 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.*
    

    【讨论】:

      【解决方案2】:

      您永远无法保存到ByteArrayInputStream ...。 ByteArrayInputStreamInputStream,您不能/不能写信给 InputStream

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

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


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

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

      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 方法。

      【讨论】:

      • 我最终将生成的 docx 保存到临时文件夹中,并将其转换为 ByteArrayOutputStream,谢谢。
      • @user200340 请问你是如何转换的?
      【解决方案3】:

      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);                     
          }
      

      【讨论】:

        猜你喜欢
        • 2021-04-13
        • 1970-01-01
        • 2017-10-28
        • 2017-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-11
        • 1970-01-01
        相关资源
        最近更新 更多