Add-On EAN-13 barcodes
Informations
Author:OlivierLicense: FPDF
Description
This script implements EAN-13 and UPC-A barcodes (the second being a particular case of the first one). Bars are drawn directly in the PDF (no image is generated).EAN13(float x, float y, string barcode [, float h [, float w]])
x
: abscissa of barcode.y
: ordinate of barcode.barcode
: value of barcode.h
: height of barcode. Default value: 16.w
: width of a bar. Default value: 0.35.UPC_A(float x, float y, string barcode [, float h [, float w]])
Same parameters.
An EAN-13 barcode is made up of 13 digits, UPC-A of 12 (leading zeroes are added if necessary). The last digit is a check digit; if it's not supplied, it will be automatically computed.
Source
<?php
require('fpdf.php');
class PDF_EAN13 extends FPDF
{
function EAN13($x, $y, $barcode, $h=16, $w=.35)
{
$this->Barcode($x, $y, $barcode, $h, $w, 13);
}
function UPC_A($x, $y, $barcode, $h=16, $w=.35)
{
$this->Barcode($x, $y, $barcode, $h, $w, 12);
}
function GetCheckDigit($barcode)
{
//Compute the check digit
$sum=0;
for($i=1;$i<=11;$i+=2)
$sum+=3*$barcode[$i];
for($i=0;$i<=10;$i+=2)
$sum+=$barcode[$i];
$r=$sum%10;
if($r>0)
$r=10-$r;
return $r;
}
function TestCheckDigit($barcode)
{
//Test validity of check digit
$sum=0;
for($i=1;$i<=11;$i+=2)
$sum+=3*$barcode[$i];
for($i=0;$i<=10;$i+=2)
$sum+=$barcode[$i];
return ($sum+$barcode[12])%10==0;
}
function Barcode($x, $y, $barcode, $h, $w, $len)
{
//Padding
$barcode=str_pad($barcode, $len-1, '0', STR_PAD_LEFT);
if($len==12)
$barcode='0'.$barcode;
//Add or control the check digit
if(strlen($barcode)==12)
$barcode.=$this->GetCheckDigit($barcode);
elseif(!$this->TestCheckDigit($barcode))
$this->Error('Incorrect check digit');
//Convert digits to bars
$codes=array(
'A'=>array(
'0'=>'0001101', '1'=>'0011001', '2'=>'0010011', '3'=>'0111101', '4'=>'0100011',
'5'=>'0110001', '6'=>'0101111', '7'=>'0111011', '8'=>'0110111', '9'=>'0001011'),
'B'=>array(
'0'=>'0100111', '1'=>'0110011', '2'=>'0011011', '3'=>'0100001', '4'=>'0011101',
'5'=>'0111001', '6'=>'0000101', '7'=>'0010001', '8'=>'0001001', '9'=>'0010111'),
'C'=>array(
'0'=>'1110010', '1'=>'1100110', '2'=>'1101100', '3'=>'1000010', '4'=>'1011100',
'5'=>'1001110', '6'=>'1010000', '7'=>'1000100', '8'=>'1001000', '9'=>'1110100')
);
$parities=array(
'0'=>array('A', 'A', 'A', 'A', 'A', 'A'),
'1'=>array('A', 'A', 'B', 'A', 'B', 'B'),
'2'=>array('A', 'A', 'B', 'B', 'A', 'B'),
'3'=>array('A', 'A', 'B', 'B', 'B', 'A'),
'4'=>array('A', 'B', 'A', 'A', 'B', 'B'),
'5'=>array('A', 'B', 'B', 'A', 'A', 'B'),
'6'=>array('A', 'B', 'B', 'B', 'A', 'A'),
'7'=>array('A', 'B', 'A', 'B', 'A', 'B'),
'8'=>array('A', 'B', 'A', 'B', 'B', 'A'),
'9'=>array('A', 'B', 'B', 'A', 'B', 'A')
);
$code='101';
$p=$parities[$barcode[0]];
for($i=1;$i<=6;$i++)
$code.=$codes[$p[$i-1]][$barcode[$i]];
$code.='01010';
for($i=7;$i<=12;$i++)
$code.=$codes['C'][$barcode[$i]];
$code.='101';
//Draw bars
for($i=0;$i<strlen($code);$i++)
{
if($code[$i]=='1')
$this->Rect($x+$i*$w, $y, $w, $h, 'F');
}
//Print text uder barcode
$this->SetFont('Arial', '', 12);
$this->Text($x, $y+$h+11/$this->k, substr($barcode, -$len));
}
}
?>
Example
<?php
require('ean13.php');
$pdf=new PDF_EAN13();
$pdf->AddPage();
$pdf->EAN13(80, 40, '123456789012');
$pdf->Output();
?>