2012-11-13 2 views

ответ

3

Вы не можете сохранить в ByteArrayInputStream ... когда-либо. A ByteArrayInputStream - InputStream, и вы не можете/не можете написать InputStream.

Однако вы можете написать что-то ByteArrayOutputStream, получить массив байтов и создать обертку ByteArrayInputStream для массива.

(я предполагаю, что есть способ, чтобы сохранить один из тех случаев, к OutputStream или Writer ...)


Ну, мое предположение было неверным, и WordprocessingMLPackage «s только save метод экономит до File. (Я думаю, кто-то не получил записку о том, как разработать гибкий ввод-вывод 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 р и 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.* 
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);      
    } 
Смежные вопросы