#native_company# #native_desc#
#native_cta#

Create thumbnails and ftp em via command line…

By Alec
on September 8, 2004

Version: 1.0

Type: Full Script

Category: Graphics

License: GNU General Public License

Description: This will receive the path to a PDF as a command line argument, generate multiple thumbnails at various sizes, then ftp them to various locations. This is meant to be a command line script not a web page…

#!/usr/local/bin/php
<?php 
  # This is a command line php script to generate the thumbnail images of PDFs
  #   Authored by Alec Effrat (aeffrat (at) tribune (dotted) com) please 
  #   forward any ideas, comments, questions or enhancements back to me if possible.
  #
  #   EXAMPLE OUPTUT FILENAME:
  #     07-16-04_XXX_XXXX_126w_227h.gif 

  # This script relies upon ImageMagick and Ghostscript being installed,
  #  please reference the wonderful http://www.imagemagick.org/ website,
  #  as such it requires these to be added into the PATH and LD_LIBRARY_PATH

  # Set the PATH
  putenv("PATH=" . $_SERVER['PATH'] . ":/usr/local/bin");
  # Set the LD_LIBRARY_PATH
  #  Must put the library path in for ImageMagic/Ghostscript
  putenv("LD_LIBRARY_PATH=" . $_SERVER['LD_LIBRARY_PATH'] . ":/usr/local/lib");

  # Get the first argument
  #   die unless argument was supplied
  #   EXAMPLE INPUT FILENAME:
  #     /PDF/08-25-04_XXX_XXXX_XX_XXX_1_1.pdf
  if (array_key_exists('argv', $_SERVER) && array_key_exists(1,$_SERVER['argv'])) {
    $filename = $_SERVER['argv'][1];
  } else {
    die("Must supply atleast one file via command linen");
  }

  # Globalish variables
  # 
  #  $filecomponents = an array of each part of the base filename
  $filecomponents = array();

  # Make a new thumbnails element for each desired size
  $thumbnails[] = array(
    "width" => 126,
    "height" => 227
  );
  $thumbnails[] = array(
    "width" => 240,
    "height" => 433
  );
  $thumbnails[] = array(
    "width" => 74,
    "height" => 131
  );

  # Setup FTP Connections
  $ftpconfig[] = array(
    "host"        => "host1.foo.bar",
    "user"        => "ftpuser",
    "password"    => "ftppass",
    "path"        => "/any/place/you/like",
    "retries"     => 5,
    "retry_delay" => 10,
  );  
  $ftpconfig[] = array(
    "host"        => "host2.foo.bar",
    "user"        => "ftpuser",
    "password"    => "ftppass",
    "path"        => "/any/other/place/you/like",
    "retries"     => 5,
    "retry_delay" => 10,
  );  
  $ftpconfig[] = array(
    "host"        => "host3.foo.bar",
    "user"        => "ftpuser",
    "password"    => "ftppass",
    "path"        => "/even/an/offsite/backup/location",
    "pasv"        => true,
    "retries"     => 5,
    "retry_delay" => 10,
  );  

  ###
  # Begin Functions

  # Generate the new thumbnail name
  function new_thumb_name($filename,$width,$height) {

    # Get just the filename, cut off the extension
    $base = basename($filename,".pdf");
    $filecomponents = explode("_",$base);

    # Generate the file name using the agreed upon standard
    $newfilename = sprintf("%s_%s_%s_%sw_%sh.gif",$filecomponents[0],$filecomponents[1],$filecomponents[2],$width,$height);

    # Return the filename
    return $newfilename;
  }

  # Generate the ftp destination name
  function send_via_ftp(&$files,&$ftpconfig) {
    foreach ($ftpconfig as $ftp) {
      # Reset the loop counter to 1
      $i = 0;
 
      # Do the loop x number of times
      while (++$i <= $ftp['retries']) {
        # set up basic connection
        $conn_id = ftp_connect(strval($ftp['host']));

        # If we successfully connected...
        if ($conn_id) {
          # login with username and password
          $login_result = ftp_login($conn_id, $ftp['user'], $ftp['password']);

          # Needs PASV?
          #  If PASV is set in the ftpconfig block use it.
          if (array_key_exists('pasv',$ftp) && $ftp['pasv']) {
            ftp_pasv($conn_id,true);
          }
        }

        # check connection
        if ((!$conn_id) || (!$login_result)) {
          fwrite(STDERR,"FTP connection has failed! Attempt #$i of " . $ftp['retries'] . "n");
          fwrite(STDERR,"Attempted to connect to " . $ftp['host'] . " for user " . $ftp['user'] . "n");
          if ($conn_id) {ftp_close($conn_id);}
          sleep($ftp['retry_delay']);
          continue;
        } else {
          foreach ($files as $file) {
            # upload the file
            $upload = ftp_put($conn_id, basename($file), $file, FTP_BINARY);
  
            # check upload status
            if (!$upload) {
               fwrite(STDERR,"FTP upload of $file to " . $ftp['host'] . " has failed!n");
               reset($files);
               ftp_close($conn_id);
               sleep($ftp['retry_delay']);
               continue;
            }
          }
          reset($files);
        } 
        # close the FTP stream
        ftp_close($conn_id); 
        break;
      }
    }
  }
  # End Functions
  ### 

  ### 
  # Begin Main Code
  foreach ($thumbnails as $thumbnailarray) {
    $destinations = array();
    $width = $thumbnailarray['width'];
    $height = $thumbnailarray['height'];

    $newfilename = new_thumb_name($filename,$width,$height);
    $newfile = "/PDF/Thumbnails/" . $newfilename;
    
    # Use ImageMagic+Ghostscript to do the thumbnail generation 
    #  at desired height/width
    $error = `/usr/local/bin/convert -trim -thumbnail ${width}x${height} "$filename" $newfile`;
    $files[] = $newfile;
  }

  send_via_ftp(&$files,&$ftpconfig);
?>