使用电抗器通量创建pdf并打开pdf

时间:2019-10-06 19:38:08

标签: spring-webflux project-reactor openpdf

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

我的通量为com.lowagie.text.Element,其中包含pdf的内容。

使用的com.lowagie.text.pdf.PdfWriter需要一个com.lowagie.text.Document和一个OutputStream。将Element添加到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 s的流量?

1 个答案:

答案 0 :(得分:0)

尝试使用then(...)-运算符,因为它可以使第一个Mono完成,然后再播放另一个Mono。

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

我认为在没有.ignoreElements()的情况下应该可以使用。