0

我正在尝试使用 libre/openpdf ( https://github.com/LibrePDF/OpenPDF ) 和 spring 的 routerfunctions 在内存中创建一个 pdf。

我有一个com.lowagie.text.Element包含 pdf 内容的通量。

com.lowagie.text.pdf.PdfWriterused, 需要acom.lowagie.text.DocumentOutputStream. Elements 被添加到Document并且数据被写入OutputStream.

我需要将 中的输出Outputstream写入org.springframework.web.reactive.function.server.ServerResponse.

我尝试使用以下方法解决此问题:

//inside the routerfunctionhandler

val content: Flux<Element> = ...
val byteArrayOutputStream = ByteArrayOutputStream()
val document = Document()
PdfWriter.getInstance(document, byteArrayOutputStream)
document.open()

content.doOnNext { element ->
    document.add(element)
}
    .ignoreElements()
    .block()
document.close()
byteArrayOutputStream.toByteArray().toMono()
    .let { 
        ok().body(it.subscribeOn(Schedulers.elastic())) 
    }

上述方法有效,但在弹性线程内有一个丑陋的块,并且不保证资源的清理。

有没有一种简单的方法可以将 an 的输出OutputStream转换为 s 的通量DataBuffer

4

1 回答 1

0

尝试使用then(...)-Operator,因为它让第一个 Mono 完成,然后播放另一个 Mono。

...
content.doOnNext { element ->
    document.add(element)
}
// .ignoreElements() // necessary?
.doFinally(signal -> document.close())
.then(byteArrayOutputStream.toByteArray().toMono())
...

我认为它应该在没有.ignoreElements().

于 2019-10-08T12:26:54.023 回答