Java 将WordprocessingMLPackage保存到ByteArrayInputStream
如何将org.docx4j.openpackaging.packaging.WordprocessingMLPackage实例保存到ByteArrayInputStream中,然后从服务器下载该实例Java 将WordprocessingMLPackage保存到ByteArrayInputStream,java,openxml,docx,docx4j,Java,Openxml,Docx,Docx4j,如何将org.docx4j.openpackaging.packaging.WordprocessingMLPackage实例保存到ByteArrayInputStream中,然后从服务器下载该实例 谢谢。您无法通过tearrayinputstream保存到。。。曾经ByteArrayInputStream是一个InputStream,您不能写入InputStream 但是,您可以向ByteArrayInputStream写入内容,获取字节数组,并为数组创建ByteArrayInputStrea
谢谢。您无法通过tearrayinputstream保存到
。。。曾经ByteArrayInputStream
是一个InputStream
,您不能写入InputStream
但是,您可以向ByteArrayInputStream
写入内容,获取字节数组,并为数组创建ByteArrayInputStream
包装器
(我假设有一种方法可以将其中一个实例保存到OutputStream或Writer…)
嗯,我的假设是错误的,WordprocessingMLPackage
唯一的save
方法保存到文件中。(我猜有人没有收到关于如何设计灵活I/O API的备忘录…)
但是源代码()提供了一些关于如何自己实现它的线索。方法如下:
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
,而不是(具体地说)文件OutputStream
。请注意,SaveToZipFile
类具有替代的save
方法,这些方法可以写入OutputStream
我也遇到了同样的问题,并且找到了一种更简单的方法,无需更改save()函数。Source和我做了一些编辑:
对于WordMLP包和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版开始,您可以使用保存(OutputStream outStream)
:
最后,我将生成的docx保存到临时文件夹中,并将其转换为ByteArrayOutputStream,谢谢。@user200340您是如何转换的?
/**
* 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);
}