Mit php einen A4 PDF-Kalender erzeugen

Ideal für Vereine (Musikvereine, Trachtenvereine, ...)  ist es einen PDF-Kalender mit Ihren Terminen zu veröffentlichen. Früher mit Excel mühsam erstellt (später mit VBA automatisiert). Meine Lösung jetzt:

Mit FPDF und php einen Jahreskalender auf 2 A4 Seiten als PDF-ausgeben.
=> Online DEMO im neuen Fenster öffnen

Der Kalender basiert auf dem Script von Dr. Detlef Groth bei drweb.de mit folgenden von mir vorgenommenen Änderungen:

  • Beginn des Kalenders mit aktuellem Monat und aktuellem Jahr
  • Feiertage und Termine werden automatisch berechnet und eingetragen (Ostern, Advent...). Dabei habe ich die gesetzlichen Feiertage Bayerns als Feiertage markiert. (Anpassung für andere Bundesländer sehr einfach möglich. Infos zu gesetzl. Feiertagen aller Bundesländer)
  • Schrift und Farben angepaßt.
  • Termine können manuell oder aus einer Datenbank dem Kalender leicht hinzugefügt werden.

Installation meines Kalenders:

  • FPDF herunterladen, Ordner "Fonts" und Datei "fpdf.php" in ein Verzeichnis entpacken und auf Euren Server laden.
  • "A4-PDF-Kalender-Hornblog-de.txt" in den selben Ordner downloaden, auf Server laden und umbenennen (".txt" in ".php" ändern)
  • Fertig. Die Datei "A4-PDF-Kalender-Hornblog-de.php" aufrufen und Kalender als PDF ansehen.

Auf diese Weise erhält man einen einfachen, immer aktuellen PDF-Kalender, den man zusätzlich mit seinen Daten füttern kann. Ich hoffe, Euch damit ein bißchen Arbeit erspart zu haben und bedanke mich bei Herrn Dr. Groth (dort ist seine Kalender-Version noch etwas detaillierter beschrieben) für die Vorarbeit.

Lizenz
für die Verwendung meines angepassten Scripts ist CC-By-SA 3.0: frei für Nutzung(kommerziell und privat) und Veränderung unter den Voraussetzungen: Rückverlinkung auf diese Seite oder www.hornblog.de und bei Veränderung des Quellcodes eine gleichartige Lizenz. Nähere Angaben im Scriptkopf.

14 Antworten auf „Mit php einen A4 PDF-Kalender erzeugen“

  1. Super Tool.
    Habe mal ein wenig rumprobiert, aber es nicht hinbekommen. Würde gerne Kalendereinträge zusätzlich mit einem Link versehen. Hat mir aber immer das Layout komplett zerschossen.

    Gruß
    Christian

  2. Hallo, bei mir läuft das Skript überhaupt nicht. Hatte erst Fehler wegen fehlender Anführungszeichen in der date Funktion und jetzt findet er in den Funktionen z.B $monat nicht. Bin nun mit meinem Latein am Ende. Warum funktioniert das bei mir nicht?
    Gruß Daniel

    1. Funktioniert mein Script ohne irgendwelche Veränderungen bei Dir? Falls ja, dann nur wenig ändern, testen, wieder etwas ändern testen. So kann man sich annähern. Hilfreich ist es in Testumgebungen auch die Error-reporting Funktion von PHP zu aktivieren:
      error_reporting(E_ALL);
      ini_set("display_errors", 1);

  3. tolles Script! Hinweis noch zur Zeitumstellung: im Sommer wird die Uhr vorgestellt (+1), im Winter zurück (-1). Im Script ist es genau anders herum bezeichnet: "Sommerzeit -1" und "Winterzeit +1"

    1. Wie man es sieht. Mit der Angabe "+1" im Winter ist gemeint dass man eine 1h mehr Zeit gewinnt. Daher ist die Angabe schon richtig, wenn man es so sieht. Im Frühjahr verliert man 1h Schlaf daher minus 1. Aber der andere Ansatz bezüglich der Uhrzeit Umstellung an sich ist auch nachvollziehbar. Jeder wie er möchte.

  4. Hallo,

    Tolles Script würde diesen Kalender gerne bei meinem neuen Projekt einsetzten. Allerdings hätte ich deshalb noch zwei änderungen die ich nicht hinbekomme:

    1. Kalender soll immer mit Januar Beginnen und mit Dezember enden.
    2. Kalender über Vairable mit Jahreszahl aufrufbar zb 2020

    Danke Dir und Dr. Detlef Groth!

    Gruß Alex

    1. Hallo Alex,
      direkt am Anfang des Scripts stehen die entsprechenden Variablen, die einfach modifiziert werden müssen:

      $aktuellesJahr = date(Y);
      $aktueller_Monat= date(n);

      Einfach entsprechend Deiner Wünsche anpassen. Viele Grüße
      Christoph

      1. Hallo Christoph,

        danke für die rasche Antwort, das und paar andere Dinge habe ich versucht. Wenn ich das mache was du geschrieben hast, ändert sich nur bei mir oben der Text "Kalender 2018/19"

        Habe mal die date(Y) in $aktuellesJahr geändert und $aktuellesJahr = 2019 eingetragen, da behauptet er aber dann das der 20.Mai ein Samstag wäre, ist aber ein Montag.

        Gruß Alex

  5. Danke Dir Christoph!

    Achja, das der Kalender auch nach 2037 noch wunderbar funktioniert:

    function my_easter_date($str) {
    // Zeitpunkt des Osterfestes (0 Uhr) als Unix-Timestamp
    // Für Daten vor 1970 und nach 2037
    return strtotime("+".easter_days($str)." day",strtotime($str.'-03-21'));
    }

    Das Script als solches werde ich nicht verbreiten, nur die Kalender als PDF zum Download anbiten. Deine Seite werde ich nicht nur auf der Kalenderseite sondern auf jeder verlinken!

    Gruß Alex

    1. Hallo Christoph,

      hab da gerade noch einen Fehler in den Kalenderwochen Berechnug gefunden, habs mal auf die schnelle geändert (Bin der Freund von strftime geworden 😉 )

      #$Wochennummer=date(W, mktime(1, 0, 0, date(n) , $this->dayX, date(Y)));//Wochennummer berechnen lassen
      $Wochennummer=strftime("%V",strtotime("+".$this->dayX." days",strtotime(date(Y).'-01-01')));

      Gruß Alex

      1. Welchen Fehler genau? Die Wochenangaben passten bei meinen früheren Test immer. Kann den Vorteil einer strtotime (Text in Time umrechnen lassen) im Gegensatz zu mktime nicht erkennen.

  6. Wenn man ein Jahr übergibt, fängt der Kalender mit KW 18 statt 1 an. Ist mir auch erst gestern nach dem 5. Ausgedrucktem Kalender aufgefallen ... Ist nicht böse gemeint mit mktime und so ...

    1. mktime Lösung für Wochennummern:
      $Wochennummer=date(W, mktime(1, 0, 0, 1 , $this->dayX, $aktuellesJahr));

      Osterdatum außerhalb von 1970 bis 2037:
      statt easter_date kann man mit der Funktion easter_days das berechnen lassen. Ich habs wieder mit mktime eingebunden und nicht mit strtime, aber das Ergebnis ist das gleiche.

      Die oben in den Kommentaren verlinkte Version für Dich Alex habe ich aktualisiert. Danke für die Backlinks.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.