# Datei aus Servlet öffnen



## robthemobb (29. Aug 2008)

Hallo,

ich hoffe, ich bin hier im richtigen Forum gelandet.

Ich möchte gerne aus einem Servlet ein erstelltes PDF öffnen. 
Momentan benutze ich dafür den befehl:


```
response.sendRedirect("http://www.domain.de/pdf.pdf");
```

den Befehl:


```
Desktop.getDesktop().open(new File(pdf.pdf"));
```

kann ich nicht nehmen da das pdf ja vom clientbrowser geöffnet werden soll. oder geht es doch?

kann mir evtl jmd sagen wie oder ob ich direkt aus dem servlet das pdf (liegt auf dem server) öffnen kann?

vg, rob


----------



## maki (29. Aug 2008)

Was meinst du mit "ob ich direkt aus dem servlet das pdf (liegt auf dem server) öffnen kann"?

Du kannst das PDF źum Client (Browser) streamen und dieser macht dann was er damit so macht.


----------



## robthemobb (29. Aug 2008)

Danke für die schnelle antwort.

Ich meine wahrscheinlich das Streamen zum Browser des Clients. Hab mich nur doof ausgedrückt. 
Meine Absicht ist es, das erstellte PDF dem Client zur Verfügung zu stellen.

Ablauf ungefähr so:

Client gibt Daten in ein form ein. klappt

aus form mit Daten wird ein PDF. klappt

pdf wird auf Server gespeichert. klappt

Client soll PDF im Browser sehen. klappt nur mit redirect


Hast du da ne Idee?


----------



## maki (29. Aug 2008)

Klar, Ideen gibt es viele, allerdingslieferst du nur genug infos für wilde Spekulationen 

Welcher COntent ist denn im stream angegeben?
Wie sieht den der Code zum Streamen aus?


----------



## robthemobb (29. Aug 2008)

```
package de;

import java.awt.Desktop;
import java.io.*;
import java.util.*;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lowagie.text.*;
import com.lowagie.text.pdf.*;

public class FormExchange extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
    public FormExchange() {
    }
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    	PdfReader reader = new PdfReader("pdf.pdf");
		String param1 = request.getParameter("parameter1").toString();
		String param2 = request.getParameter("parameter2").toString();
		String param3 = request.getParameter("parameter3");
		String param4 = request.getParameter("parameter4");
		String param5 = request.getParameter("parameter5");

		try {
			PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("pdf.pdf"));

			AcroFields form = stamper.getAcroFields();
			form.setField("param1", parameter1 );
			form.setField("param2", parameter2 );
			form.setField("param3", parameter3 );
			form.setField("param4", parameter4 );
			form.setField("param5", parameter5);

			stamper.close();
			response.sendRedirect("http://www.domain.de/pdf.pdf");

			//Desktop.getDesktop().open(new File("pdf.pdf"));
			
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
```


Das ist das Servlet. Da soll, nach dem das PDF erstellt wurde, nun ein Befehl folgen, der es öffnet.


----------



## maki (29. Aug 2008)

Hier ist ein Beispiel wie man PDFs streamt: http://www.java2s.com/Code/Java/Servlets/AnotherservlettoSendPDF.htm

Das Beispiel reagiert auf GET und POST requests welche den Namen der Datei mitschicken, der try Block ist für dich interessant, natürlich musst du schon den richtigen Pfad für die Datei herausfinden.


----------



## robthemobb (29. Aug 2008)

Super danke, ich glaube das hilft mir schon weiter.

zwei kleine Fragen habe ich allerdings dazu:


```
String pdfDir = getServletContext().getInitParameter("pdf-dir");
```

ist das vorstehende die Anweisung nach dem Pfad "pdf-dir" zu suchen?
oder bekommt die funktion den Pfad, wo das PDF erstellt wird?

in der API habe ich es nicht verstanden.

Rob


----------



## maki (29. Aug 2008)

getIniParamter liefert einen Paramter, so wie er in der WEB-INF/web.xml deklariert ist.

Irgendwo wirst du ja auch definiert haben, wohin die PDFs gespeichert werden, also den Pfad zum Ordner mit den generierten PDFs.


----------



## robthemobb (29. Aug 2008)

nein, bis jetzt wurden die in der document root abgelegt. wusste gar nicht das ich das beeinflussen kann  


ist das in der web.xml dann das child param-name und param-value, an dem ich den pfad angeben kann?


----------



## maki (29. Aug 2008)

Wenn die Dateien im root der webapp liegen brauchst du ja nicht, anber zur Info, das sind Init Parameter in der web.xml

```
<web-app>
        <servlet>
            <servlet-name>MyServletName</servlet-name>
            <servlet-class>com.mycompany.MyServlet</servlet-class>
    
            <init-param>
                <param-name> param1 </param-name>
                <param-value> value1 </param-value>
            </init-param>
            <init-param>
                <param-name> param2 </param-name>
                <param-value> value2 </param-value>
            </init-param>
            ...
        </servlet>
        ...
    </web-app>
```


----------



## robthemobb (29. Aug 2008)

ah ok, super. 

d.h. "pdf-dir" ist der param-name und "http://www.pfadzurdatei.de/datei.pdf" ist der wert

vielen dank!


----------



## maki (29. Aug 2008)

>> http://www.pfadzurdatei.de/datei.pdf  ist der wert 

Nö, du solltest schon einen Pfad auf dem Dateisystem haben.

Mit getServletContext().getRealPath("/") solltest du den Dateisystempfad zum Context bekommen, *aber (!!!)* Dateien sollte die Webapp sowieso nicht im context root ablegen, ist sehr schlecht falls mal eine neue Version installiert werden soll.

Anstatt einen relativen Pfad wie

```
new FileOutputStream("pdf.pdf")
```
solltest du lieber ein Verzeichnis wählen, welches sich ausserhalb des webapps bzw tomcat_home Verzeichnisses befindet, den Pfad kannst du ja in der web.xml wie oben beschrieben angeben.


----------



## robthemobb (1. Sep 2008)

*Danke Maki!*

Hat nun alles geklappt.

Der Parameter in der web.xml hieß aber wohl 'context-param'. bei 'init-param' tat sich nichts, bzw pdfDir in der .java wurde auf null gesetzt.

rob


----------



## maki (1. Sep 2008)

InitParam ist für ein Servlet, ContextParam für den gesamten Context, also alle Servlets, beides geht, muss nur richtig verwendet werden


----------



## robthemobb (1. Sep 2008)

scheint dann ja so als würde


```
String pdfDir = getServletContext().getInitParameter("pdfDir");
```

zu 


```
<context-param> 
                <param-name>pdfDir</param-name> 
                <param-value> value2 </param-value> 
</context-param>
```

gehören!?

es funktioniert ja nun. aber wie würde ich denn die andere variante angehen?


----------



## maki (1. Sep 2008)

Zeig mal deine web.xml und das Servlet um das es geht.


----------



## robthemobb (1. Sep 2008)

siehe pn


----------



## maki (1. Sep 2008)

Ok, soweit stimmt alles.

Was ich übersehen habe war, dass du die init param in der init() Methode abfragen soltest, aber context params gehen genauso, alles gut.


----------



## robthemobb (1. Sep 2008)

Jupp, bin auch gerade sehr zufrieden. Eben auf dem Server installiert und läuft.

Nochmals danke für die Hilfe!
Rob


----------

