HP-Bastler: TC-PDF im neuen Fenster öffnen

Hallo,

mit TCPDF kann man am Ende einer PDF-Erstellung die Datei entweder speichern:
$pdf->Output('example_001.pdf',F);

oder aber nach der Erstellung sofort öffnen:
$pdf->Output('example_001.pdf','I');

Ich würde das Dokument gerne sofort nach der Erstellung öffnen.
Allerdings habe ich eine Situation, bei der das nicht so gut kommt weil:

Das "Affenformular", welches das Script auch erstellt befindet sich in einem iframe.
Das Dokument wird also auch in dem iframe erstellt. Wenn ich jedoch nun Korrekturen vornehmen und zurück zur Eingabemaske möchte, gibt es innerhalb des PDFs natürlich keinen "zurück"-Button. Also klickt der User in seinem Browser auf zurück. entsprechend wird nicht der iframe geladen, sondern der Hauptframe, womit der User ganz woanders landet.
Eine optimale Lösung wäre also, das PDF-Dokument in einem neuen Fenster zu öffnen. So kann der USer das Dokument geöffnet lassen und parallel seine Korrekturen vornehmen. Doch wie geht das bzw. geht das überhaupt?

Ich hatte auch schon überlegt mit einem Extra-Button "Vorschau" ein neues Fenster zu öffnen, geht jedoch nicht, da die ganzen Eingaben ja im Form-Element der eigenen php gesendet werden.

Kurz zum Aufbau:

//Variablenempfang
//per if-Anweisung pdf generieren
//oder aber <form> Affenformular starten </form>

Ich kann die pdf-generierung nicht in einer separaten php ausführen, da evtl. gewisse Pflichtfelder oder auch onchange-Selekt-Boxen verändert wurden und sich somit neue Möglichkeiten ergeben.

Ich hoffe ich konnte einigermaßen nachvollziehbar mein Problem schildern.
Hat jemand von Euch eine Idee?

Besten Dank und Gruß

Bastler

  1. Hello,

    Das ist ein HTML-Problem:

    gib im Link oder Action-Attribut, mit dem das Generieren aufgerufen wird, ein target-Attribut an.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com
    1. gib im Link oder Action-Attribut, mit dem das Generieren aufgerufen wird, ein target-Attribut an.

      Wenn ich das mache, gehen sämtliche eingegebenen Variablen an das neue Target. Sobald der Nutzer also in einer Selektbox etwas auswählt (und nicht das PDF generieren will), wird mittels onchange das Formular neu aufgerufen bzw. in Deinem Fall in eineme neuen Target aufgerufen, sodass immer mehr neue Fenster aufgerufen werden, sobald das "Affenformular" sich neu aufruft. In meinem Fall wäre das nicht zumutbar, da man am Ende $x viele Fenster offen hat.
      Es soll halt NUR dann ein Target aufgerufen werden, wenn deas PDF generiert wird.
      Wenn ich aber dem PDF-Generierungsbutton ein eigenes <form>-Tag gebe, werden nicht alle Variablen übergeben, die der Nutzer gerade noch korrigiert hat...

      verstehst´ ?

      Besten Gruß

      Bastler

      1. Hello,

        verstehst´ ?

        Nicht wirklich.

        Ich vermute, dass dann entweder vor oder nache dem eigentlichen "Affenformular" eine Stufe fehlt.

        Ein Affenformular sollte dann beendet sein, wenn alle Eingaben akzeptiert wurden.
        Die Antwort sollte dann ein Redirekt auf das (zwischengespeicherte) Ergebnis sein.

        Die Formulardaten sollten in der Session zurückgesetzt werden, damit beim Blättern über den Zurückbutton des Browsers bestenfalls en leeres Affenformular erscheint.

        Es wird also entweder das Affenformular, oder das Ergebnis oder ein Link oder ein Redirect-Header darauf gesendet.

        Serverseitig alleine bekommst Du das nicht in den Griff. Da muss der Client schon mitspielen.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bikers-lodge.com
        1. Hallo,

          ich habe das ganze jetzt mit einem <objekt> gelöst, welches das pdf in die Seite einbettet, nachdem es erstellt wurde. Ist sicherlich nicht die eleganteste Lösung, aber der Nutzer kann somit sein erstelltes Dokument sehen und hat auf der gleichen Seite die Möglichkeiten seine Eingaben zu ändern, OHNE das er die Seite neu laden muss...

          Das ist für meine Bedürfnisse ausreichend und hilft in diesem Forum vielleicht in Zukunft auch noch den Einen oder Anderen...

  2. Hallihallo!

    Meiner Meinung nach gibt es dazu zwei Möglichkeiten:

    1. Nach dem Absenden des Formulars wird eine Vorschau des generierten Dokuments in HTML angezeigt, die dann zwei Buttons ("Eingaben korrigieren" und "PDF generieren") enthält.

    2. Da Du ja anscheinend sowieso Javascript einsetzt:
      Die Formulardaten per Ajax-Request an das prüfende PHP-Skript senden.
      Dieses PHP-Skript kann dann einen JSON-String zurückliefern, der z.B. so aussehen kann:

       { "Formulardaten" : {  
          "Name" : "Max Mustermann",  
          "Adresse" : "bla bla",  
          "der Aufbau" : "sollte klar sein"  
         },  
        "Datencheck" : "ok",  
        "url_zum_pdf" : "foo/bar.pdf"  
       }
    

    Das Javascript kann nun die Daten aus response.Formulardaten nehmen und ins Affenformular einsetzen (Wenn die keys den Formularfeldern entsprechen, was sich ja fast schon aufzwingt, kann man das in einer Schleife erledigen), und, falls response.Datencheck == "ok" ist, ein Fenster öffnen und auf die Adresse response.url_zum_pdf verweisen lassen:
     var Fenster = window.open('http://example.com/foo/bar.pdf');

    Jetzt steht man natürlich kurz vor dem Problem, dass Du an zwei verschiedenen Stellen, nämlich zum Checken der Formulardaten und zum Generieren des PDF, die Formulardaten brauchst. Das lässt sich am einfachsten mit Sessions erledigen.

    Wenn man das Beispiel etwas weiter spinnt, kann man auf diese Art auch eine Quasi- Livevorschau realisieren:
    Dazu muss das Javascript, falls response.Datencheck == 'ok' ist, nur prüfen, ob das Fenster noch offen ist, und es gegebenenfalls nur refreshen.

    Ich hoffe, ich konnte meinen Gedankengang einigermassen anschaulich erklären...

    Beste Grüsse,
        Tobias Hahner