PDF anzeigen lassen

NerDine

Mitglied
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:


Code:
<!-- 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 :)
 
Zuletzt bearbeitet:

Mikrowelle

Bekanntes Mitglied
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
Code:
File file = new File("/home/newdir/muster.pdf");
FileOutputStream fos = new FileOutputStream(file);
 
N

nillehammer

Gast
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.

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

Probiers mal so
Code:
File file = new File("/home/newdir/muster.pdf");
FileOutputStream fos = new FileOutputStream(file);
Der Beitrag enthält leider ein paar Fehler:
1. Der Aufruf von
Code:
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:
Code:
<h:outputLink value="/home/newdir/muster.pdf">click</h:outputLink>
Der h:eek:utputLink 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 FileInputStream leitest.
 

NerDine

Mitglied
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.
HTML:
<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

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JSF Bestimmte Daten aus der Datenbank anzeigen lassen Allgemeines EE 13
D Bild erstellen und anzeigen lassen Allgemeines EE 4
G Ladeseite anzeigen lassen während das Servlet noch arbeitet? Allgemeines EE 6
L nicht alle eintraege anzeigen lassen Allgemeines EE 3
S Servlet: Verz. anzeigen lassen? Allgemeines EE 2
M JSF Nur bestimmten Rollen bestimmte Inhalte anzeigen... Allgemeines EE 2
A Unsauberer Code.. (Properties-Objekt in JSP anzeigen) Allgemeines EE 5
H Servlet - Zwischenmeldung anzeigen bei längerer Berechnung Allgemeines EE 2
M JSF Komponenten wahlweise anzeigen? Allgemeines EE 4
D Datenselektion anzeigen Allgemeines EE 3
G Struts: ActionMessage value in JSP anzeigen Allgemeines EE 2
K Struts - FormBean mit 2 Listen - Anzeigen und Speichern Allgemeines EE 2
O Anzeigen mehrerer columns in einer DataTable Allgemeines EE 4
M PDF im neuen Browserfenster auf Client-Rechner anzeigen Allgemeines EE 5
M Tomcat - Bei allen Exceptions einheitliche Seite anzeigen ? Allgemeines EE 3
G Values aus DB in Input-Feldern anzeigen (Struts) Allgemeines EE 2
P JFreechart objekt in JSP anzeigen Allgemeines EE 12
A DB-Tabelle in Servlet einlesen und in JSP anzeigen Allgemeines EE 9
U jpg objekt mit jsp anzeigen Allgemeines EE 3
A Binärdatei vom Servlet erzeugen lassen Allgemeines EE 3
T "normales" Java Programm auf einen Server laufen lassen Allgemeines EE 3
P CXF Project auf Tomcat laufen lassen - wie? Allgemeines EE 35
M Daten aus JavascriptSeite von Java auswerten lassen Allgemeines EE 3
C Automatisiertes Bild erzeugen lassen. Allgemeines EE 7
R Zeichenkette als JSP-Fragment auswerten lassen Allgemeines EE 4
F Timer in einem Applicationserver laufen lassen? Allgemeines EE 4
S webservice mit tomcat und axis ohne eclipse laufen lassen? Allgemeines EE 2
K war-Archiv unter Tomcat neu entpacken lassen Allgemeines EE 3
G Servlet wollen sich nich ansprechen lassen Allgemeines EE 4

Ähnliche Java Themen


Oben