From 8efa75d2af6c8e5727f38a6fde8ada8bf2ce49b0 Mon Sep 17 00:00:00 2001 From: Fernando Herrero Date: Sat, 6 Sep 2025 01:37:14 +0200 Subject: [PATCH] EAN13 Barcode --- barcode/BarcodeException.php | 8 + barcode/EAN13.php | 238 +++++++++++++++++++++++ composer.json | 1 + src/FawnoFPDF.php | 4 + src/Traits/BasicFunctionsTrait.php | 64 ++++++ src/Traits/EAN13Trait.php | 185 ++++++++++++++++++ tests/Scripts/EAN13TraitTest.php | 27 +++ tests/examples/example.pdf | Bin 25376 -> 26148 bytes tests/examples/exampleEAN13TraitTest.pdf | Bin 0 -> 1711 bytes tests/test.php | 5 + 10 files changed, 532 insertions(+) create mode 100644 barcode/BarcodeException.php create mode 100644 barcode/EAN13.php create mode 100644 src/Traits/BasicFunctionsTrait.php create mode 100644 src/Traits/EAN13Trait.php create mode 100644 tests/Scripts/EAN13TraitTest.php create mode 100644 tests/examples/exampleEAN13TraitTest.pdf diff --git a/barcode/BarcodeException.php b/barcode/BarcodeException.php new file mode 100644 index 0000000..16d6cb2 --- /dev/null +++ b/barcode/BarcodeException.php @@ -0,0 +1,8 @@ + EAN_pet + protected const EAN_pet = [ + 0 => ['O', 'O', 'O', 'O', 'O', 'O'], + 1 => ['O', 'O', 'E', 'O', 'E', 'E'], + 2 => ['O', 'O', 'E', 'E', 'O', 'E'], + 3 => ['O', 'O', 'E', 'E', 'E', 'O'], + 4 => ['O', 'E', 'O', 'O', 'E', 'E'], + 5 => ['O', 'E', 'E', 'O', 'O', 'E'], + 6 => ['O', 'E', 'E', 'E', 'O', 'O'], + 7 => ['O', 'E', 'E', 'E', 'O', 'E'], + 8 => ['O', 'E', 'O', 'E', 'E', 'O'], + 9 => ['O', 'E', 'E', 'O', 'E', 'O'], + ]; + + // EAN Character Set Encoding Table => EAN_cet + protected const EAN_cet = [ + 0 => ['O' => '0001101', 'E' => '0100111', 'R' => '1110010'], + 1 => ['O' => '0011001', 'E' => '0110011', 'R' => '1100110'], + 2 => ['O' => '0010011', 'E' => '0011011', 'R' => '1101100'], + 3 => ['O' => '0111101', 'E' => '0100001', 'R' => '1000010'], + 4 => ['O' => '0100011', 'E' => '0011101', 'R' => '1011100'], + 5 => ['O' => '0110001', 'E' => '0111001', 'R' => '1001110'], + 6 => ['O' => '0101111', 'E' => '0000101', 'R' => '1010000'], + 7 => ['O' => '0111011', 'E' => '0010001', 'R' => '1000100'], + 8 => ['O' => '0110111', 'E' => '0001001', 'R' => '1001000'], + 9 => ['O' => '0001011', 'E' => '0010111', 'R' => '1110100'], + ]; + + // UPC 2-Digit Parity Pattern => UPC_2dpp + protected const UPC_2dpp = [ + 0 => ['O', 'O'], + 1 => ['O', 'E'], + 2 => ['E', 'O'], + 3 => ['E', 'E'], + ]; + + // UPC 5-Digit Parity Pattern => UPC_5dpp + protected const UPC_5dpp = [ + 0 => ['E', 'E', 'O', 'O', 'O'], + 1 => ['E', 'O', 'E', 'O', 'O'], + 2 => ['E', 'O', 'O', 'E', 'O'], + 3 => ['E', 'O', 'O', 'O', 'E'], + 4 => ['O', 'E', 'E', 'O', 'O'], + 5 => ['O', 'O', 'E', 'E', 'O'], + 6 => ['O', 'O', 'O', 'E', 'E'], + 7 => ['O', 'E', 'O', 'E', 'O'], + 8 => ['O', 'E', 'O', 'O', 'E'], + 9 => ['O', 'O', 'E', 'O', 'E'], + ]; + + protected string $message; + protected string $supplemental; + + /** + * Construct EAN13 with message and supplemental. + * + * @param null|string $message Message of EAN13 code + * @param null|string $supplemental Supplemental code for EAN13 + * @return void + * @throws BarcodeException If message or supplemental has invalid length BarcodeException is thrown. + */ + private function __construct (?string $message = null, ?string $supplemental = null) { + if (is_null($this->setMessage($message))) { + throw new BarcodeException('Message invalid', 1); + } + + if (is_null($this->setSupplemental($supplemental))) { + throw new BarcodeException('Supplemental invalid', 1); + } + } + + /** + * Create EAN13 code with message and optional supplemental code. + * + * @param null|string $message Message of EAN13 + * @param null|string $supplemental Supplemental code + * @return EAN13 + * @throws BarcodeException If message or supplemental has invalid length BarcodeException is thrown. + */ + public static function create (?string $message = null, ?string $supplemental = null) : EAN13 { + return new EAN13($message, $supplemental); + } + + /** + * Get message of EAN13 with checksum digit + * + * @return null|string EAN13 message + */ + public function getMessage () : ?string { + return $this->message ?: null; + } + + /** + * Set message of EAN13 code + * + * @param null|string $message Message of EAN13 + * @return null|int Checksum of EAN13. NULL is returned if message has invalid length. If message is cleared with void string or NULL, -1 is returned. + */ + public function setMessage (?string $message = null) : ?int { + $this->message = substr(preg_replace('/\D/', '', (string) $message), 0, 12); + + $checksum = self::getBarcodeChecksum(); + + $this->message = is_int($checksum) ? $this->message . $checksum : ''; + + if ($message and is_null($checksum)) { + $this->message = ''; + return null; + } + + return $this->message ? $checksum : -1; + } + + /** + * Get supplemental code + * + * @return null|string Supplemental + */ + public function getSupplemental () : ?string { + return $this->supplemental ?: null; + } + + /** + * Set the supplemental code for EAN13 code + * + * @param null|string $supplemental Supplemental code + * @return null|int Checksum of supplemental. NULL is returned if supplemental has invalid length. If supplemental is cleared with void string or NULL, -1 is returned. + */ + public function setSupplemental (?string $supplemental = null) : ?int { + $this->supplemental = preg_replace('/\D/', '', (string) $supplemental); + + $checksum = self::getSupplementalChecksum(); + + if ($supplemental and is_null($checksum)) { + $this->supplemental = ''; + return null; + } + + return $this->supplemental ? $checksum : -1; + } + + /** + * Computes the EAN13 checksum + * + * @return null|int NULL is returned if mesage has invalid length + */ + public function getBarcodeChecksum () : ?int { + $message = substr($this->message, 0, 12); + + if (strlen($message) != 12) { + return null; + } + + $checksum = 0; + foreach (str_split(strrev($message)) as $pos => $val) { + $checksum += $val * (3 - 2 * ($pos % 2)); + } + + return ((10 - ($checksum % 10)) % 10); + } + + /** + * Computes the UPC checksum for supplemental code of EAN13 + * + * @return null|int NULL is returned if supplemental has invalid length + */ + public function getSupplementalChecksum () : ?int { + if (strlen($this->supplemental) == 2) { + return ($this->supplemental % 4); + } + + if (strlen($this->supplemental) == 5) { + $supp_checksum = 0; + foreach (str_split(strrev($this->supplemental)) as $pos => $val ) { + $supp_checksum += $val * (3 + 6 * ($pos % 2)); + } + return ($supp_checksum % 10); + } + + return null; + } + + /** + * Get EAN13 left hand bars coded + * + * @return null|string Left hand bars of EAN13 code + */ + public function getBarcodeLeftHand () : ?string { + $lh_coded = ''; + + foreach (str_split(substr($this->message, 1, 6)) as $pos => $val) { + $lh_coded .= self::EAN_cet[$val][self::EAN_pet[$this->message[0]][$pos]]; + } + + return $lh_coded ?: null; + } + + /** + * Get EAN13 right hand bars coded + * + * @return null|string Right hand bars of EAN13 code + */ + public function getBarcodeRightHand () : ?string { + $rh_coded = ''; + + foreach (str_split(substr($this->message, 7, 6)) as $pos => $val) { + $rh_coded .= self::EAN_cet[$val]['R']; + } + + return $rh_coded ?: null; + } + + /** + * Get EAN13 supplemental bars coded + * + * @return null|string EAN13 supplemental bars + */ + public function getBarcodeSupplemental () : ?string { + $supp_coded = ''; + + $supp_checksum = $this->getSupplementalChecksum(); + + $table = (strlen($this->supplemental) == 2) ? self::UPC_2dpp : self::UPC_5dpp; + foreach(str_split($this->supplemental) as $pos => $val) { + $supp_coded .= self::EAN_cet[$val][$table[$supp_checksum][$pos]] . '01'; + } + + return $supp_coded ? '1011' . substr($supp_coded, 0, -2) : null; + } + } diff --git a/composer.json b/composer.json index 1607a9e..afdaa28 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,7 @@ "autoload": { "psr-4": { "Fawno\\FPDF\\": "src/", + "Fawno\\Barcode\\": "barcode/", "FPDF\\Scripts\\": "scripts/" }, "classmap": [ diff --git a/src/FawnoFPDF.php b/src/FawnoFPDF.php index 188cfee..3d95a33 100644 --- a/src/FawnoFPDF.php +++ b/src/FawnoFPDF.php @@ -6,6 +6,8 @@ use Fawno\FPDF\Traits\CMYKTrait; use Fawno\FPDF\Traits\PDFMacroableTrait; use Fawno\FPDF\PDFWrapper; + use Fawno\FPDF\Traits\BasicFunctionsTrait; + use Fawno\FPDF\Traits\EAN13Trait; use Fawno\FPDF\Traits\FontsTrait; use FPDF\Scripts\Attachments\AttachmentsTrait; use FPDF\Scripts\PDFBookmark\PDFBookmarkTrait; @@ -40,6 +42,8 @@ class FawnoFPDF extends PDFWrapper { use PDFMultiCellsTableTrait; use PDFTransformTrait; use PDFCircularTextTrait; + use EAN13Trait; + use BasicFunctionsTrait; protected function _putresources () { parent::_putresources(); diff --git a/src/Traits/BasicFunctionsTrait.php b/src/Traits/BasicFunctionsTrait.php new file mode 100644 index 0000000..ba90337 --- /dev/null +++ b/src/Traits/BasicFunctionsTrait.php @@ -0,0 +1,64 @@ +k; + } + + /** + * Converts a value from points to the document unit + * + * @param float $val Value in points + * @return float Value in document units + */ + public function fromPt (float $val) : float { + return $val / $this->k; + } + + /** + * Converts a value from the document unit to points + * @param float $val Value in document units + * @return float Value in points + */ + public function toPt (float $val) : float { + return $val * $this->k; + } + + /** + * Converts a value from millimeters to points + * + * @param float $val Value in millemeters + * @return float Value in points + */ + public function mm2Pt (float $val) : float { + return $val * 720 / 254; + } + + /** + * Converts a value from centimeters to points + * + * @param float $val Value in centimeters + * @return float Value in points + */ + public function cm2Pt (float $val) : float { + return $val * 7200 / 254; + } + + /** + * Converts a value from inches to points + * + * @param float $val Value in inches + * @return float Value in points + */ + public function in2Pt (float $val) : float { + return $val * 72; + } + } diff --git a/src/Traits/EAN13Trait.php b/src/Traits/EAN13Trait.php new file mode 100644 index 0000000..cd0f7f4 --- /dev/null +++ b/src/Traits/EAN13Trait.php @@ -0,0 +1,185 @@ +mm2Pt(12.5); + + $this->ean13_margin = $box ? $this->fromPt(2) : 0; + $this->ean13_height = $this->fromPt($height); + $this->ean13_textheight = 8; + $this->ean13_barwidth = $this->fromPt($barwidth); + $this->ean13_barheight = $this->fromPt($height - 8.733071); + $this->ean13_senheight = $this->fromPt($height - 5.133071); + $this->ean13_ypos = $this->fromPt(8); + $this->ean13_xpos = 8; + + $this->SetFont('Helvetica', '', $this->ean13_textheight); + } + + /** + * Set EAN13 barcode + * + * @param float $x Abscisse of uppper left corner of the barcode + * @param float $y Ordinate of uppper left corner of the barcode + * @param string $message Message of the barcode + * @param null|string $supplemental Optional supplemental code + * @param bool $box Draw border + * @param float $width Width of barcode. Default is 40mm + * @param float $height Height of barcode. Default is 12.5mm + * @param null|float $angle Rotation of barcode + * @return void + */ + public function BarcodeEAN13 (float $x, float $y, string $message, ?string $supplemental = null, bool $box = false, float $width = 0, float $height = 0, ?float $angle = null) : void { + $ean13 = EAN13::create(); + $ean13->setMessage($message); + $message = $ean13->getMessage(); + $ean13->setSupplemental($supplemental); + $supplemental = $ean13->getSupplemental(); + + if (!$message) { + return; + } + + $this->_ean13_initialize_draw($box); + + $barcount = $supplemental ? ((strlen($supplemental) == 2) ? 135 : 162) : 105; + $ean13_width = $this->ean13_barwidth * $barcount + 2 * $this->ean13_margin; + $width = $width ?: $this->ean13_barwidth * $barcount; + $scalex = ($width > 0) ? 100 * $width / $ean13_width : 100; + + $ean13_height = $this->ean13_height + 2 * $this->ean13_margin; + $height = $height ?: $this->ean13_height; + $scaley = ($height > 0) ? 100 * $height / $ean13_height : 100; + + $this->StartTransform(); + $this->Scale($scalex, $scaley, (float) $x, (float) $y); + $this->Rotate((float) $angle, (float) $x, (float) $y); + $this->Translate((float) $x, (float) $y); + + if ($box) { + $this->SetLineWidth($this->fromPt(0.5)); + $this->Rect(0, 0, $ean13_width, $ean13_height); + } + + $this->SetLineWidth($this->ean13_barwidth); + + $this->_ean13_sentinel(0, '101'); + $this->_ean13_bars(3, $ean13->getBarcodeLeftHand()); + $this->_ean13_sentinel(45, '01010'); + $this->_ean13_bars(50, $ean13->getBarcodeRightHand()); + $this->_ean13_sentinel(92, '101'); + + $this->_ean13_put_text(-1, $this->fromPt(7), 0, $message[0]); + $this->_ean13_put_text(3, $this->fromPt(7), 42, substr($message, 1, 6)); + $this->_ean13_put_text(49, $this->fromPt(7), 42, substr($message, 7, 6)); + + if (!$supplemental) { + $this->StopTransform(); + return; + } + + $this->_ean13_bars_supp(105, $ean13->getBarcodeSupplemental()); + $this->_ean13_put_text(105, $this->fromPt(6) - $this->ean13_barheight, strlen($ean13->getBarcodeSupplemental()), $supplemental); + + $this->StopTransform(); + } + + /** + * Draw sentinel bars + * + * @param int $pos_init Initial position in bars + * @param string $data Data to draw + * @return void + */ + private function _ean13_sentinel (int $pos_init, string $data) { + $data = str_split($data); + foreach ($data as $rpos => $val) { + if ($val) { + $x = ($this->ean13_xpos + $pos_init + $rpos) * $this->ean13_barwidth + $this->ean13_barwidth / 2 + $this->ean13_margin; + $y0 = $this->ean13_height + $this->ean13_margin - $this->ean13_ypos - $this->ean13_barheight + $this->ean13_barwidth / 2; + $y1 = $this->ean13_height + $this->ean13_margin - $this->ean13_ypos - $this->ean13_barheight - $this->ean13_barwidth / 2 + $this->ean13_senheight; + $this->Line($x, $y0, $x, $y1); + } + } + } + + /** + * Draw code bars + * + * @param int $pos_init Initial position in bars + * @param string $data Data to draw + * @return void + */ + private function _ean13_bars (int $pos_init, string $data) { + $data = str_split($data); + foreach ($data as $rpos => $val) { + if ($val) { + $x = ($this->ean13_xpos + $pos_init + $rpos) * $this->ean13_barwidth + $this->ean13_barwidth / 2 + $this->ean13_margin; + $y0 = $this->ean13_height + $this->ean13_margin - $this->ean13_ypos - $this->ean13_barheight + $this->ean13_barwidth / 2; + $y1 = $this->ean13_height + $this->ean13_margin - $this->ean13_ypos - $this->ean13_barwidth / 2; + $this->Line($x, $y0, $x, $y1); + } + } + } + + /** + * Draw supplemental code bars + * + * @param int $pos_init Initial position in bars + * @param string $data Data to draw + * @return void + */ + private function _ean13_bars_supp (int $pos_init, string $data) { + $data = str_split($data); + foreach ($data as $rpos => $val) { + if ($val) { + $x = ($this->ean13_xpos + $pos_init + $rpos) * $this->ean13_barwidth + $this->ean13_barwidth / 2 + $this->ean13_margin; + $y0 = $this->ean13_height + $this->ean13_margin - $this->ean13_ypos - $this->ean13_barheight + $this->ean13_barwidth / 2 + $this->fromPt(7); + $y1 = $this->ean13_height + $this->ean13_margin - $this->ean13_ypos - $this->ean13_barheight - $this->ean13_barwidth / 2 + $this->ean13_senheight; + $this->Line($x, $y0, $x, $y1); + } + } + } + + /** + * Set text in barcode + * + * @param int $pos_init Initial position in bars + * @param float $y Vertical position of text + * @param float $width Width of text box in bars + * @param string $string Text to write + * @return void + */ + private function _ean13_put_text (int $pos_init, float $y, float $width, string $string) { + $offset = ($pos_init < 0) ? $this->GetStringWidth($string[0]) : 0; + $len = strlen($string); + $width *= $this->ean13_barwidth; + $inc = ($width * ($len + 1) / $len - $this->GetStringWidth('0')) / ($this->ean13_barwidth * $len); + $y += $this->ean13_height + $this->ean13_margin - $this->ean13_ypos; + foreach (str_split($string) as $rpos => $char) { + $x = ($this->ean13_xpos + $pos_init + $rpos * $inc + 1) * $this->ean13_barwidth + $this->ean13_margin - $offset; + $this->Text($x, $y, $char); + } + } + } diff --git a/tests/Scripts/EAN13TraitTest.php b/tests/Scripts/EAN13TraitTest.php new file mode 100644 index 0000000..6c0e1fa --- /dev/null +++ b/tests/Scripts/EAN13TraitTest.php @@ -0,0 +1,27 @@ +AddPage(); + $pdf->BarcodeEAN13(80, 40, '123456789012'); + + $this->assertFileCanBeCreated($pdf); + + $this->assertPdfIsOk($pdf); + } + } diff --git a/tests/examples/example.pdf b/tests/examples/example.pdf index 89cf8d851b752be8533f74c9820de4488a7ad916..484988aa3cd26bc3793ab8597d15ec3bce8a529e 100644 GIT binary patch literal 26148 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'Paragraph 3', false, 1, -1); $pdf->Cell(0, 6, 'Paragraph 3'); + //EAN13Trait + $pdf->AddPage(); + $pdf->Bookmark('EAN13 Barcode', false); + $pdf->BarcodeEAN13(80, 40, '123456789012'); + //PDFTransformTrait $pdf->AddPage(); $pdf->Bookmark('PDFTransform', false);