<?php
// ===================================================
// Example on howto output USPS compliant barcode 
// (variant of EAN-128) using JpGraph
// ===================================================

include "../jpgraph.php";
include 
"../jpgraph_canvas.php";
include 
"../jpgraph_barcode.php";

// The Full barcode standard is described in the official specs
// released by USPS and available from
//
// http://www.usps.com/cpim/ftp/pubs/pub91/91c4.html#508hdr1
// 
class USPS_Confirmation {
    function 
USPS_Confirmation() {
    }

    
// Private utility function
    
function _USPS_chkd($aData) {
    
$n strlen($aData);
    
    
// Add all even numbers starting from position 1 from the end
    
$et ;
    for( 
$i=1$i <= $n$i+=) {
        
$d intval(substr($aData,-$i,1));
        
$et += $d;
    }

    
// Add all odd numbers starting from position 2 from the end
    
$ot ;
    for( 
$i=2$i <= $n$i+=) {
        
$d intval(substr($aData,-$i,1));
        
$ot += $d;
    }
    
$tot 3*$et $ot;
    
$chkdigit = (10 - ($tot 10))%10;;
    return 
$chkdigit;
    }

    
// Get type 1 of confirmation code (with ZIP)
    
function GetPICwithZIP($aZIP,$aServiceType,$aDUNS,$aSeqNbr) {
    
// The data start with AI=420 which means 
    // "Ship to/Deliver To Postal Code (within single authority)
    // Convert to USPS format with AI=420 and extension starting with AI=91
    
$data '420'$aZIP '91' $aServiceType $aDUNS $aSeqNbr;
    
// Only calculate the checkdigit from the AI=91 and forward
    // and do not include the ~1 (FUNC1) in the calculation
    
$cd $this->_USPS_chkd(substr($data,8));
    
$data '420'$aZIP '~191' $aServiceType $aDUNS $aSeqNbr;
    return 
$data $cd;
    }

    
// Get type 2 of confirmation code (without ZIP)
    
function GetPIC($aServiceType,$aDUNS,$aSeqNbr) {
    
// Convert to USPS format with AI=91
    
$data '91' $aServiceType $aDUNS $aSeqNbr;
    
$cd $this->_USPS_chkd($data);
    return 
$data $cd;
    }

}

// Format the USPS data
$usps = new USPS_Confirmation();
$zip     '92663';
$service '21';
$DUNS    '805213907';
$seqnr   '04508735';
$data $usps->GetPICwithZIP($zip,$service,$DUNS,$seqnr);

// Now when we have formatted the data we can create the 
// barcode using the plain EAN-128 encoding
$encoder BarcodeFactory::Create(ENCODING_EAN128);
$e BackendFactory::Create(BACKEND_IMAGE,$encoder);
$e->SetModuleWidth(2);

// The following line assumes that the installation of the library
// is setup to use TTF fonts. If you  do not have these fonts installed 
// just comment out the followin line and the built-in bitmapped fonts
// will be used.
$e->SetFont(FF_ARIAL,FS_NORMAL,14);

// Finally send the image back to the browser
$e->Stroke($data);

?>