Konvertieren: Outputstream zu Inputstream

Bitte aktiviere JavaScript!
Hallo,

ich möchte gerne einen Outputstream zu einem Inputstream konvertieren, damit ich das auf der Webseite anzeigen lassen kann (via Primefaces):

Java:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
private StreamedContent pdfTemplate;

public void createPDF() {



        LOGGER.info("START createPDF");
        FacesContext facesContext = FacesContext.getCurrentInstance();

        try {

            ExternalContext externalContext = facesContext.getExternalContext();
            String serverName = externalContext.getRequestServerName();
            String port = String.valueOf(externalContext.getRequestServerPort());
            String appName = externalContext.getRequestContextPath();
            String protocol = externalContext.getRequestScheme();
            String url = protocol + "://" + serverName + ":" + port + appName + "/common/documentEditorPreview.xhtml";

            ITextRenderer renderer = new ITextRenderer();

//            File file = new File(ConstantsStorage.ROOT_PATH_WITH_FILE_FOLDER + "/test.xhtml");
//            renderer.setDocument(file);
            renderer.setDocument(new URL(url).toString());
            renderer.layout();
            HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
            response.reset();
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition", "inline; filename=\"" + "pdfTemplate.pdf" + "\"");
            OutputStream browserStream = response.getOutputStream();

            // Primefaces
            InputStream inputStream =new ByteArrayInputStream(((ByteArrayOutputStream)browserStream).toByteArray());
            pdfTemplate = new DefaultStreamedContent(inputStream, "application/pdf");
            // Primefaces
            
            
            renderer.createPDF(browserStream);

        } catch (Exception e) {
            LOGGER.error(ExceptionUtils.getFullStackTrace(e));
            ErrorMessage.showErrorMessage();
        }
        facesContext.responseComplete();

        LOGGER.info("END createPDF");
    }

Bekomme aber diese Meldung:
io.undertow.servlet.spec.ServletOutputStreamImpl cannot be cast to java.io.ByteArrayOutputStream

Jemand eine Idee?
 
A

Anzeige




Vielleicht hilft dir unser Kurs hier weiter —> (hier klicken)
Ich denke du suchst sowas:
Java:
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[chunk];
int bytesRead = -1;

while ((bytesRead = base64InputStream.read(buffer)) != -1) {
    os.write(buffer, 0, bytesRead);
}
 
siehe Code... ich erstelle aus einer HTML Seite eine PDF (Vorlageneditor)
Diese PDF wiederum will ich auf meiner HTML Seite als PDF ausgeben, via Stream und p:media von Primefaces
 
Kannst du nicht in einen "eigenen" ByteArrayOutputStream schreiben statt den vom Servlet? Sonst kenne ich Primefaces und diesen Renderer leider zu wenig.
Aber rein intuitiv ist der Umweg über den Outputstream der Response unnötig
 
Ohne Ahnung von Primefaces zu haben, klingt die Idee dahinter ziemlich falsch. HttpServletResponse ist die Antwort auf eine Anfrage eines Clients, der OutputStream davon das, was an den Client gesendet wird - daraus Serverseitig zu lesen (also genau an der Stelle, an der du auch reinschreibst), klingt ziemlich nach dem, was man nicht machen würde.


Die beiden Zeilen, die zwischen // Primefaces stehen, sind in dem Programm aber sowieso irrelevant, von daher: lösch sie einfach und zumindest der Fehler verschwindet ¯\_(ツ)_/¯
 
Die beiden Zeilen, die zwischen // Primefaces stehen, sind in dem Programm aber sowieso irrelevant, von daher: lösch sie einfach und zumindest der Fehler verschwindet ¯\_(ツ)_/¯
Das ist es ja gerade. Ich benötige doch aber einen InputStream für Primefaces, damit ich die PDF anzeigen lassen kann....
Ja, das Programm läuft ohne die Primefaces zwischen // Primefaces, aber ich benötige eben diesen Inputstream...
 
Wofür benötigst du denn einen InputStream von diesem OutputStream, den du selbst beschreibst (bzw in diesem Fall eben nicht, so dass der InputStream sowieso leer wäre)?

Und in deinem Beispiel brauchst du eben keinen, wofür brauchst du den denn?
 
So wie ich das sehe, benötige ich für Primefaces einen Inputstream:
 
Wenn du einen StreamedContent brauchst ja...aber doch nicht einen InputStream von einem OutputStream, den du grad zufällig irgendwo findest?!


Statt den Renderer direkt in den OutputStream schreiben zu lassen, schreib ein einen eigenen, extra geöffneten Stream, und für diesen kannst du dann den InputStream öffnen, so wie in dem verlinkten Artikel.
 
Ggf. funktioniert es auch so:
Java:
public StreamedContent getCreatedPdf() {
    FacesContext context = FacesContext.getCurrentInstance();

    if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
        return new DefaultStreamedContent();
    } else {
        createPdf(); // schreibt direkt in den OutputStream
        context.responseComplete(); 
        return null;
    }
}
 
Passende Stellenanzeigen aus deiner Region:

Oben