我正在尝试使用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的流量?
答案 0 :(得分:0)
尝试使用then(...)
-运算符,因为它可以使第一个Mono完成,然后再播放另一个Mono。
...
content.doOnNext { element ->
document.add(element)
}
// .ignoreElements() // necessary?
.doFinally(signal -> document.close())
.then(byteArrayOutputStream.toByteArray().toMono())
...
我认为在没有.ignoreElements()
的情况下应该可以使用。