Wie kann ich eine org.docx4j.openpackaging.packages.WordprocessingMLPackage -Instanz in ByteArrayInputStream speichern, dann kann sie vom Server heruntergeladen werden.WordprocessingMLPackage in ByteArrayInputStream speichern
Danke.
Wie kann ich eine org.docx4j.openpackaging.packages.WordprocessingMLPackage -Instanz in ByteArrayInputStream speichern, dann kann sie vom Server heruntergeladen werden.WordprocessingMLPackage in ByteArrayInputStream speichern
Danke.
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.
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.*
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);
}
Ich am Ende speichern Sie die generierte docx in einen temporären Ordner, und konvertieren Sie es in ByteAr rayOutputStream, danke. – user200340
@ user200340 Wie hast du es gemacht, um zu konvertieren? –