# PDFBox PDF im Browser öffnen



## morpheusen (10. Aug 2015)

Hallo,
wie man in einem anderen Post schon lesen konnte, beschäftige ich mich mit PDFBox. Ich habe ein fertiges PDF-Dokument. 
Die Verfahrensweise ist so, dass der Nutzer einen Button klickt, daraufhin die Klasse zum erstellen des PDFs aufgerufen wird. Das alles endet mit dem Speichern des PDFs auf der Festplatte. 
Nun hätte ich gerne, dass das PDF entweder als Download aufgerufen wird, oder sich in einem neuen Browserfenster öffnen.

Bei stackoverflow habe ich diesen Code gefunden:

```
response.addHeader("Content-Type","application/force-download");
response.addHeader("Content-Disposition","attachment; filename=\"yourFile.pdf\"");
response.getOutputStream().write(output.toByteArray());
```

Wenn ich das bei mir so übernehme, sagt mein Eclipse: mit response kann ich nix anfangen, willste eine Variable hinterlegen.

Wie kann das alles funktionieren?


----------



## stg (11. Aug 2015)

Was der Client mit dem Response anfängt, ist erst einmal seine Sache. Ob sich das PDF in einem neuen Browser-Fenster öffnet oder aber ein Download-Dialog angezeigt wird hängt da primär von den Browsereinstellungen seitens des Clients ab. Mit dem Setzen des Headers setzt du praktisch nur "Empfehlungen" an den Client-Browser ab, wie er mit dem Response umgeben sollte. 
Als Content-Type solltest du aber eher den korrekten Typ setzen, also etwa "application/pdf", was du da machst ist eher ein schmutziger Hack, der aber auch schiefgehen kann, wenn der Client das nicht unterstützt. Ansonsten passt das aber schon so.
Für den Fall, dass du das PDF Dokument auf deiner Webseite darstellen möchtest wäre wichtig zu wissen, was du für Technologien für die View verwendest. PrimeFaces bietet zum Beispiel ein <p:media>-Tag an. Zusammen mit StreamedContent kannst du damit auch dein dynamisch erstelltes PDF direkt "in die Webseite streamen".

Sieht dazu hier
http://www.primefaces.org/showcase/ui/multimedia/media.xhtml
und hier:
http://www.primefaces.org/showcase/ui/multimedia/graphicImage.xhtml


----------



## morpheusen (11. Aug 2015)

Vielen Dank für Deine Antwort. Ich möchte einfach nur, dass ein Dialogfenster sich öffnet und ich das PDF dann speichern kann.

Aber mein Eclipse kommt mit dem response nicht klar. Da will er irgendeine Klasse aufrufen, die es nicht gibt.


----------



## morpheusen (11. Aug 2015)

Alternativ dachte ich gerade, dass ich das gespeicherte PDF auch einfach im Acrobat Reader öffne mittels:


```
if (Desktop.isDesktopSupported()){
    Desktop dt = Desktop.getDesktop();
    try {
        dt.open(new File (localSave));
    }catch (Exception ex){
        ex.printStackTrace();
    }
}
```

Das Problem hier ist, dass ich dann eine "java.awt.HeadlessException" bekomme.
Ich habe das schon getestet und bei diesem JBoss Server ist der headless mode schon aktiv.

Vielleicht hat einer dazu einen Vorschlag. 

Alternativ würde ich aber gern bei der zuerst angestrebten Lösung bleiben.


----------



## michaels (11. Aug 2015)

Hallo,
du mischt hier gerade verschiedene Dinge!
Dein erster Versuch, mit dem Response, geht in die Webanwendung. Dein Versuch mit der Desktop-Klasse ist für Desktop-Anwendungen (Swing). Um was für eine Anwendung handelt es sich denn?
Ich vermute um eine Webanwendung - da du von JBoss geschrieben hast. Dann solltest du die Desktop-Variante ganz schnell vergessen! Du musst an das HttpResponse/HttpServletResponse Objekt kommen und dann die oben erwähnte Variante verwenden. 
Wie stg aber auch schon schrieb, liegt es auch am Browser wie die PDF dann verarbeitet wird.


----------



## morpheusen (11. Aug 2015)

Das dachte ich mir, dass ich da verschiedene Dinge vermische.

Ich hatte jetzt eine andere Idee.

Ich habe jetzt mit folgendem Befehl die PDF gestartet.
Runtime._getRuntime_().exec("cmd.exe /c start /b "+localSave);

Damit wird mein PDF gestartet und von da aus kann ausgedruckt werden oder an einen anderen Ort gespeichert werden.

Ich danke Euch sehr für eure Hilfe!


----------



## michaels (11. Aug 2015)

Dir ist aber schon klar, dass das nur unter Windows funktioniert!?
Ist meine Vermutung richtig und es handelt sich um eine Webanwendung, wird der Aufruf auch nicht auf einem "richtigen" Server funktionieren  - wenn Server und Client nicht derselbe sind.


----------

