создать PDF с использованием потока реактора и OpenPDF - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь создать 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?

1 Ответ

0 голосов
/ 08 октября 2019

Попробуйте оператор then(...), поскольку он позволяет завершить первый моно, а затем воспроизводит другой моно.

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

Я думаю, что он должен работать без .ignoreElements().

...