Pdf Stream von Servlet mit itext

burricall

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

Java:
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:
Java:
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 🙂
 
Java:
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?
 
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

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.
 
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? 🙂
 
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.
 
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 😉.
 
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.
 
Naja schein anscheinend zu kompliziert gewesen zu sein. Habs jetzt in einer Session zuerst den Vektor gespeichert und dann direkt das Servlet aufgerufen :autsch:
 

Zurück
Oben