# Pdf Stream von Servlet mit itext



## burricall (9. Jun 2010)

Hallo zusammen

Ich habe mittels itext ein pdf erstellt und will es nun via Stream zurück an den Client schicken. Der Client (Applet) sollte dann das PDF im Browser anzeigen. *Leider wird das PDF aber im Browser nicht angezeigt.*

Meine *doPost* Methode vom Servlet sieht folgendermassen aus:


```
public void doPost (HttpServletRequest  request, HttpServletResponse response) throws ServletException, IOException
{ 
    try
    {
        Document document = new Document();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();          
        PdfWriter.getInstance(document, baos);
        document.open();
        document.add(new Paragraph("BlaBla")); // -> hier wird das PDF erstellt
        document.close();
        response.setHeader("Expires", "0");
        response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        response.setHeader("Pragma", "public");
        response.setContentType("application/pdf");
        response.setContentLength(baos.size());
        ServletOutputStream out = response. getOutputStream();
        baos.writeTo(out);  // -> Das Servlet schickt das PDF zurück
        out.flush();
        out.close();
    }
    catch (Exception e) { e.printStackTrace();}
 }
```

Aus meiner Sicht sollte das Servlet richtig sein. 

Mein Clientfunktion sieht so aus:

```
public Vector myCall(Vector vec) 
{
    try 
    {
        URL url = new URL("http://localhost:8080/toplife/servlet/Testpaket.TestServlet");
        URLConnection connection = url.openConnection();
        connection.setDoInput(true);
        connection.setDoOutput(true);
        
        ObjectOutputStream  toServer = 
        new ObjectOutputStream(new GZIPOutputStream(connection.getOutputStream()));
        
        // [B]ein Vector wird ans Servlet geschickt mit Daten für das PDF[/B]
        toServer.writeObject(vec); 
        toServer.flush();
        toServer.close();

        // [B]Client wartet hier auf PDF vom Servlet[/B]
        BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
        bis.close();
      }
      catch ( Exception ex ) 
      {
        // a real program would need to handle this exception
      }
      return vec;
  }
```

Leider finde ich zur Zeit keine Lösung. Ich bitte um Hilfe. Danke


----------



## homer65 (9. Jun 2010)

Wie sieht denn dein web.xml aus?


----------



## Blakh (9. Jun 2010)

```
response.setContentType("application/pdf");
```

Verstehe das vllt. irgendwie nicht, aber wenn du das pdf von einem Applet angezeigt haben willst, wieso setzt du ContentType der Response auf pdf?


----------



## burricall (9. Jun 2010)

Da ist alles in Ordnung. Wenn ich das PDF direkt als Link vom Servlet anspreche wird das PDF angezeigt. Allerdings ohne die Daten. Die Daten müssen ja zuerst gesendet werden.


----------



## Blakh (9. Jun 2010)

Und wo ist da dein Applet? 


> Der Client (Applet) sollte dann das PDF im Browser anzeigenDer Client (Applet) sollte dann das PDF im Browser anzeigen


----------



## burricall (9. Jun 2010)

@Blakh

Der Client schickt einen Vektor an das Servlet. Dieser Vektor wird vom Servlet benötigt um das PDF mit itext zu erstellen. Im Vektor sind sozusagen die Daten, die für das PDF benötigt werden. Anschliessend wird das PDF über den Stream wieder zurück an den Client geschickt.  Das PDF wird nicht als File auf dem Server gespeichert, sonst wärs ja einfach.


----------



## burricall (9. Jun 2010)

Natürlich in der Clientfunktion (siehe oben). Ich habe ja nur die Funktion angegeben nicht die ganze Klasse. Der Rest der Klasse ist ja nicht relevant. Oder willst du wissen wie die GUI aussieht?


----------



## burricall (9. Jun 2010)

response.setContentType("application/pdf");

Wenn man dem Client einen Stream zurückschickt muss er wissen um was für ein Dokument es sich dabei handelt. Standardmässig ist dies ein html. Mit dieser Funktion weiss der Client, dass es sich um ein PDF handelt.


----------



## Blakh (9. Jun 2010)

Du möchtest also die Daten nicht an das Applet schicken, sondern das Applet stellt den Vektor für das Servlet und das Servelt soll das PDF anzeigen? Wenn du das an ein Applet wieder schicken willst, dann müsstest du doch den response-teil anders machen, meinem Verständnis nach 

Sorry .. will das echt nur verstehen .


----------



## burricall (9. Jun 2010)

Ja das ganze ist ein wenig komplex  Das Servlet ist schon richtig vertrau mir. Das PDF wird vom Client angezeigt. Das Problem muss irgendwo beim Clientcode liegen. Wie kann ich aus diesem BufferedInputStream ein PDF öffnen ???

Ich versuchs mal so:

Client -> schickt Vektor 
Servlet -> stellt PDF zusammen aus Vektor
Servlet -> schickt das PDF via Stream zurück an den Client und teilt ihm mit, dass es ein PDF Dokument ist (setContentType())
Client -> sollte das PDF anzeigen.


----------



## Blakh (9. Jun 2010)

Wie wärs, wenn du es so probierst?

Applet calling javascript methods.

Anstelle des simplen Textes, lässt du von javascript eben das pdf öffnen.


----------



## burricall (9. Jun 2010)

Hmmmm ich glaube nicht, dass das geht aber ich schaus mir mal an. Danke


----------



## burricall (11. Jun 2010)

Naja schein anscheinend zu kompliziert gewesen zu sein. Habs jetzt in einer Session zuerst den Vektor gespeichert und dann direkt das Servlet aufgerufen :autsch:


----------

