如何將org.docx4j.openpackaging.packages.WordprocessingMLPackage實例保存到ByteArrayInputStream中,然後可以從服務器上下載它。將WordprocessingMLPackage保存爲ByteArrayInputStream
謝謝。
如何將org.docx4j.openpackaging.packages.WordprocessingMLPackage實例保存到ByteArrayInputStream中,然後可以從服務器上下載它。將WordprocessingMLPackage保存爲ByteArrayInputStream
謝謝。
您無法保存到ByteArrayInputStream
...永遠。 A ByteArrayInputStream
是InputStream
,您不能/不能寫入InputStream
。
但是,您可以寫一些東西到ByteArrayOutputStream
,獲取字節數組,併爲該數組創建一個ByteArrayInputStream
包裝。
(我假設有一種方法來保存這些實例的OutputStream或作家之一......)
好了,我的假設是錯誤的,WordprocessingMLPackage
唯一save
方法保存到File
。 (我想有人沒有得到關於如何設計靈活的I/O 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 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語句:
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你是怎麼做轉換的? –