Как сохранить экземпляр org.docx4j.openpackaging.packages.WocprocessingMLPackage в ByteArrayInputStream, затем его можно загрузить с сервера.Сохранить WordprocessingMLPackage в ByteArrayInputStream
Спасибо.
Как сохранить экземпляр org.docx4j.openpackaging.packages.WocprocessingMLPackage в ByteArrayInputStream, затем его можно загрузить с сервера.Сохранить WordprocessingMLPackage в ByteArrayInputStream
Спасибо.
Вы не можете сохранить в 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
.
У меня была такая же проблема и нашла более простой способ сделать это, не меняя функцию 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.*
С 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);
}
Я в конечном итоге сохраняю созданный docx во временную папку и преобразовываю его в ByteAr rayOutputStream, спасибо. – user200340
@ user200340 Как вы сделали, чтобы конвертировать, пожалуйста? –