# PDF anzeigen lassen



## NerDine (3. Dez 2012)

Hallo zusammen, 

ich programmiere momentan ein Kundenportal und habe folgendes Problem:

In meiner Datenbank (prostgresql) hole ich mir in Base64 codierte PDF's. Nun möchte ich, dass der Kunde die PDF's nicht nur downloaden, sondern davor mithilfe eines PDF-Viewers ansehen kann.

Ich habe in den Primeface Showcases bereits ein geeignetes Tag gefunden:



```
<!-- jsf/primefaces -->
<p:media value="/home/newdir/muster.pdf" width="100%" height="300px">  
     	Your browser can't display pdf, <h:outputLink value="/home/newdir/muster.pdf">click</h:outputLink> to download pdf instead.
</p:media>
```

Das Problem hier ist allerdings, dass ich bereits in der Geschäftslogik den Base64-String decodieren muss. Das hab ich auch gemacht. Das ganze sieht dann so aus:
[JAVA=42] 
//erstellt neues Verzeichnis
boolean status;
status = new File("/home/newdir/").mkdir();

//Base64-String 
String value = "/9j/4AAQSkZJRg....AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/2Q==";

Base64 decoder = new Base64();
byte[] imgBytes = decoder.decode(value);
FileOutputStream fos = new FileOutputStream("/home/newdir/muster.pdf");		
fos.write(imgBytes);
[/code]

Bis hier hin funktioniert auch noch alles wunderbar. Wenn ich nun aber mithilfe des p:media Tags die PDF anzeigen lassen möchte erscheint eben nur "Your browser can't display pdf, click to download pdf instead." 
und wenn ich es stattdessen downloaden möchte zeigt er mir folgende Fehlermeldung auf:

HTTP Status 404 - /home/newdir/muster.pdf
type: Status report

message: /home/newdir/muster.pdf

description: The requested resource (/home/newdir/muster.pdf) is not available.



Die Zugriffsrechte auf das neu erstellte Verzeichnis (auch für die Ordner darüber) habe ich bereits überprüft, die passen alle.
Ich weiß wirklich nicht woran es sonst liegen könnte, dass er nicht auf den Ordner zugreifen kann.

Kann mir eventuell irgendjemand helfen oder hat eine Idee woran es liegen könnte?
Ich hoffe man kann anhand der aufgezeigten Informationen mein Problem etwas nachvollziehen.

Vielen Dank schon mal


----------



## Mikrowelle (3. Dez 2012)

Ich bin jetzt kein Crack aber in der API steht

FileOutputStream(String name)
          Creates an output file stream to write *to the file *with the specified name.

So wie ich das sehe  hast du die File aber nich garnicht erstellt.

Probiers mal so 
	
	
	
	





```
File file = new File("/home/newdir/muster.pdf");
FileOutputStream fos = new FileOutputStream(file);
```


----------



## nillehammer (3. Dez 2012)

Mikrowelle hat gesagt.:
			
		

> Ich bin jetzt kein Crack aber in der API steht
> 
> FileOutputStream(String name)
> Creates an output file stream to write to the file with the specified name.
> ...


Der Beitrag enthält leider ein paar Fehler:
1. Der Aufruf von 
	
	
	
	





```
new File
```
 hat mit der Erzeugung einer Datei im Dateisystem überhaupt nichts zu tun. Es wird dadurch keine Datei erzeugt, sondern nur ein File-Objekt im Programm.
2. Das Öffnen eines FileOutputStream reicht zur Erzeugung eines Files im Dateisystem aus.

Der Fehler liegt hier:

```
<h:outputLink value="/home/newdir/muster.pdf">click</h:outputLink>
```
Der hutputLink ist leider nicht so "schlau", dass Du direkt den Pfad im Dateisystem angeben kannst und er das in eine gültige http-URL umwandelt. Mit dem Link denkt der Webcontainer, es gäbe einen Context (Webanwendung) namens "home", in dem unter newdir/muster.pdf eine Resource liegt. Das tut sie natürlich nicht. Du musst also selbst für das Mapping einer in Deiner Webanwendung gültigen URL auf den Pfad im Dateisystem machen. Z.B. ein Servlet, in dessen out-Stream du den Inhalt eines File*Input*Stream leitest.


----------



## NerDine (4. Dez 2012)

Vielen Dank für die Antworten.
Okay, dass der OutputLink nicht der beste Weg war seh ich ein, das wurde eben in Primefaces so vorgeschrieben.
Dafür hätte ich auch schon eine andere Lösung. 

```
<a href="data:application/pdf;base64, #{MBean.rech.dokument}">PDF-Download</a>
```

Das würde jedenfalls funktionieren. 
Hoffungsloser erscheint das Anzeigen der PDF's. Ich dachte eben wenn ich die decodierten PDF's in einem Ordner temporär zwischenspeichere könnte ich mit dem Pfad drauf zugreifen und sie so anzeigen lassen. 
Das ganz sollte eigl. so aussehen am Ende:

www.primefaces.org/showcase/ui/media.a

Hättest du in dem Fall evtl. auch noch einen Tipp?


----------



## freez (4. Dez 2012)

NerDine hat gesagt.:


> Ich dachte eben wenn ich die decodierten PDF's in einem Ordner temporär zwischenspeichere könnte ich mit dem Pfad drauf zugreifen und sie so anzeigen lassen.



Das macht bei größeren Dateien durchaus Sinn (Wobei es vielleicht denkbar wäre die Files schon direkt im Filesystem abzulegen, statt in der DB). Bei kleineren Dateien kannst du die Dekodierung auch im Arbeitsspeicher vornehmen.

Allerdings, wie mein Vorredner schon sagte, brauchst du ein Servlet. Das ist auch gar nicht so schwierig und hat wenig Code. Hier mal ein Beispiel: Binärdaten mit dem Servlet senden.

Dabei ist es egal, wie du im Servlet die Daten holst (DB mit Dekodierung im Speicher / Festplatte  oder direkt von der Platte usw.). Im OutputLink gibst du dann nur noch den Link zum Servlet an mit nem Parameter, welches PDF geladen werden soll.


----------



## NerDine (4. Dez 2012)

Vielen Dank dann werd ich es mal mit dem Servlet probieren, bin gespannt ob das klappt


----------

