使用反应器通量和 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
和一个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
的 Flux?
试试 then(...)
-Operator,因为它会让第一个 Mono 完成,然后播放另一个 Mono。
...
content.doOnNext { element ->
document.add(element)
}
// .ignoreElements() // necessary?
.doFinally(signal -> document.close())
.then(byteArrayOutputStream.toByteArray().toMono())
...
我认为它应该在没有 .ignoreElements()
的情况下工作。
我正在尝试使用 libre/openpdf (https://github.com/LibrePDF/OpenPDF) 和 spring 的路由功能在内存中创建一个 pdf。
我有一个 com.lowagie.text.Element
的 Flux,其中包含 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
的 Flux?
试试 then(...)
-Operator,因为它会让第一个 Mono 完成,然后播放另一个 Mono。
...
content.doOnNext { element ->
document.add(element)
}
// .ignoreElements() // necessary?
.doFinally(signal -> document.close())
.then(byteArrayOutputStream.toByteArray().toMono())
...
我认为它应该在没有 .ignoreElements()
的情况下工作。