<?
/*
    labels.php  Avery Label generation demo
    Copyright (C) 2003 by Jonathan Snell <jsnell at e-normous.com>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

/*
labels.php v0.99
Description: 
This is a small php script designed to create pdf files which conform to the avery specifications for labels. 
It uses the open source pdf4php in order to simplify licensing.  

To use:
Get and ungzip pdf4php from here: http://www.gnuvox.com/pdf4php/
Place pdf4php into the location you plan on using this label program from or adjust your php include path.
Pick a label style and set the $use_style variable to it (5095,5395,5895,5267,5164,5163, 5663,5162, 5262, 5662,5161, 5261, 5160,5260,5660 supported) 
Fill the $address_text array with your addresses, separate each line with a \n
This script will call pdf4php to output directly to the browser.  

My source for the label formatting information was the avery website.  There is a good chance that the labels you wish to use will not have been tested.  You may need to adjust the code to produce proper alignment with your labels.  Please let me know if this is needed and what you did to correct it, so I can incorporate the fixes into future versions.

Todo:
Adapt this for envelopes.
Modify code interface to make this easier to incorporate.

*/

// include pdf4php
include('pdf4php.php');


$use_style 5160;

// create some dummy addresses for example
$address_text = array();
for(
$x 0$x 35$x++)
{
  
$address_text[] = "Address number $x\n1900 E. Superior St.\nChicago, IL  60622";
}

// code follows

$label_info = array(
            array(
              
'style' => array(5095,5395,5895),
              
'label_width' => '3 3/8"',
              
'label_height' => '2 1/3"',
              
'labels_across' => 2,
              
'labels_per_column' => 4,
              
'top_margin' => '7/12"',
              
'bottom_margin' => '7/12"'),
            array(
              
'style' => array(5267),
              
'label_width' => '1 3/4"',
               
'label_height' => '1/2"',
               
'labels_across' => 4,
               
'labels_per_column' => 20,
               
'top_margin' => '7/12"',
              
'bottom_margin' => '7/12"'),

            array(
              
'style' => array(5266),
              
'label_width' => '3 7/16"',
              
'label_height' => '2/3"',
              
'labels_across' => 2,
              
'labels_per_column' => 16,
              
'top_margin' => '1/2"',
              
'bottom_margin' => '1/2"'),
            array(
              
'style' => array(5164),
              
'label_width' => '4"',
              
'label_height' => '3 1/3"',
              
'labels_across' => 2,
              
'labels_per_column' => 3,
              
'top_margin' => '1/2"',
              
'bottom_margin' => '1/2"'),
            array(
               
'style' => array(51635663),
               
'label_width' => '4"',
               
'label_height' => '2"',
               
'labels_across' => 2,
               
'labels_per_column' => 5
               
'top_margin' => '1/2"',
               
'bottom_margin' => '1/2"'),
            array(
              
'style' => array(516252625662),
              
'label_width' => '4"',
              
'label_height' => '1 1/3"',
              
'labels_across' => 2,
              
'labels_per_column' => 7,
              
'top_margin' => '5/6"',
              
'bottom_margin' => '5/6"'),
            array(
              
'style' => array(51615261),
              
'label_width' => '4"',
              
'label_height' => '1"',
              
'labels_across' => 2,
              
'labels_per_column' => 10,
              
'top_margin' => '1/2"',
              
'bottom_margin' => '1/2"'),
            array(
               
'style' => array(5160,5260,5660),
               
'label_width' => '2 5/8"',
              
'label_height' => '1"',
              
'labels_across' => 3,
               
'labels_per_column' => 10
               
'top_margin' => '1/2"',
               
'bottom_margin' => '1/2"')         
            );
            


$style_info false;
foreach(
$label_info as $one_type)
{
  if (
in_array($use_style$one_type['style']))
    {
      
$style_info $one_type;     
    }
}

if (
$style_info === false)
{
  die(
"Couldn't find a match");
}

function 
frac_to_dec($frac)
{
  
$base_num 0;
  
$frac str_replace('"'''$frac);

  
$frac_part '';
  if (
strstr($frac' '))
    {
      list(
$base_num$frac_part) = explode(' ',$frac);
    }
  else
    
$frac_part $frac;


  list(
$t,$b) = explode('/'$frac_part);
  if (!(
$b))
    
$b 1;

  return 
$base_num + ($t/$b);
}

// dereference and convert to save some typing
$label_width frac_to_dec($style_info['label_width']);
$label_height frac_to_dec($style_info['label_height']);
$labels_across $style_info['labels_across'];
$labels_per_column $style_info['labels_per_column'];
$top_margin frac_to_dec($style_info['top_margin']);
$bottom_margin frac_to_dec($style_info['bottom_margin']);

$side_margin 0.25// can't find this anywhere.  just assume?

$page_width 8.5;
$page_height 11;

$pdf= new PDFClass(0);  // Compress
$pdf->startPage(8.5 7211 72);  // 8.5x11 inches
$pdf->SetFont(48'Helvetica');
$pdf->SetStrokeColor(1,0,0);
$pdf->SetFont(15'Helvetica');

// now enumerate
$working_width $page_width - ($side_margin 2);
$working_height $page_height $top_margin $bottom_margin;
$cell_h_width $working_width $labels_across;
$cell_v_width $working_height $labels_per_column;

$font_height $pdf->font_size;

$page_ctr 0;
foreach(
$address_text as $one_address)
{
// determine x center pos
  
$x $page_ctr $labels_across;
  
$y floor($page_ctr /  $labels_across);
  if (
$y $labels_per_column
    {
      
// time for the next page
      
$page_ctr =0;
      
$x 0;
      
$y 0;

      
$pdf->endPage();
      
$pdf->startPage(8.5 7211 72);  // 8.5x11 inches
    
}

  
$center_x $x*$cell_h_width + ($cell_h_width 0.5);
  
$start_x $center_x $label_width 2;
  
  
$center_y $y*$cell_v_width + ($cell_v_width 0.5);
  
$start_y $center_y $label_height 2;

  
$text_lines explode("\n"$one_address);
  for(
$tx 0$tx count($text_lines); $tx++)
    {      
      
$pdf->DrawTextAt( ($start_x+$side_margin) * 72, ($start_y+$top_margin) * 72+($font_height*$tx), $text_lines[$tx]);
    }
  
$page_ctr++;
}
$pdf->endPage();
$pdf->end();
?>