Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
/*
3
pBarcode39 - class to create barcodes (39B)
4
 
5
Version     : 2.1.4
6
Made by     : Jean-Damien POGOLOTTI
7
Last Update : 19/01/2014
8
 
9
This file can be distributed under the license you can find at :
10
 
11
http://www.pchart.net/license
12
 
13
You can find the whole class documentation on the pChart web site.
14
*/
15
/* pData class definition */
16
 
17
class pBarcode39
18
{
19
	var $Codes = [];
20
	var $Result;
21
	var $pChartObject;
22
	var $MOD43;
23
 
24
	/* Class creator */
25
	function __construct($BasePath = "", $EnableMOD43 = FALSE)
26
	{
27
		$this->MOD43 = $EnableMOD43;
28
 
29
		$FileHandle = fopen($BasePath . "data/39.db", "r");
30
		if (!$FileHandle) {
31
			die("Cannot find barcode database (" . $BasePath . "data/39.db).");
32
		}
33
 
34
		while (!feof($FileHandle)) {
35
			$Buffer = fgets($FileHandle, 4096);
36
			$Buffer = str_replace(chr(10), "", $Buffer);
37
			$Buffer = str_replace(chr(13), "", $Buffer);
38
			$Values = explode(";", $Buffer);
39
			$this->Codes[$Values[0]] = $Values[1];
40
		}
41
 
42
		fclose($FileHandle);
43
	}
44
 
45
	/* Return the projected size of a barcode */
46
	function getSize($TextString, array $Format = [])
47
	{
48
		$Angle = 0;
49
		$ShowLegend = FALSE;
50
		$LegendOffset = 5;
51
		$DrawArea = FALSE;
52
		$FontSize = 12;
53
		$Height = 30;
54
 
55
		/* Override defaults */
56
		extract($Format);
57
 
58
		$TextString = $this->encode39($TextString);
59
		$BarcodeLength = strlen($this->Result);
60
		$WOffset = ($DrawArea) ? 20 : 0;
61
		$HOffset = ($ShowLegend) ? $FontSize + $LegendOffset + $WOffset : 0;
62
 
63
		$X1 = cos($Angle * PI / 180) * ($WOffset + $BarcodeLength);
64
		$Y1 = sin($Angle * PI / 180) * ($WOffset + $BarcodeLength);
65
		$X2 = $X1 + cos(($Angle + 90) * PI / 180) * ($HOffset + $Height);
66
		$Y2 = $Y1 + sin(($Angle + 90) * PI / 180) * ($HOffset + $Height);
67
		$AreaWidth = max(abs($X1), abs($X2));
68
		$AreaHeight = max(abs($Y1), abs($Y2));
69
 
70
		return ["Width" => $AreaWidth,	"Height" => $AreaHeight];
71
	}
72
 
73
	/* Create the encoded string */
74
	function encode39($Value)
75
	{
76
		$this->Result = "100101101101" . "0";
77
		$TextString = "";
78
		for ($i = 1; $i <= strlen($Value); $i++) {
79
			$CharCode = ord($this->mid($Value, $i, 1));
80
			if ($CharCode >= 97 && $CharCode <= 122) {
81
				$CharCode = $CharCode - 32;
82
			}
83
 
84
			if (isset($this->Codes[chr($CharCode) ])) {
85
				$this->Result = $this->Result . $this->Codes[chr($CharCode) ] . "0";
86
				$TextString = $TextString . chr($CharCode);
87
			}
88
		}
89
 
90
		if ($this->MOD43) {
91
			$Checksum = $this->checksum($TextString);
92
			$this->Result = $this->Result . $this->Codes[$Checksum] . "0";
93
		}
94
 
95
		$this->Result = $this->Result . "100101101101";
96
		$TextString = "*" . $TextString . "*";
97
 
98
		return $TextString;
99
	}
100
 
101
	/* Create the encoded string */
102
	function draw($Object, $Value, $X, $Y, array $Format = [])
103
	{
104
		$this->pChartObject = $Object;
105
		$R = 0;
106
		$G = 0;
107
		$B = 0;
108
		$Alpha = 100;
109
		$Height = 30;
110
		$Angle = 0;
111
		$ShowLegend = FALSE;
112
		$LegendOffset = 5;
113
		$DrawArea = FALSE;
114
		$AreaR = isset($Format["AreaR"]) ? $Format["AreaR"] : 255;
115
		$AreaG = isset($Format["AreaG"]) ? $Format["AreaG"] : 255;
116
		$AreaB = isset($Format["AreaB"]) ? $Format["AreaB"] : 255;
117
		$AreaBorderR = $AreaR;
118
		$AreaBorderG = $AreaG;
119
		$AreaBorderB = $AreaB;
120
 
121
		/* Override defaults */
122
		extract($Format);
123
 
124
		$TextString = $this->encode39($Value);
125
		if ($DrawArea) {
126
			$X1 = $X + cos(($Angle - 135) * PI / 180) * 10;
127
			$Y1 = $Y + sin(($Angle - 135) * PI / 180) * 10;
128
			$X2 = $X1 + cos($Angle * PI / 180) * (strlen($this->Result) + 20);
129
			$Y2 = $Y1 + sin($Angle * PI / 180) * (strlen($this->Result) + 20);
130
			if ($ShowLegend) {
131
				$X3 = $X2 + cos(($Angle + 90) * PI / 180) * ($Height + $LegendOffset + $this->pChartObject->FontSize + 10);
132
				$Y3 = $Y2 + sin(($Angle + 90) * PI / 180) * ($Height + $LegendOffset + $this->pChartObject->FontSize + 10);
133
			} else {
134
				$X3 = $X2 + cos(($Angle + 90) * PI / 180) * ($Height + 20);
135
				$Y3 = $Y2 + sin(($Angle + 90) * PI / 180) * ($Height + 20);
136
			}
137
 
138
			$X4 = $X3 + cos(($Angle + 180) * PI / 180) * (strlen($this->Result) + 20);
139
			$Y4 = $Y3 + sin(($Angle + 180) * PI / 180) * (strlen($this->Result) + 20);
140
			$this->pChartObject->drawPolygon([$X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4], ["R" => $AreaR,"G" => $AreaG,"B" => $AreaB,"BorderR" => $AreaBorderR,"BorderG" => $AreaBorderG,"BorderB" => $AreaBorderB]);
141
		}
142
 
143
		for ($i = 1; $i <= strlen($this->Result); $i++) {
144
			if ($this->mid($this->Result, $i, 1) == 1) {
145
				$X1 = $X + cos($Angle * PI / 180) * $i;
146
				$Y1 = $Y + sin($Angle * PI / 180) * $i;
147
				$X2 = $X1 + cos(($Angle + 90) * PI / 180) * $Height;
148
				$Y2 = $Y1 + sin(($Angle + 90) * PI / 180) * $Height;
149
				$this->pChartObject->drawLine($X1, $Y1, $X2, $Y2, ["R" => $R,"G" => $G,"B" => $B,"Alpha" => $Alpha]);
150
			}
151
		}
152
 
153
		if ($ShowLegend) {
154
			$X1 = $X + cos($Angle * PI / 180) * (strlen($this->Result) / 2);
155
			$Y1 = $Y + sin($Angle * PI / 180) * (strlen($this->Result) / 2);
156
			$LegendX = $X1 + cos(($Angle + 90) * PI / 180) * ($Height + $LegendOffset);
157
			$LegendY = $Y1 + sin(($Angle + 90) * PI / 180) * ($Height + $LegendOffset);
158
			$this->pChartObject->drawText($LegendX, $LegendY, $TextString, ["R" => $R,"G" => $G,"B" => $B,"Alpha" => $Alpha,"Angle" => - $Angle,"Align" => TEXT_ALIGN_TOPMIDDLE]);
159
		}
160
	}
161
 
162
	function checksum($string)
163
	{
164
		$checksum = 0;
165
		$length = strlen($string);
166
		$charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%';
167
		for ($i = 0; $i < $length; ++$i) {
168
			$checksum+= strpos($charset, $string[$i]);
169
		}
170
 
171
		return substr($charset, ($checksum % 43), 1);
172
	}
173
 
174
	function left($value, $NbChar)
175
	{
176
		return substr($value, 0, $NbChar);
177
	}
178
 
179
	function right($value, $NbChar)
180
	{
181
		return substr($value, strlen($value) - $NbChar, $NbChar);
182
	}
183
 
184
	function mid($value, $Depart, $NbChar)
185
	{
186
		return substr($value, $Depart - 1, $NbChar);
187
	}
188
}
189
 
190
?>