Esta página: http://blog.ostermiller.org/convert-java-outputstream-inputstream descreve como criar um InputStream a partir de OutputStream:
new ByteArrayInputStream(out.toByteArray())
Outras alternativas são usar PipedStreams e novos threads, o que é complicado.
Não gosto da ideia de copiar muitos megabytes para um novo array de bytes de memória. Existe uma biblioteca que faz isso de forma mais eficiente?
EDITAR:
A conselho de Laurence Gonsalves, experimentei o PipedStreams e descobri que não são tão difíceis de lidar. Aqui está o código de amostra em clojure:
(defn #^PipedInputStream create-pdf-stream [pdf-info]
(let [in-stream (new PipedInputStream)
out-stream (PipedOutputStream. in-stream)]
(.start (Thread. #(;Here you write into out-stream)))
in-stream))