org.docx4j.openpackaging.packages.WordprocessingMLPackageインスタンスをByteArrayInputStreamに保存して、サーバーからダウンロードするにはどうすればよいですか。
ありがとう。
私は同じ問題を抱えていて、save()関数を変更せずにそれを行う簡単な方法を見つけました。ここのソースと私はいくつかの編集を行いました:
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
。AByteArrayInputStream
はであり、InputStream
に書き込むことはできませんInputStream
。
ただし、に何かを書き込んだりByteArrayOutputStream
、バイト配列を取得したりByteArrayInputStream
、配列のラッパーを作成したりすることはできます。
(これらのインスタンスの1つをOutputStreamまたはWriterに保存する方法があると思います...)
まあ、私の仮定は間違っていました、そしてWordprocessingMLPackage
の唯一のsave
方法はに保存しFile
ます。(誰かが柔軟な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
このコードをヘルパークラスにコピーし、(具体的には)ではなくに保存するように調整できるはずですFileOutputStream
。SaveToZipFile
クラスにはsave
、に書き込む代替メソッドがあることに注意してくださいOutputStream
。
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);
}