5

org.docx4j.openpackaging.packages.WordprocessingMLPackageインスタンスをByteArrayInputStreamに保存して、サーバーからダウンロードするにはどうすればよいですか。

ありがとう。

4

3 に答える 3

4

私は同じ問題を抱えていて、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.*
于 2013-11-05T23:33:11.913 に答える
3

あなたは...に保存することはできません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このコードをヘルパークラスにコピーし、(具体的には)ではなくに保存するように調整できるはずですFileOutputStreamSaveToZipFileクラスにはsave、に書き込む代替メソッドがあることに注意してくださいOutputStream

于 2012-11-13T12:40:46.937 に答える
2

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);                     
    }
于 2017-07-29T16:57:36.367 に答える