PHP Barcode Image Generator

Thomas_Jung

Erfahrenes Mitglied
Hallo
Ich habe dieses Script im Netz gefunden.
Dieses Script erzeugt einen Barcode genau wie ich ihn brauche.
Nun möchte ich über dem Barcode einen Schriftzug ($barcodetext) anbringen kann mir jemand dabei helfen?

Gruß Thomas

index.php
PHP:
<html>
<head>
  <title></title>
</head>
<body>
<FORM METHOD=GET ACTION="barcode.php">
<INPUT TYPE="text" SIZE="16" NAME="barcodetext">
<INPUT TYPE="text" SIZE="16" NAME="barcode">
<INPUT TYPE="hidden" NAME="width" VALUE=320>
<INPUT TYPE="hidden" NAME="height" VALUE=200>
<INPUT TYPE="submit" VALUE="Generate Barcode">
</FORM>
</body>
</html>

barcode.php

PHP:
/*===========================================================================*/
/*      PHP Barcode Image Generator v1.0 [9/28/2000]
        Copyright (C)2000 by Charles J. Scheffold - cs@sid6581.net


		---
		UPDATE 5/10/2005 by C.Scheffold
		Changed FontHeight to -2 if no text is to be displayed (this eliminates
		the whitespace at the bottom of the image)
		---
		UPDATE 03/12/2005 by C.Scheffold
		Added '-' character to translation table
        ---
        UPDATE 09/21/2002 by Laurent NAVARRO - ln@altidev.com - http://www.altidev.com
        Updated to be compatible with register_globals = off and on
        ---
        UPDATE 4/6/2001 - Important Note! This script was written with the assumption
        that "register_globals = On" is defined in your PHP.INI file! It will not
        work as-is      and as described unless this is set. My PHP came with this
        enabled by default, but apparently many people have turned it off. Either
        turn it on or modify the startup code to pull the CGI variables in the old
        fashioned way (from the HTTP* arrays). If you just want to use the functions
        and pass the variables yourself, well then go on with your bad self.
        ---

        This code is hereby released into the public domain.
        Use it, abuse it, just don't get caught using it for something stupid.


        The only barcode type currently supported is Code 3 of 9. Don't ask about
        adding support for others! This is a script I wrote for my own use. I do
        plan to add more types as time permits but currently I only require
        Code 3 of 9 for my purposes. Just about every scanner on the market today
        can read it.


        PARAMETERS:
        -----------
        $barcode        = [required] The barcode you want to generate


        $type           = (default=0) It's 0 for Code 3 of 9 (the only one supported)

        $width          = (default=160) Width of image in pixels. The image MUST be wide
                                  enough to handle the length of the given value. The default
                                  value will probably be able to display about 6 digits. If you
                                  get an error message, make it wider!


        $height         = (default=80) Height of image in pixels

        $format         = (default=jpeg) Can be "jpeg", "png", or "gif"

        $quality        = (default=100) For JPEG only: ranges from 0-100


        $text           = (default=1) 0 to disable text below barcode, >=1 to enable


        NOTE: You must have GD-1.8 or higher compiled into PHP
        in order to use PNG and JPEG. GIF images only work with
        GD-1.5 and lower. (http://www.boutell.com)


        ANOTHER NOTE: If you actually intend to print the barcodes
        and scan them with a scanner, I highly recommend choosing
        JPEG with a quality of 100. Most browsers can't seem to print
        a PNG without mangling it beyond recognition.


        USAGE EXAMPLES FOR ANY PLAIN OLD HTML DOCUMENT:
        -----------------------------------------------


        <IMG SRC="barcode.php?barcode=HELLO&quality=75">


        <IMG SRC="barcode.php?barcode=123456&width=320&height=200">


*/
/*=============================================================================*/


//-----------------------------------------------------------------------------
// Startup code
//-----------------------------------------------------------------------------


if(isset($_GET["text"])) $text=$_GET["text"];
if(isset($_GET["format"])) $format=$_GET["format"];
if(isset($_GET["quality"])) $quality=$_GET["quality"];
if(isset($_GET["width"])) $width=$_GET["width"];
if(isset($_GET["height"])) $height=$_GET["height"];
if(isset($_GET["type"])) $type=$_GET["type"];
if(isset($_GET["barcode"])) $barcode=$_GET["barcode"];
if(isset($_GET["barcodetext"])) $barcodetext=$_GET["barcodetext"];






if (!isset ($text)) $text = 1;
if (!isset ($type)) $type = 1;
if (empty ($quality)) $quality = 100;
if (empty ($width)) $width = 160;
if (empty ($height)) $height = 80;
if (!empty ($format)) $format = strtoupper ($format);
        else $format="JPEG";


switch ($type)
{
        default:
                $type = 1;
        case 1:
                Barcode39 ($barcode, $width, $height, $quality, $format, $text);
                break;
}


//-----------------------------------------------------------------------------
// Generate a Code 3 of 9 barcode
//-----------------------------------------------------------------------------
function Barcode39 ($barcode, $width, $height, $quality, $format, $text)
{
        switch ($format)
        {
                default:
                        $format = "JPEG";
                case "JPEG":
                        header ("Content-type: image/jpeg");
                       //   $imageshow = "weilhammer.jpg";
//  echo  "<img src='".$imageshow."' border=0>";
                        break;
                case "PNG":
                        header ("Content-type: image/png");
                        break;
                case "GIF":
                        header ("Content-type: image/gif");
                        break;
        }


        $im = ImageCreate ($width, $height)
    or die ("Cannot Initialize new GD image stream");
        $White = ImageColorAllocate ($im, 255, 255, 255);
        $Black = ImageColorAllocate ($im, 0, 0, 0);
        //ImageColorTransparent ($im, $White);
        ImageInterLace ($im, 1);



        $NarrowRatio = 20;
        $WideRatio = 55;
        $QuietRatio = 35;


        $nChars = (strlen($barcode)+2) * ((6 * $NarrowRatio) + (3 * $WideRatio) + ($QuietRatio));
        $Pixels = $width / $nChars;
        $NarrowBar = (int)(20 * $Pixels);
        $WideBar = (int)(55 * $Pixels);
        $QuietBar = (int)(35 * $Pixels);


        $ActualWidth = (($NarrowBar * 6) + ($WideBar*3) + $QuietBar) * (strlen ($barcode)+2);

        if (($NarrowBar == 0) || ($NarrowBar == $WideBar) || ($NarrowBar == $QuietBar) || ($WideBar == 0) || ($WideBar == $QuietBar) || ($QuietBar == 0))
        {
                ImageString ($im, 1, 0, 0, "Image is too small!", $Black);
                OutputImage ($im, $format, $quality);
                exit;
        }

        $CurrentBarX = (int)(($width - $ActualWidth) / 2);
        $Color = $White;

        $BarcodeFull = "*".strtoupper ($barcode)."*";
        settype ($BarcodeFull, "string");

        $FontNum = 3;
        $FontHeight = ImageFontHeight ($FontNum);
        $FontWidth = ImageFontWidth ($FontNum);
        if ($text != 0)
        {
                $CenterLoc = (int)(($width-1) / 2) - (int)(($FontWidth * strlen($BarcodeFull)) / 2);
                ImageString ($im, $FontNum, $CenterLoc, $height-$FontHeight, "$BarcodeFull", $Black);
        }
		else
		{
			$FontHeight=-2;
		}


        for ($i=0; $i<strlen($BarcodeFull); $i++)
        {
                $StripeCode = Code39 ($BarcodeFull[$i]);


                for ($n=0; $n < 9; $n++)
                {
                        if ($Color == $White) $Color = $Black;
                        else $Color = $White;


                        switch ($StripeCode[$n])
                        {
                                case '0':
                                        ImageFilledRectangle ($im, $CurrentBarX, 0, $CurrentBarX+$NarrowBar, $height-1-$FontHeight-2, $Color);
                                        $CurrentBarX += $NarrowBar;
                                        break;


                                case '1':
                                        ImageFilledRectangle ($im, $CurrentBarX, 0, $CurrentBarX+$WideBar, $height-1-$FontHeight-2, $Color);
                                        $CurrentBarX += $WideBar;
                                        break;
                        }
                }


                $Color = $White;
                ImageFilledRectangle ($im, $CurrentBarX, 0, $CurrentBarX+$QuietBar, $height-1-$FontHeight-2, $Color);
                $CurrentBarX += $QuietBar;
        }


        OutputImage ($im, $format, $quality);
}


//-----------------------------------------------------------------------------
// Output an image to the browser
//-----------------------------------------------------------------------------
function OutputImage ($im, $format, $quality)
{
        switch ($format)
        {
                case "JPEG":
                        ImageJPEG ($im, "", $quality);
                        break;
                case "PNG":
                        ImagePNG ($im);

                       break;
                case "GIF":
                        ImageGIF ($im);
                        break;
        }
}


//-----------------------------------------------------------------------------
// Returns the Code 3 of 9 value for a given ASCII character
//-----------------------------------------------------------------------------
function Code39 ($Asc)
{
        switch ($Asc)
        {
                case ' ':
                        return "011000100";
                case '$':
                        return "010101000";
                case '%':
                        return "000101010";
                case '*':
                        return "010010100"; // * Start/Stop
                case '+':
                        return "010001010";
                case '|':
                        return "010000101";
                case '.':
                        return "110000100";
                case '/':
                        return "010100010";
				case '-':
						return "010000101";
                case '0':
                        return "000110100";
                case '1':
                        return "100100001";
                case '2':
                        return "001100001";
                case '3':
                        return "101100000";
                case '4':
                        return "000110001";
                case '5':
                        return "100110000";
                case '6':
                        return "001110000";
                case '7':
                        return "000100101";
                case '8':
                        return "100100100";
                case '9':
                        return "001100100";
                case 'A':
                        return "100001001";
                case 'B':
                        return "001001001";
                case 'C':
                        return "101001000";
                case 'D':
                        return "000011001";
                case 'E':
                        return "100011000";
                case 'F':
                        return "001011000";
                case 'G':
                        return "000001101";
                case 'H':
                        return "100001100";
                case 'I':
                        return "001001100";
                case 'J':
                        return "000011100";
                case 'K':
                        return "100000011";
                case 'L':
                        return "001000011";
                case 'M':
                        return "101000010";
                case 'N':
                        return "000010011";
                case 'O':
                        return "100010010";
                case 'P':
                        return "001010010";
                case 'Q':
                        return "000000111";
                case 'R':
                        return "100000110";
                case 'S':
                        return "001000110";
                case 'T':
                        return "000010110";
                case 'U':
                        return "110000001";
                case 'V':
                        return "011000001";
                case 'W':
                        return "111000000";
                case 'X':
                        return "010010001";
                case 'Y':
                        return "110010000";
                case 'Z':
                        return "011010000";
                default:
                        return "011000100";
        }
}
 
Zuletzt bearbeitet:

tobee

Erfahrenes Mitglied
Die einfachste Methode wäre einfach ein Div mit Hilfe von position:absolute, top, left über den Barcode zu positionieren.
 

RiNdErWaHn

Grünschnabel
PHP:
$BarcodeFull = "*".strtoupper ($barcode)."*";
        settype ($BarcodeFull, "string");

        $FontNum = 3;
        $FontHeight = ImageFontHeight ($FontNum);
        $FontWidth = ImageFontWidth ($FontNum);
        if ($text != 0)
        {
                $CenterLoc = (int)(($width-1) / 2) - (int)(($FontWidth * strlen($BarcodeFull)) / 2);
                ImageString ($im, $FontNum, $CenterLoc, $height-$FontHeight, "$BarcodeFull", $Black);
        }
        else
        {
            $FontHeight=-2;
        }

hier wird mit ImageString festgelegt, wo der BarcodeText auf dem Bild hingeschrieben wird.
Einfach mal mit der y-variablen (hier $height-$FontHeight) rumspielen ;-)
 

Thomas_Jung

Erfahrenes Mitglied
Hallo RiNdErWaHn
Ich möchte nicht den BarcodeText unten oder den Code verändern sondern einen zusätzlichen Text überden Barcode hinzufügen.

Gruß Thomas
 

RiNdErWaHn

Grünschnabel
Wenn es immer wieder derselbe Text ist
PHP:
ImageString ($im, $FontNum, $vonlinks, $vonoben, "Hier ist der Text", $Farbe);
einfach unter die if-else setzen
$vonlinks, $vonoben und $Farbe mußt du natürlich auch noch definieren

wenn sich der Text ändern soll, mußt du die Variable an die entsprechende Funktion einfach mit übergeben und einfügen.
 

megamerma

Grünschnabel
Hallo,
ich bin ziemlich neu und habe eine kleine Frage bzgl. dem Code oben, und zwar, wenn ich die Zeile

ImageString ($im, $FontNum, $vonlinks, $vonoben, "THier ist der Text", $Black);

unter die if-else Anweisung einfüge, dann wird mein Text mit den Streifen abgedeckt (es werden nur die ersten Buchstaben von links gezeigt).

welche Variable soll ich da ändern, damit ich mehr platz über den Streifen bekomme?

Danke für jede Hilfe!!