2012-11-13 5 views

Antwort

3

Sie können nicht speichern ByteArrayInputStream ... jemals. A ByteArrayInputStream ist ein InputStream und Sie können/können nicht in eine InputStream schreiben.

Sie können jedoch etwas in eine ByteArrayOutputStream schreiben, erhalten Sie die Byte-Array, und erstellen Sie eine ByteArrayInputStream Wrapper für das Array.

(Ich gehe davon aus, dass es eine Möglichkeit ist einer jener Fälle zu einer Output oder Writer zu retten ...)


Nun, meine Annahme falsch war, und WordprocessingMLPackage ‚s nur save Methode speichert zu einem File. (Ich nehme an, jemand hat das Memo nicht bekommen, wie flexible I/O-Apis zu entwerfen ...)

Aber der Quellcode (here) bietet einige Hinweise, wie Sie es selbst implementieren könnten. Das Verfahren ist wie folgt:

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

Es sieht aus wie sollten Sie in der Lage sein, diesen Code in einer Hilfsklasse zu kopieren, und zwicken sie ein FileOutputStream zu einem OutputStream statt (speziell) zu speichern. Beachten Sie, dass die SaveToZipFile Klasse alternative save Methoden hat, die an eine OutputStream schreiben.

+0

Ich am Ende speichern Sie die generierte docx in einen temporären Ordner, und konvertieren Sie es in ByteAr rayOutputStream, danke. – user200340

+0

@ user200340 Wie hast du es gemacht, um zu konvertieren? –

4

Ich hatte das gleiche Problem und fand einen einfacheren Weg, es zu tun, ohne die save() Funktion zu ändern. Quelle here und ich machte ein paar Änderungen:

Für eine WordMLPackage p und HttpServletResponse Antwort:

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-Anweisung:

import org.docx4j.openpackaging.io.* 
1

Seit 3.1.0 Version können Sie save(OutputStream outStream) verwenden:

/** 
    * 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);      
    } 
Verwandte Themen