Я пытаюсь создать pdf в памяти, используя libre / openpdf (https://github.com/LibrePDF/OpenPDF) и функции маршрутизатора Spring.
У меня есть поток com.lowagie.text.Element
, который содержит содержимое PDF.
Используется com.lowagie.text.pdf.PdfWriter
, принимает com.lowagie.text.Document
и OutputStream
. Element
s добавляются к 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?