首页 > 解决方案 > 如何使用 fpdf 生成生成代码

问题描述

此代码是由其他人制作的,但我想出于自己的目的对其进行更改。该代码给出了 13 个数字,但只需要 ID 的数字(来自数据库)。

我需要的示例:

我真正的问题是如何从 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));
}
}

标签: phpmysqlpdf-generationfpdf

解决方案


EAN-13 条形码格式固有地编码 13 位数字。如果你把它弄乱了,所以它编码的数字更少,条形码将不再是 EAN-13,许多条形码阅读器将无法识别它。

您在非标准应用程序中的代码上使用前导零。我说非标准是因为 EAN-13 有一个前缀注册表。无论您使用什么来读取条形码,都需要删除前导零。

如果您必须避免条形码中的前导零,您可能需要切换到另一种更灵活的条形码格式,Code 39、Codabar 甚至 QR 码。或者您可以选择 EAN-8 或 EAN-5。这些都可以查。


推荐阅读