Linuchs: diverse Fragen zur CSS-Unterstützung bei TCPDF (PDF von HTML erstelllen)

Moin,

zunächst finde ich die Idee Klasse, mit dem kostenlosen PHP-Zusatz TCPDF aus einer HTML-Datei eine PDF-Datei zu erzeugen.

Aaaber ...

Die erstellte PDF-Datei war vollkommen leer. Nach Recherche ist klar, dass komplette HTML-Dateien gar nicht umgesetzt werden, sondern "nur" HTML-Fragmente, z.B. <table> und dann noch mit sehr eingeschränkter CSS-Unterstützung.

Also gut, einem geschenkten Gaul ... - und ich machte mich daran, ein sorgfältig erstelltes HTML - Formular nochmal für TCPDF zu gestaltem. Ein ganzer Tag, weil zahlreiche CSS-Einträge ignoriert wurden und ich Alternativan ausprobieren musste. Versuch und Irrtum.

Mir ist es aber nicht gelungen, einen umrahmten inline-block zu erstellen.

Ein <div> ist immer ein block, der eine neue Zeile belegt und unbekannte margins hat mit vertikalem Abstand zum Text. Habe mit <span> und <input experimentiert, aber die ließen sich nicht zu inline-block umdefinieren und wollten keinen Rand (border) annehmen.

Frage: Wie bekomme ich ein umrahmtes Rechteck in den Fließtext?

Auch die Gestaltung einer Tabelle macht Probleme, die Spaltenbreite kann nicht in % definiert werden und Angaben in mm scheinen nur als unverbindliche Empfehlung verstanden zu werden, die Tabelle wächst seitlich schon mal aus der Seite heraus. Aber da muss ich noch versuchen und irren.

Würde mich freuen, mich mit TCPDF-Anwendern austauschen zu können und Neulingen Mut machen, diese Möglichkeit auszuprobieren.

Gruß, Linuchs

  1. Nachdenk ...

    Vielleicht ist mein Ansatz falsch.

    Die GEMA stellt Chören dieses ausfüllbare PDF Dokument zur Verfügung, um Veranstaltungen mit ihren Musiktiteln nachträglich zu melden.

    Ein Chorverband möchte seine Mitglieder beim Ausfüllen unterstützen, indem Liedtitel beim Tippen vorgeschlagen und samt Komponist usw. übernommen werden.

    Für die Eingabe habe ich ein HTML-Dokument erstellt, dass dem GEMA-Formular nachempfunden ist. Die Daten stehen also als $_POST zur Verfügung und werden jetzt schon testweise als CSV-Datei gemailt.

    Das (mühsam) ausgefüllte GEMA-PDF kann lokal gespeichert, aber trotz Menüpunkt "senden an" nicht gemailt werden. Jedenfalls nicht bei mir unter Ubuntu. Beim Anlicken von "senden an" passiert nichts.

    Wenn ich dieses PDF-Dokument mit PHP laden, ausfüllen und mailen könnte, wäre das die bessere Lösung. Und leichter zu pflegen bei Änderungen des PDF.

    Kann PHP dieses vorhanden PDF-Dokument ergänzen?

    1. ich stelle gerade fest, dass ich die GEMA-PDF mit meinem Text-Editor Geany nicht öffnen kann und damit nicht sehen, wie ich die auszufüllenden Felder mit str_replace füllen könnte.

    2. sorry, wenn das hier zum Selbstgeschreib wird ...

      Das (mühsam) ausgefüllte GEMA-PDF kann lokal gespeichert, aber trotz Menüpunkt "senden an" nicht gemailt werden.

      Unbemerkt im Hintergrund wurde ein Mail-Versand eröffnet mit einer PDF-Datei als Anhang.

      Ohne "An" und ohne "Betreff". Habe das mehrfach gesendet, aber immer wird die erste PDF-Version angehängt.

      Ich denke, ich mache weiter mit der zuerst vorgestellten Idee.

  2. Lieber Linuchs,

    im Grunde willst Du doch ein vorgefertigtes Layout als Vorlage nehmen, um darin passende Platzhalter mit den eigentlichen Inhalten zu befüllen. Da stellt sich nun die Frage, ob Du alle Inhalte des PDF-Dokumentes mit PHP jedes Mal neu erstellen möchtest, oder ob Du eine teilfertige PDF-Datei quasi als Hintergrundbild einbinden willst, um dann Deine eigentlichen Inhalte mit den üblichen tcpdf-Methoden an Ort und Stelle einzupassen.

    Jetzt, da Du TCPDF schon angefasst hast, ist der Schritt zu FPDI nicht mehr weit, welches ja TCPDF erweitert, damit man vorhandene PDF-Dokumente importieren kann, welche wie Hintergrundbilder in das Dokument eingebunden werden. Aber das hatte ich ja alles schon einmal geschrieben.

    Liebe Grüße

    Felix Riesterer

    1. Lieber Felix,

      damit man vorhandene PDF-Dokumente importieren kann, welche wie Hintergrundbilder in das Dokument eingebunden werden. Aber das hatte ich ja alles schon einmal geschrieben.

      Ich weiss, aber ich glaube nicht daran, dass ich "Hintergrundbilder" und Texte synchronisieren kann. Die Texte stehen dann irgendwo vor dem Bild.

      Wenn du auf FPDI hinweist, gehe ich davon aus, dass dieses Problem geklärt ist?

      Bei Suche nach "FPDI konzept" finde ich diese Seite

      Offenbar wird die Position angegeben, wohin geschrieben wird:

      // use the imported page and place it at position 10,10 with a width of 100 mm
      $pdf->useTemplate($tplIdx, 10, 10, 100);
      
      // now write some text above the imported page
      $pdf->SetFont('Helvetica');
      $pdf->SetTextColor(255, 0, 0);
      $pdf->SetXY(30, 30);
      $pdf->Write(0, 'This is just a simple text');
      
      $pdf->Output();
      

      Funktioniert das auch über mehrere Seiten PDF? Meine Folge-Aufgabe für diese GEMA-Geschichte wäre, drei Seiten auszufüllen.

      Gruß, Linuchs

      1. Lieber Linuchs,

        aber ich glaube nicht daran, dass ich "Hintergrundbilder" und Texte synchronisieren kann.

        glauben nützt Dir in diesem technischen Gebiet nichts. Gewissheit dagegen schon.

        Die Texte stehen dann irgendwo vor dem Bild.

        Die Sache mit dem "Hintergrundbild" war nur eine Analogie. Das so importierte PDF-Dokument selbst kannst Du nicht verändern, sondern nur weitere Inhalte einfügen.

        Wenn du auf FPDI hinweist, gehe ich davon aus, dass dieses Problem geklärt ist?

        Dein Problem ist nicht geklärt. Aber FPDI kann helfen, es zu lösen.

        Bei Suche nach "FPDI konzept" finde ich diese Seite

        Genau.

        Offenbar wird die Position angegeben, wohin geschrieben wird:

        Ja, du wirst Dir Textboxen auf der Seite platzieren müssen, in die Du mit den Methoden von TCPDF dann Textinhalte schreibst. Visuell ergänzt sich das dann mit dem dahinter sichtbaren Vorlagen-PDF.

        Funktioniert das auch über mehrere Seiten PDF?

        Mit der Methode $pdf->AddPage() kannst Du beliebig viele (Grenze ist der Arbeitsspeicher) Seiten erzeugen. Auch auf diese kannst Du (musst Du aber nicht) eine vorhandene PDF-Datei als visuelle Vorlage anwenden.

        Meine Folge-Aufgabe für diese GEMA-Geschichte wäre, drei Seiten auszufüllen.

        Na, dann mach!

        Liebe Grüße

        Felix Riesterer

    2. Hallo Felix,

      habe mir von dieser Seite die Datei FPDI-2.2.0.zip (2019-01-30) heruntergeladen und nach /include/FPDI/ entpackt:

      FPDI

      Das Beispiel von dieser Seite scheint nicht zur Installation zu passen, die ersetn beiden requires habe ich schon geändert.

      Fatal error: Class 'setasign\Fpdi\FpdfTpl' not found in include/FPDI/src/Fpdi.php on line 25

      24 class Fpdi extends FpdfTpl
      25 {
      26     use FpdiTrait; 
      

      Simple Introduction Demo of FPDI

      <?php
      use setasign\Fpdi\Fpdi;
      
      //require_once('fpdf/fpdf.php');
      //require_once('fpdi2/src/autoload.php');
      require_once('include/FPDI/src/Fpdi.php');
      require_once('include/FPDI/src/autoload.php');
      
      // initiate FPDI
      $pdf = new Fpdi();
      // add a page
      $pdf->AddPage();
      // set the source file
      $pdf->setSourceFile('PdfDocument.pdf');
      // import page 1
      $tplIdx = $pdf->importPage(1);
      // use the imported page and place it at position 10,10 with a width of 100 mm
      $pdf->useTemplate($tplIdx, 10, 10, 100);
      
      // now write some text above the imported page
      $pdf->SetFont('Helvetica');
      $pdf->SetTextColor(255, 0, 0);
      $pdf->SetXY(30, 30);
      $pdf->Write(0, 'This is just a simple text');
      
      $pdf->Output();
      ?>
      

      Was löst den Fehler aus?

      1. Du hast vermutlich nicht alle Abhängigkeiten installiert. In der Installations-Anleitung steht geschrieben, dass FPDI zusätzlich FPDF, TCPDF oder tFPDF braucht. Das kannst du von Hand erledigen, aber ich würde es von Composer erledigen lassen.

        composer require setasign/fpdi-tcpdf
        

        Das macht es dir in Zukunft einfacher die Pakete zu aktualisieren. Und du kannst dich über Sicherheitslücken benachrichtigen lassen.