2012-11-13 36 views

回答

3

您無法保存到ByteArrayInputStream ...永遠。 A ByteArrayInputStreamInputStream,您不能/不能寫入InputStream

但是,您可以寫一些東西到ByteArrayOutputStream,獲取字節數組,併爲該數組創建一個ByteArrayInputStream包裝。

(我假設有一種方法來保存這些實例的OutputStream或作家之一......)


好了,我的假設是錯誤的,WordprocessingMLPackage唯一save方法保存到File。 (我想有人沒有得到關於如何設計靈活的I/O apis的備忘錄...)

但源代碼(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類具有替代方法save寫入OutputStream

+0

我最終將生成的docx保存到臨時文件夾中,並將其轉換爲ByteAr rayOutputStream,謝謝。 – user200340

+0

@ user200340你是怎麼做轉換的? –

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語句:

import org.docx4j.openpackaging.io.* 
1

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