php - 如何使用 fpdf 生成生成代码
问题描述
此代码是由其他人制作的,但我想出于自己的目的对其进行更改。该代码给出了 13 个数字,但只需要 ID 的数字(来自数据库)。
我需要的示例:
- 编号 = 908
- EAN13 = 000000908
我真正的问题是如何从 BARS 中删除 0000,然后在扫描 SCANNER 后读取正确的 ID。这是供学习的家伙!
class PDF_BARCODE extends FPDF
{
function EAN13($x, $y, $barcode, $h=16, $w=.35, $fSize=9)
{
$this->Barcode($x,$y,$barcode,$h,$w,$fSize,13);
}
function UPC_A($x, $y, $barcode, $h=16, $w=.35, $fSize=9)
{
$this->Barcode($x,$y,$barcode,$h,$w,$fSize,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, $fSize, $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','',$fSize);
$this->Text($x,$y+$h+11/$this->k,substr($barcode,-$len));
}
}
解决方案
EAN-13 条形码格式固有地编码 13 位数字。如果你把它弄乱了,所以它编码的数字更少,条形码将不再是 EAN-13,许多条形码阅读器将无法识别它。
您在非标准应用程序中的代码上使用前导零。我说非标准是因为 EAN-13 有一个前缀注册表。无论您使用什么来读取条形码,都需要删除前导零。
如果您必须避免条形码中的前导零,您可能需要切换到另一种更灵活的条形码格式,Code 39、Codabar 甚至 QR 码。或者您可以选择 EAN-8 或 EAN-5。这些都可以查。
推荐阅读
- javascript - 为什么数字记录为 NaN?
- android - 未找到 Manifest.permission.READ_PROFILE
- ethereum - 如何修复“未捕获(承诺中)错误:参数数量无效”
- angular - 有没有办法在 Angular 中选择与自定义类型相反的类型?
- angular - 如何在订阅和 ngOnInit 方法中循环遍历数组?
- javascript - 如何在 Phaser 3 中正确调整图像大小以保持质量
- tcp - 如何正确克隆 struct addrinfo
- javascript - 通过类名自动链接多个元素
- java - 有没有办法获取 android 设备的方向并将其映射到垂直平面中的坐标?
- python - 为什么 replace() 在我的 Python 函数中不起作用?在一个班轮中