java.io.OutputStream zu java.io.InputStream konvertieren

Diskutiere java.io.OutputStream zu java.io.InputStream konvertieren im Java Basics - Anfänger-Themen Bereich.
B

beta20

Hallo,

wie schaffe ich es ein Objekt vom Typ: java.io_OutputStream in einen java.io.InputStream zu konvertieren?

Ich habe diesen Code, welcher ein PDF von einer Webseite erzeugt...
Hier bekomme ich einen Fehler (cannot cast Exception)
ByteArrayOutputStream buffer = (ByteArrayOutputStream) browserStream;

Java:
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;

            HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
            response.reset();
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition", "inline; filename=\"" + "pdfTemplate.pdf" + "\"");

            OutputStream browserStream = response.getOutputStream();

            PdfRendererBuilder builder = new PdfRendererBuilder();
            XRLog.setLevel(XRLog.CSS_PARSE, Level.SEVERE);
            XRLog.setLoggingEnabled(false);
            
            builder.useFastMode();
            builder.withUri(new URL(url).toString());
            builder.toStream(browserStream);

            builder.run();
                           
            ByteArrayOutputStream buffer = (ByteArrayOutputStream) browserStream;
            byte[] bytes = buffer.toByteArray();
            InputStream inputStream = new ByteArrayInputStream(bytes);
            pdfFile = new DefaultStreamedContent(inputStream, "application/pdf");
 
N

NoName2

Du meinst doch bestimmt so etwas
Java:
	public static InputStream getOutput(InputStream is) throws IOException {
		try (BufferedInputStream bis = new BufferedInputStream(is)) {
			return new ByteArrayInputStream(bis.readAllBytes());
		}
	}
Von einem InputStream kann man nur Daten lesen, zu einem OutputStream kann man nur Daten schreiben.
 
B

beta20

Nein, ich möchte diese Variable:
OutputStream browserStream

konvertieren zu

InputStream
 
N

NoName2

Geht nich:

Stichwörter zum Suchen: redirect, pipe... aber wie gesagt, zu einem OutputStream kannst du nur schreiben, umgekehrt ergäbe das keinen Sinn

Du kannst natürlich die zu schreibenden Byte woanders verarbeiten.
 
Zuletzt bearbeitet:
B

beta20

wie schaffe ich es dann das generierte PDF wieder in einen InputStream zu speichern, sodass es in einen Stream speichern kann:

Sodass ich es im Frontend anzeigen kann:
 
N

NoName2

Der Umweg oben über BufferedInputStream ist übrigens Quatsch, da habe ich nicht aufgepasst.
 
mihe7

mihe7

Du könntest mal folgendes probieren (Skizze!):
Java:
PipedOutputStream os = new PipedOutputStream();
PipedInputStream is = new PipedInputStream(os);

managedExecutorService.submit(() -> {
            PdfRendererBuilder builder = new PdfRendererBuilder();
            XRLog.setLevel(XRLog.CSS_PARSE, Level.SEVERE);
            XRLog.setLoggingEnabled(false);
           
            builder.useFastMode();
            builder.withUri(new URL(url).toString());
            builder.toStream(os);

            builder.run();
});

pdfFile = new DefaultStreamedContent(is, "application/pdf");
 
B

beta20

danke, das sieht schon Mal gut aus, allerdings scheint das PDF keine Daten zu haben:
"stream must have data"

Wo übergebe ich dann:
OutputStream browserStream = response.getOutputStream();
 
B

beta20

Aber dann fehlt mir doch das?

Java:
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=\"" + "pdfTemplate.pdf" + "\"");
OutputStream browserStream = response.getOutputStream();
Aktuell bekomme ich wohl kein Content in das PDF.
Bekomme ebenso diese Meldung:

Error in streaming dynamic resource.: org.jboss.weld.contexts.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.faces.view.ViewScoped
 
mihe7

mihe7

Es könnte sein, dass Du den OutputStream nach builder.run() noch schließen musst.
 
B

beta20

leider nein. immer noch:
Nachricht: PDFDocument: stream must have data

Java:
PipedOutputStream os = new PipedOutputStream();
            PipedInputStream is = new PipedInputStream(os);

            managedExecutorService.submit(() -> {

                try {
                    PdfRendererBuilder builder = new PdfRendererBuilder();
                    XRLog.setLevel(XRLog.CSS_PARSE, Level.SEVERE);
                    XRLog.setLoggingEnabled(false);
                    builder.useFastMode();
                    builder.withUri(new URL(url).toString());
                    builder.toStream(os);
                    builder.run();

                    os.close();

                } catch (IOException e) {
                    LOGGER.error(ExceptionUtils.getFullStackTrace(e));
                }
            });

pdfFile = new DefaultStreamedContent(is, "application/pdf");
 
B

beta20

Selbst wenn ich diesen Code ausführe, wird das PDF auch nicht mehr richtig generiert.

Java:
    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"
                    + "?documentDesignerId=" + documentDesigner.getIdHash() + "&preview=true";

            HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
            response.reset();
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition", "inline; filename=\"" + "pdfTemplate.pdf" + "\"");

            OutputStream browserStream = response.getOutputStream();

            managedExecutorService.submit(() -> {

                try {
                    PdfRendererBuilder builder = new PdfRendererBuilder();
                    XRLog.setLevel(XRLog.CSS_PARSE, Level.SEVERE);
                    XRLog.setLoggingEnabled(false);

                    builder.useFastMode();
                    builder.withUri(new URL(url).toString());
                    builder.toStream(browserStream);

                    builder.run();
                    
                } catch (IOException e) {
                    LOGGER.error(ExceptionUtils.getFullStackTrace(e));
                }
            });

Hingegen, dieser Code geht:
Java:
    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"
                    + "?documentDesignerId=" + documentDesigner.getIdHash() + "&preview=true";

            HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
            response.reset();
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition", "inline; filename=\"" + "pdfTemplate.pdf" + "\"");

            OutputStream browserStream = response.getOutputStream();

            PdfRendererBuilder builder = new PdfRendererBuilder();
            XRLog.setLevel(XRLog.CSS_PARSE, Level.SEVERE);
            XRLog.setLoggingEnabled(false);
            
            builder.useFastMode();
            builder.withUri(new URL(url).toString());
            builder.toStream(browserStream);
            
            builder.run();
            browserStream.close();
Das Problem besteht also leider weiterhin
 
mihe7

mihe7

Mal standalone probiert:
Java:
import java.util.concurrent.*;
import java.io.*;
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;

public class Test
{

    public static void writePdf(OutputStream pos) {
        try(OutputStream os = pos) {
            PdfRendererBuilder builder = new PdfRendererBuilder();
            builder.useFastMode();
            builder.withUri("https://www.w3.org/");
            builder.toStream(os);
            builder.run();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        ExecutorService service = Executors.newFixedThreadPool(1);

        PipedOutputStream os = new PipedOutputStream();
        PipedInputStream is = new PipedInputStream(os);
        service.submit(() -> writePdf(os));
        service.shutdown();

        try(FileOutputStream fos = new FileOutputStream("test.pdf")) {
            is.transferTo(fos);
        }
    }
}
Funktioniert einwandfrei. Wenn ich allerdings eine Wikipedia-URL verwende, wird ein 0-byte-File ausgegeben.
 
B

beta20

Ich habe nun das Objekt pdfFile + die Methode in ein @ApplicationScoped gepackt (nicht @ViewScoped).
Es scheint, dass das dann abschließend das Problem war.

Vielen Dank für die Hilfe
 
Thema: 

java.io.OutputStream zu java.io.InputStream konvertieren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben