【发布时间】:2012-11-01 21:20:30
【问题描述】:
如何将 org.docx4j.openpackaging.packages.WordprocessingMLPackage 实例保存到 ByteArrayInputStream 中,然后可以从服务器下载。
谢谢。
【问题讨论】:
如何将 org.docx4j.openpackaging.packages.WordprocessingMLPackage 实例保存到 ByteArrayInputStream 中,然后可以从服务器下载。
谢谢。
【问题讨论】:
我遇到了同样的问题,并找到了一种更简单的方法,无需更改 save() 函数。来源here,我做了一些修改:
对于 WordMLPackage p 和 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.*
【讨论】:
您永远无法保存到ByteArrayInputStream ...。 ByteArrayInputStream 是 InputStream,您不能/不能写信给 InputStream。
但是,您可以向ByteArrayOutputStream 写入一些内容,获取字节数组,然后为该数组创建一个ByteArrayInputStream 包装器。
(我假设有一种方法可以将其中一个实例保存到 OutputStream 或 Writer ...)
好吧,我的假设是错误的,WordprocessingMLPackage 唯一的save 方法保存到File。 (我猜有人没有得到关于如何设计灵活 I/O api 的备忘录......)
但是源代码 (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 类具有写入 OutputStream 的替代 save 方法。
【讨论】:
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);
}
【讨论】: