Announcement

Collapse
No announcement yet.

Servlet erzeugt PDF - während erzeugung Fortschritt anzeigen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Servlet erzeugt PDF - während erzeugung Fortschritt anzeigen

    Hallo Forum,

    ich erzeuge via Servlet eine PDF, eben dynamisch und Daten in die PDF Datei einpflegen.

    So, jetzt möchte ich, dass der Nutzer während PDF erzeugt wird im Browser eine Mledung bekommt "PDF wird erzeugt", und wenn das PDF erzeugt wurde, dann wird es eben an den Browser gesendet - wie macht man sowas?

    ich mein, ich rufe mein Servlet auf, in der doGet Methode wird dann das PDF erzeugt, und abschließend eben der ServletOutputStream an den Client gesendet.

    Danke, Micha

  • #2
    Moin,

    grundsätzlich enthält eine HTML-Seite beispielsweise einen Button innerhalb eines Formulars in über den die PDF-Erzeugung gestartet wird. Jetzt gibt es meiner Meinung nach mind. 2 Variante.
    1. Der Button löst ein JavaScript aus, welches einen bisher über <div> versteckten Bereich anzeigt. Darin kann stehen "PDF wird generiert ...". Dann wird eine neue WebSeite geladen, z.B. über eine JSP. Innerhalb der JSP wird die PDF-Erzeugung gestartet. Das heißt solange die JSP mit der PDF-Erzeugung nicht fertig ist, wird beim Client die Anzeige "PDF wird generiert ..." gezeigt. Ist die PDF fertig, liefert die JSP eine neue WebSeite.
    2. Es wird eine Anfoderung abgeschickt und eine neue WebSeite angezeigt. Diese zeigt einen Fortschrittsbalken (geht mit Variante 1 nicht). Die WebSeite enthält Meta-Tag, um sich nach x-Sekungen nachzuladen. Dann kann der neue Fortschritt angezeigt werden, bis irgendwann die PDF fertig ist

    Comment


    • #3
      Für Variante 1:<br>
      Das JavaScript<br><br>
      <pre>
      &lt;script type="text/JavaScript"&gt;
      &lt;!--
      // Zeigt Infotext
      function showInfoText()
      {
      document.getElementById("InfoText").style.visibili ty="visible";
      }
      -->
      &lt;/script&gt;
      </pre><br><br>
      Das HTML-Formular mit Button<br>
      <pre>
      &lt;form action="CreateCourse.jsp" method="post"&gt;
      &lt;input type="submit" name="CreateCourse" value="Erzeugen" class="Standard" onClick="showInfoText()"&gt;
      &lt;/form&gt;
      </pre>
      <br><br>
      Der versteckte Text<br>
      <pre>
      &lt;div class="RedFont" id="InfoText" style="visibility:hidden;"&gt;
      Der Kurs wird erstellt ...
      &lt;/div&gt;
      </pre&gt

      Comment


      • #4
        Okay, danke, Variante 1 via JavaScript verstehe ich.

        Aber wie ist das bei Variante 2 mit dem Nachladen gemeint?

        Diese Seite mit dem Fortschrittsbalken muss doch irgendwo die Info herbekommen, wie weit das Servlet mit der Generierung ist?

        Schickt das PDF-Servlet erstmal via MIME Type "text/html" HTML-Infos an den CLient, schaltet dann um auf MIME "app/pdf" und schickt dann eben das fertige PDF?

        Hm, ich verstehe die Komunikation zwischen dem PDF Servlet und der sich nach X-Sekunden immer selbst nachladenden Infoseite nicht.

        Okay, Danke für Eure Hilfe

        Michae

        Comment


        • #5
          Der korrekte HTML-Tag für 2. ist wohl<br>
          &lt;meta http-equiv="refresh content="5"; URL=http://www.xxx.com/xyz.jsp"&gt;<br><br>
          Aller 5 Sekunden wird dann die JSP-Seite aufgerufen. Diese kann den Status der PDF-Generierung prüfen und schickt wieder eine neue HTML-Seite die wieder den Meta-Refresh beinhaltet. Ist die PDF fertig, wird dann eine andere Seite angezeigt

          Comment


          • #6
            okay ja ,soweit so gut mit dem Meta Refresh, nur wer stößt das Servlet zur PDF Generierung an?

            Ich mein, das Servlet reagiert doch auf ein doGet oder doPost. In einer dieser Methoden läuft die PDF erzeugung und zuletzt wird ein ServletOutputStream an den CLient gesendet, eben mit den PDF Daten.

            Nur ich verstehe nicht:

            wie ich zuerst das Servlet aufrufe zur PDF Generierung, und dann diese Meta-Refresh-JSP mit dem Fortschrittsbalken.

            Ich mein, das Servlet läuft doch nicht im Hintergrund weiter und werkelt? Sobald die JSP mit dem Meta Refresher aufgerufen wird, so wird doch eine neue GET Anforderung gesendet und das PDF Servlet werkelt nicht mehr

            Comment


            • #7
              Die Erzeugung kann ja in einem eigenen Thread stattfinden. D.h. daß Servlet startet den Thread und liefert die "Bitte warten"-Seite. Bei jedem Poll-Vorgang (meta-refresh) fragt das Servlet den Thread, ob er schon fertig ist und gegebenenfalls wíeviel Prozent er schon erledigt hat (für die Darstellung des Fortschrittbalkens). Ob der Thread so eine Prozentzahl überhaupt ermitteln kann, ist eine andere Frage.

              Gruß,

              Alwi

              Comment


              • #8
                Hallo Forum,

                okay, habe nochmal eine Frage zu dem Thread.

                Wenn Thread beendet ist, also Die PDF Daten sagen wir in ein ByteArray geschrieben hat, wie kommt dann das Serlvet (hat den Thread aufgerufen) an die Daten des ByteArrays?

                Ich meine, wenn Thread fertig ist und Daten ins Array gestellt hat, und beendet ist, dann ist das Array doch dann auch mit weg?

                Die Thread-Implementierung läuft ja über diese "void run()" Methode, die gibt ja keine Parameter zurück.

                Muss ich da einen Shared Memory Bereich allokieren?

                Danke, Michae

                Comment


                • #9
                  Hallo Michael,

                  Die Seite (das meta-tag) pollt ja, d.h. ruft alle n Sekunden das Servlet auf. Das Servlet fragt dann jedesmal den Thread, ob er schon fertig ist. Dazu muß es natürlich Zugriffsmethoden geben, z.b. isFinished() und getData(). Die kann man direkt in das Thread-Objekt oder in irgendein Objekt auf das beide Threads (der Erzeugungs-Thread und der Servlet-Thread) Zugriff haben einbauen. Muß natürlich sauber synchronisiert werden.

                  Gruß,

                  Alwi

                  Comment

                  Working...
                  X