<?php
  
//
  //  calendar.php - generates a PDF file of a monthly calendar.
  //  Author: Jeff Lee <jeff at shipbrook dot com>
  //
  
set_time_limit120 );                                                                          // Time out after two minutes
  
require('../fpdf/fpdf.php');                                                                    // Uses the FPDF library to generate PDFs

  
$month = isset( $HTTP_POST_VARS["month"] ) ? $HTTP_POST_VARS["month"] : date("n");              // Get month from posted form data
  
$year = isset( $HTTP_POST_VARS["year"] ) ? $HTTP_POST_VARS["year"] : date("Y");                 // Get year from posted form data
  
$imageurl = isset( $HTTP_POST_VARS["imageurl"] ) ? $HTTP_POST_VARS["imageurl"] : "";            // Get URL of image user requested

  
if (isset( $HTTP_POST_FILES['imagefile']['tmp_name'] )) $imageurl $HTTP_POST_FILES['imagefile']['tmp_name']; // uploaded file overrides URL

  
$thetime mktime100$month15$year );                                                // Get a timestamp around the middle of the month.
  
$titlestring date"F Y"$thetime );                                                         // Build the title string (e.g. "May 2005")
  
$daysinmonth date"t"$thetime);                                                            // Get the number of days in the month
  
$numweeks WeeksInMonth$month$year );                                                      // Get the number of weeks in the month
  
$cellheight $cellwidth 2;                                                                   // Calendar box size: each day is 2 cm tall/wide.
  
$x = (21.59 7*$cellwidth) / 2;                                                                // Calculate upper-left corner of the calendar boxes
  
$y 26.94 - ($numweeks $cellheight);

  
$pdf=new FPDF"P""cm""Letter" );                                                           // Portrait mode, units in centimeters, letter size
  
$pdf->SetCreator("Jeff Lee's PDF Calendar Creator");                                            // Set the PDF's Creator tag
  
$pdf->SetTitle($titlestring);                                                                   // Set the PDF's Title tag
  
$pdf->AddPage();                                                                                // Start a new page
  
$pdf->SetLineWidth(0.02);                                                                       // Draw lines of width 0.02 cm
  
$pdf->AddFont("PalatinoLinotype-Roman""""pala.php");                                        // I like Palatino Linotype.  You'd better like it too.
  
$pdf->SetFont("PalatinoLinotype-Roman""""18" );                                             // Select 18-point type for the heading
  
$pdf->SetXY( ((21.59 $pdf->GetStringWidth($titlestring)) / 2), $y-);                        // Center the month/year above the calendar boxes
  
$pdf->Cell00$titlestring0);                                                         // Output the month/year.
  
$pdf->SetFillColor230 );                                                                      // Select the shade for the Saturdays and Sundays
  
$pdf->Rect$x$y$cellwidth$numweeks*$cellheight"F" );                                   // Shade in the Sundays column
  
$pdf->Rect$x+6*$cellwidth$y$cellwidth$numweeks*$cellheight"F" );                      // Shade in the Saturdays column
  
$pdf->Rect$x$y7*$cellwidth$numweeks*$cellheight );                                      // Draw a box around the entire thing
  
for ($i 1$i 7$i++) {                                                                    // Now draw separator lines within the box.
    
$pdf->Line$x+$i*$cellwidth$y$x+$i*$cellwidth$y+$numweeks*$cellheight );               //   (vertical lines)
    
if ($i $numweeks$pdf->Line$x$y+$i*$cellheight$x+7*$cellwidth$y+$i*$cellheight );  //   (horizontal lines)
  
}
  
$dow date"w"mktime100$month1$year ));                                         // Get the day-of-week for the first day in the month
  
$xpos $x 0.05 $cellwidth $dow;                                                          // Calculate the starting X position for the numbers
  
$ypos $y 0.25;                                                                              // Calculate the starting Y position for the numbers
  
$pdf->SetFontSize12 );                                                                        // Select 12-point type for the numbers
  
for ($i 1$i <= $daysinmonth$i++) {                                                        // For each day in the month:
    
$pdf->SetXY$xpos$ypos );                                                                  //   Move to the appropriate position
    
$pdf->Cell00$i0);                                                                 //   Output the day number
    
$xpos += $cellwidth;                                                                          //   Calculate the next X position for the numbers
    
if (++$dow == 7) {                                                                            //   If we've fallen off the end of the week,
      
$dow 0;                                                                                   //     Return to Sunday
      
$xpos $x 0.05;                                                                          //     Calculate the X position for Sunday
      
$ypos += $cellheight;                                                                       //     Move the Y position down one row
    
}
  }

  if (
$imageurl) {                                                                                // If we've got an image URL (or filename),
    
list( $imgwidth$imgheight$imgtype$attr ) = @getimagesize$imageurl );                  //   Get the image dimensions and type
    
if (($imgwidth) && ($imgheight) && ($imgtype 1) && ($imgtype 4)) {                        //   If it's at least 1x1 and JPEG or PNG,
      
$typestring $imgtype=="JPG" "PNG";                                                  //     Set a variable describing the type
      
$theheight $y 3;                                                                        //     Maximize its vertical dimensions on the page
      
$thewidth $imgwidth / ($imgheight $theheight);                                          //     and calculate its horizontal dimensions from that. 
      
if ($thewidth 19.59) {                                                                    //     If it's too wide for the page,
        
$theheight $theheight / ($thewidth/19.59);                                              //       reduce it appropriately.
        
$thewidth 19.59;
      }
      
$pdf->Image$imageurl, (19.59-$thewidth)/2+1, (($y-3)-$theheight)/2+1$thewidth$theheight$typestring );  // Add the image to the page.
    
}
  }

  
$data $pdf->Output("","S");                                                                   // Stuff the PDF data into a string
  
header("Content-type: application/pdf");                                                        // Tell the user's browser to expect a PDF file
  
header("Content-disposition: inline; filename=calendar.pdf");                                   // Force a download rather than displaying in the browser
  
header("Content-length: " strlen($data));                                                     // Tell the browser how big the PDF will be
  
echo $data;                                                                                     // Send the PDF to the user
  
if (isset( $HTTP_POST_FILES['imagefile']['tmp_name'] ))                                         // If a file was uploaded by the user, delete it (PHP
    
unlink$HTTP_POST_FILES['imagefile']['tmp_name'] );                                          //   supposedly does this automatically, but make sure)

  
function WeeksInMonth$month$year ) {                                                        // My Webhost doesn't support the calendar functions, so
    
$daysinmonth date"t"mktime1200$month15$year ));                             //   this is a quick hack to count the number of weeks
    
$theday mktime100$month1$year );                                                //   in any given month.
    
$thedow date("w"$theday);
    
$weeks $thedow 0;
    for (
$i 1$i <= $daysinmonth$i++) if (!date("w",mktime(1,0,0,$month,$i,$year))) $weeks++;
    return 
$weeks;
  }
?>