生成条形码并保存图像文件

时间:2014-06-29 06:04:31

标签: php barcode

我正在生成一个条形码图像,但我无法将该文件保存在特定文件夹中。我只是想生成图像并将该图像保存到文件夹而不显示在文件夹中。 我的代码下面。

类文件:barcode.php

<?php
    class barcode {

        function __construct() {

        }

        public function generateBarcode($text = '', $size = '', $orientation = '', $code_type = '', $filepath) {
            $text = (isset($text) ? $text : "0");
            $size = (isset($size) ? $size : "20");
            $orientation = (isset($orientation) ? $orientation : "horizontal");
            $code_type = (isset($code_type) ? $code_type : "code128");
            $code_string = "";

            // Translate the $text into barcode the correct $code_type
            if (strtolower($code_type) == "code128") {
                $chksum = 104;
                // Must not change order of array elements as the checksum depends on the array's key to validate final code
                $code_array = array(" " => "212222", "!" => "222122", "\"" => "222221", "#" => "121223", "$" => "121322", "%" => "131222", "&" => "122213", "'" => "122312", "(" => "132212", ")" => "221213", "*" => "221312", "+" => "231212", "," => "112232", "-" => "122132", "." => "122231", "/" => "113222", "0" => "123122", "1" => "123221", "2" => "223211", "3" => "221132", "4" => "221231", "5" => "213212", "6" => "223112", "7" => "312131", "8" => "311222", "9" => "321122", ":" => "321221", ";" => "312212", "<" => "322112", "=" => "322211", ">" => "212123", "?" => "212321", "@" => "232121", "A" => "111323", "B" => "131123", "C" => "131321", "D" => "112313", "E" => "132113", "F" => "132311", "G" => "211313", "H" => "231113", "I" => "231311", "J" => "112133", "K" => "112331", "L" => "132131", "M" => "113123", "N" => "113321", "O" => "133121", "P" => "313121", "Q" => "211331", "R" => "231131", "S" => "213113", "T" => "213311", "U" => "213131", "V" => "311123", "W" => "311321", "X" => "331121", "Y" => "312113", "Z" => "312311", "[" => "332111", "\\" => "314111", "]" => "221411", "^" => "431111", "_" => "111224", "\`" => "111422", "a" => "121124", "b" => "121421", "c" => "141122", "d" => "141221", "e" => "112214", "f" => "112412", "g" => "122114", "h" => "122411", "i" => "142112", "j" => "142211", "k" => "241211", "l" => "221114", "m" => "413111", "n" => "241112", "o" => "134111", "p" => "111242", "q" => "121142", "r" => "121241", "s" => "114212", "t" => "124112", "u" => "124211", "v" => "411212", "w" => "421112", "x" => "421211", "y" => "212141", "z" => "214121", "{" => "412121", "|" => "111143", "}" => "111341", "~" => "131141", "DEL" => "114113", "FNC 3" => "114311", "FNC 2" => "411113", "SHIFT" => "411311", "CODE C" => "113141", "FNC 4" => "114131", "CODE A" => "311141", "FNC 1" => "411131", "Start A" => "211412", "Start B" => "211214", "Start C" => "211232", "Stop" => "2331112");
                $code_keys = array_keys($code_array);
                $code_values = array_flip($code_keys);
                for ($X = 1; $X <= strlen($text); $X++) {
                    $activeKey = substr($text, ($X - 1), 1);
                    $code_string .= $code_array[$activeKey];
                    $chksum = ($chksum + ($code_values[$activeKey] * $X));
                }
                $code_string .= $code_array[$code_keys[($chksum - (intval($chksum / 103) * 103))]];

                $code_string = "211214" . $code_string . "2331112";
            } elseif (strtolower($code_type) == "code39") {
                $code_array = array("0" => "111221211", "1" => "211211112", "2" => "112211112", "3" => "212211111", "4" => "111221112", "5" => "211221111", "6" => "112221111", "7" => "111211212", "8" => "211211211", "9" => "112211211", "A" => "211112112", "B" => "112112112", "C" => "212112111", "D" => "111122112", "E" => "211122111", "F" => "112122111", "G" => "111112212", "H" => "211112211", "I" => "112112211", "J" => "111122211", "K" => "211111122", "L" => "112111122", "M" => "212111121", "N" => "111121122", "O" => "211121121", "P" => "112121121", "Q" => "111111222", "R" => "211111221", "S" => "112111221", "T" => "111121221", "U" => "221111112", "V" => "122111112", "W" => "222111111", "X" => "121121112", "Y" => "221121111", "Z" => "122121111", "-" => "121111212", "." => "221111211", " " => "122111211", "$" => "121212111", "/" => "121211121", "+" => "121112121", "%" => "111212121", "*" => "121121211");

                // Convert to uppercase
                $upper_text = strtoupper($text);

                for ($X = 1; $X <= strlen($upper_text); $X++) {
                    $code_string .= $code_array[substr($upper_text, ($X - 1), 1)] . "1";
                }

                $code_string = "1211212111" . $code_string . "121121211";
            } elseif (strtolower($code_type) == "code25") {
                $code_array1 = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0");
                $code_array2 = array("3-1-1-1-3", "1-3-1-1-3", "3-3-1-1-1", "1-1-3-1-3", "3-1-3-1-1", "1-3-3-1-1", "1-1-1-3-3", "3-1-1-3-1", "1-3-1-3-1", "1-1-3-3-1");

                for ($X = 1; $X <= strlen($text); $X++) {
                    for ($Y = 0; $Y < count($code_array1); $Y++) {
                        if (substr($text, ($X - 1), 1) == $code_array1[$Y])
                            $temp[$X] = $code_array2[$Y];
                    }
                }

                for ($X = 1; $X <= strlen($text); $X+=2) {
                    if (isset($temp[$X]) && isset($temp[($X + 1)])) {
                        $temp1 = explode("-", $temp[$X]);
                        $temp2 = explode("-", $temp[($X + 1)]);
                        for ($Y = 0; $Y < count($temp1); $Y++)
                            $code_string .= $temp1[$Y] . $temp2[$Y];
                    }
                }

                $code_string = "1111" . $code_string . "311";
            } elseif (strtolower($code_type) == "codabar") {
                $code_array1 = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "$", ":", "/", ".", "+", "A", "B", "C", "D");
                $code_array2 = array("1111221", "1112112", "2211111", "1121121", "2111121", "1211112", "1211211", "1221111", "2112111", "1111122", "1112211", "1122111", "2111212", "2121112", "2121211", "1121212", "1122121", "1212112", "1112122", "1112221");

                // Convert to uppercase
                $upper_text = strtoupper($text);

                for ($X = 1; $X <= strlen($upper_text); $X++) {
                    for ($Y = 0; $Y < count($code_array1); $Y++) {
                        if (substr($upper_text, ($X - 1), 1) == $code_array1[$Y])
                            $code_string .= $code_array2[$Y] . "1";
                    }
                }
                $code_string = "11221211" . $code_string . "1122121";
            }

            // Pad the edges of the barcode
            $code_length = 20;
            for ($i = 1; $i <= strlen($code_string); $i++)
                $code_length = $code_length + (integer) (substr($code_string, ($i - 1), 1));

            if (strtolower($orientation) == "horizontal") {
                $img_width = $code_length;
                $img_height = $size;
            } else {
                $img_width = $size;
                $img_height = $code_length;
            }

            $image = imagecreate($img_width, $img_height);
            $black = imagecolorallocate($image, 0, 0, 0);
            $white = imagecolorallocate($image, 255, 255, 255);

            imagefill($image, 0, 0, $white);

            $location = 10;
            for ($position = 1; $position <= strlen($code_string); $position++) {
                $cur_size = $location + ( substr($code_string, ($position - 1), 1) );
                if (strtolower($orientation) == "horizontal")
                    imagefilledrectangle($image, $location, 0, $cur_size, $img_height, ($position % 2 == 0 ? $white : $black));
                else
                    imagefilledrectangle($image, 0, $location, $img_width, $cur_size, ($position % 2 == 0 ? $white : $black));
                $location = $cur_size;
            }

            // Draw barcode to the screen
            header('Content-type: image/png');
            imagepng($image,'one.png');
            imagedestroy($image);
        }

    }
?>

被叫方法:

    <?php
    include('barcode.php');
    $barObj = new barcode();
    $barObj->generateBarcode('Praveen','vertical','40','C128','one.png');
?>

我收到类似&#34的错误;图片“http://example.com/index.php”无法显示,因为它包含错误。&#34; 请提前帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

如果要将图像保存到文件,则不需要header('Content-type: image/png');。此外,在您的脚本中放置该行会将内容类型设置为PNG图像,如果您要在页面中编写其他内容,则会导致查看用户整个页面的问题。

顺便说一句,正如我个人的经验,包括与GD合作的文件不是一个好方法。尝试使用CURL生成图像。

答案 1 :(得分:0)

正如@amsonline所提到的那样,那里的标题行使得查看正在发生的事情变得棘手。以下是我发现的有用的技巧。当您准备好对浏览器进行写入操作时,您可以将imagepng调用更改为imagepng($image),然后直接写入png数据。

当你得到一个像这个脚本的破损图像将要在浏览器中显示时,如果你查看你回来的数据,它通常会非常有用。在chrome中,您可以使用开发人员工具轻松完成此操作。但是,我发现在某些情况下使用linux更容易。

所以,在这种情况下,我打赌,不会有一堆垃圾回显到我的屏幕上;在这种情况下,这是一个很好的赌注。

$ curl http://testserver.example.com/barcode.php

Warning: imagecreate() expects parameter 1 to be long, string given in /var/www/lighttpd/barcode.php on line 91

Warning: imagecolorallocate() expects parameter 1 to be resource, null given in /var/www/lighttpd/barcode.php on line 92

Warning: imagecolorallocate() expects parameter 1 to be resource, null given in /var/www/lighttpd/barcode.php on line 93

Warning: imagefill() expects parameter 1 to be resource, null given in /var/www/lighttpd/barcode.php on line 95

Warning: imagepng() expects parameter 1 to be resource, null given in /var/www/lighttpd/barcode.php on line 109

Warning: imagedestroy() expects parameter 1 to be resource, null given in /var/www/lighttpd/barcode.php on line 110

现在我们可以看到一个错误列表,是时候逐个完成它们并从那里开始工作。排序其中一些的最简单的方法是回声和其他什么,第一个错误真的告诉你&#34;我们没有得到我们期望的&#34;。我将完整的调试过程作为练习。

一旦你认为它可能会输出一个图像,你总是可以通过xxd管理curl调用,以防止乱码你的终端。一旦你开始看到二进制文件,浏览器将成为你最喜欢的调试工具。