使用反应器通量和 openpdf 创建 pdf

create pdf using reactor flux and openpdf

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

我有一个 com.lowagie.text.Element 的 Flux,其中包含 pdf 的内容。

所用的com.lowagie.text.pdf.PdfWriter,取一个com.lowagie.text.Document和一个OutputStreamElement添加到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())) 
    }

上面的方法有效,但在弹性线程中有一个难看的块,不能保证资源的清理。

有没有一种简单的方法可以将 OutputStream 的输出转换为 DataBuffer 的 Flux?

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

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

我认为它应该在没有 .ignoreElements() 的情况下工作。