Skip to content

Commit ec4502f

Browse files
committed
HTML renderers
1 parent 29756f7 commit ec4502f

8 files changed

+440
-42
lines changed

src/BarcodeGeneratorDynamicHTML.php

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
class BarcodeGeneratorDynamicHTML extends BarcodeGenerator
66
{
7-
private const WIDTH_PRECISION = 6;
8-
97
/**
108
* Return an HTML representation of barcode.
119
* This 'dynamic' version uses percentage based widths and heights, resulting in a vector-y qualitative result.
@@ -19,26 +17,9 @@ public function getBarcode(string $barcode, $type, string $foregroundColor = 'bl
1917
{
2018
$barcodeData = $this->getBarcodeData($barcode, $type);
2119

22-
$html = '<div style="font-size:0;position:relative;width:100%;height:100%">' . PHP_EOL;
23-
24-
$positionHorizontal = 0;
25-
/** @var BarcodeBar $bar */
26-
foreach ($barcodeData->getBars() as $bar) {
27-
$barWidth = $bar->getWidth() / $barcodeData->getWidth() * 100;
28-
$barHeight = round(($bar->getHeight() / $barcodeData->getHeight() * 100), 3);
29-
30-
if ($bar->isBar() && $barWidth > 0) {
31-
$positionVertical = round(($bar->getPositionVertical() / $barcodeData->getHeight() * 100), 3);
32-
33-
// draw a vertical bar
34-
$html .= '<div style="background-color:' . $foregroundColor . ';width:' . round($barWidth, self::WIDTH_PRECISION) . '%;height:' . $barHeight . '%;position:absolute;left:' . round($positionHorizontal, self::WIDTH_PRECISION) . '%;top:' . $positionVertical . (($positionVertical > 0) ? '%' : '') . '">&nbsp;</div>' . PHP_EOL;
35-
}
36-
37-
$positionHorizontal += $barWidth;
38-
}
39-
40-
$html .= '</div>' . PHP_EOL;
20+
$renderer = new \Picqer\Barcode\Renderers\DynamicHtmlRenderer();
21+
$renderer->setForegroundColor($foregroundColor);
4122

42-
return $html;
23+
return $renderer->render($barcodeData);
4324
}
4425
}

src/BarcodeGeneratorHTML.php

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,15 @@ class BarcodeGeneratorHTML extends BarcodeGenerator
1515
* @param string $foregroundColor Foreground color for bar elements as '#333' or 'orange' for example (background is transparent).
1616
* @return string HTML code.
1717
*/
18-
public function getBarcode($barcode, $type, int $widthFactor = 2, int $height = 30, string $foregroundColor = 'black'): string
18+
public function getBarcode(string $barcode, $type, int $widthFactor = 2, int $height = 30, string $foregroundColor = 'black'): string
1919
{
2020
$barcodeData = $this->getBarcodeData($barcode, $type);
2121

22-
$html = '<div style="font-size:0;position:relative;width:' . ($barcodeData->getWidth() * $widthFactor) . 'px;height:' . ($height) . 'px;">' . PHP_EOL;
22+
$width = round(($barcodeData->getWidth() * $widthFactor), 3);
2323

24-
$positionHorizontal = 0;
25-
/** @var BarcodeBar $bar */
26-
foreach ($barcodeData->getBars() as $bar) {
27-
$barWidth = round(($bar->getWidth() * $widthFactor), 3);
28-
$barHeight = round(($bar->getHeight() * $height / $barcodeData->getHeight()), 3);
24+
$renderer = new \Picqer\Barcode\Renderers\HtmlRenderer();
25+
$renderer->setForegroundColor($foregroundColor);
2926

30-
if ($bar->isBar() && $barWidth > 0) {
31-
$positionVertical = round(($bar->getPositionVertical() * $height / $barcodeData->getHeight()), 3);
32-
33-
// draw a vertical bar
34-
$html .= '<div style="background-color:' . $foregroundColor . ';width:' . $barWidth . 'px;height:' . $barHeight . 'px;position:absolute;left:' . $positionHorizontal . 'px;top:' . $positionVertical . (($positionVertical > 0) ? 'px' : '') . '">&nbsp;</div>' . PHP_EOL;
35-
}
36-
37-
$positionHorizontal += $barWidth;
38-
}
39-
40-
$html .= '</div>' . PHP_EOL;
41-
42-
return $html;
27+
return $renderer->render($barcodeData, $width, $height);
4328
}
4429
}

src/Renderers/DynamicHtmlRenderer.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace Picqer\Barcode\Renderers;
4+
5+
use Picqer\Barcode\Barcode;
6+
use Picqer\Barcode\BarcodeBar;
7+
8+
class DynamicHtmlRenderer
9+
{
10+
protected const WIDTH_PRECISION = 6;
11+
12+
protected string $foregroundColor = 'black';
13+
14+
public function render(Barcode $barcode): string
15+
{
16+
$html = '<div style="font-size:0;position:relative;width:100%;height:100%">' . PHP_EOL;
17+
18+
$positionHorizontal = 0;
19+
/** @var BarcodeBar $bar */
20+
foreach ($barcode->getBars() as $bar) {
21+
$barWidth = $bar->getWidth() / $barcode->getWidth() * 100;
22+
$barHeight = round(($bar->getHeight() / $barcode->getHeight() * 100), 3);
23+
24+
if ($bar->isBar() && $barWidth > 0) {
25+
$positionVertical = round(($bar->getPositionVertical() / $barcode->getHeight() * 100), 3);
26+
27+
// draw a vertical bar
28+
$html .= '<div style="background-color:' . $this->foregroundColor . ';width:' . round($barWidth, self::WIDTH_PRECISION) . '%;height:' . $barHeight . '%;position:absolute;left:' . round($positionHorizontal, self::WIDTH_PRECISION) . '%;top:' . $positionVertical . (($positionVertical > 0) ? '%' : '') . '">&nbsp;</div>' . PHP_EOL;
29+
}
30+
31+
$positionHorizontal += $barWidth;
32+
}
33+
34+
$html .= '</div>' . PHP_EOL;
35+
36+
return $html;
37+
}
38+
39+
public function setForegroundColor(string $color): void
40+
{
41+
$this->foregroundColor = $color;
42+
}
43+
}

src/Renderers/HtmlRenderer.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace Picqer\Barcode\Renderers;
4+
5+
use Picqer\Barcode\Barcode;
6+
use Picqer\Barcode\BarcodeBar;
7+
8+
class HtmlRenderer
9+
{
10+
protected string $foregroundColor = 'black';
11+
12+
public function render(Barcode $barcode, float $width = 200, float $height = 30): string
13+
{
14+
$widthFactor = $width / $barcode->getWidth();
15+
16+
$html = '<div style="font-size:0;position:relative;width:' . $width . 'px;height:' . ($height) . 'px;">' . PHP_EOL;
17+
18+
$positionHorizontal = 0;
19+
/** @var BarcodeBar $bar */
20+
foreach ($barcode->getBars() as $bar) {
21+
$barWidth = round(($bar->getWidth() * $widthFactor), 3);
22+
$barHeight = round(($bar->getHeight() * $height / $barcode->getHeight()), 3);
23+
24+
if ($bar->isBar() && $barWidth > 0) {
25+
$positionVertical = round(($bar->getPositionVertical() * $height / $barcode->getHeight()), 3);
26+
27+
// draw a vertical bar
28+
$html .= '<div style="background-color:' . $this->foregroundColor . ';width:' . $barWidth . 'px;height:' . $barHeight . 'px;position:absolute;left:' . $positionHorizontal . 'px;top:' . $positionVertical . (($positionVertical > 0) ? 'px' : '') . '">&nbsp;</div>' . PHP_EOL;
29+
}
30+
31+
$positionHorizontal += $barWidth;
32+
}
33+
34+
$html .= '</div>' . PHP_EOL;
35+
36+
return $html;
37+
}
38+
39+
public function setForegroundColor(string $color): void
40+
{
41+
$this->foregroundColor = $color;
42+
}
43+
}

tests/DynamicHtmlRendererTest.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
use PHPUnit\Framework\TestCase;
4+
5+
class DynamicHtmlRendererTest extends TestCase
6+
{
7+
public function test_dynamic_html_barcode_generator_can_generate_code_128_barcode()
8+
{
9+
$barcode = (new Picqer\Barcode\Types\TypeCode128())->getBarcode('081231723897');
10+
11+
$renderer = new Picqer\Barcode\Renderers\DynamicHtmlRenderer();
12+
$generated = $renderer->render($barcode);
13+
14+
$this->assertStringEqualsFile('tests/verified-files/081231723897-dynamic-code128.html', $generated);
15+
}
16+
17+
public function test_dynamic_html_barcode_generator_can_generate_imb_barcode_to_test_heights()
18+
{
19+
$barcode = (new Picqer\Barcode\Types\TypeIntelligentMailBarcode())->getBarcode('12345678903');
20+
21+
$renderer = new Picqer\Barcode\Renderers\DynamicHtmlRenderer();
22+
$generated = $renderer->render($barcode);
23+
24+
$this->assertStringEqualsFile('tests/verified-files/12345678903-dynamic-imb.html', $generated);
25+
}
26+
}

tests/HtmlRendererTest.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
use PHPUnit\Framework\TestCase;
4+
5+
class HtmlRendererTest extends TestCase
6+
{
7+
public function test_html_barcode_generator_can_generate_code_128_barcode()
8+
{
9+
$barcode = (new Picqer\Barcode\Types\TypeCode128())->getBarcode('081231723897');
10+
11+
$renderer = new Picqer\Barcode\Renderers\HtmlRenderer();
12+
$generated = $renderer->render($barcode, $barcode->getWidth() * 2);
13+
14+
$this->assertStringEqualsFile('tests/verified-files/081231723897-code128.html', $generated);
15+
}
16+
17+
public function test_html_barcode_generator_can_generate_imb_barcode_to_test_heights()
18+
{
19+
$barcode = (new Picqer\Barcode\Types\TypeIntelligentMailBarcode())->getBarcode('12345678903');
20+
21+
$renderer = new Picqer\Barcode\Renderers\HtmlRenderer();
22+
$generated = $renderer->render($barcode, $barcode->getWidth() * 2);
23+
24+
$this->assertStringEqualsFile('tests/verified-files/12345678903-imb.html', $generated);
25+
}
26+
}

tests/JpgRendererTest.php

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
<?php
2+
3+
use PHPUnit\Framework\TestCase;
4+
5+
class JpgRendererTest extends TestCase
6+
{
7+
public function test_jpg_barcode_generator_can_generate_code_128_barcode()
8+
{
9+
$barcode = (new Picqer\Barcode\Types\TypeCode128())->getBarcode('081231723897');
10+
11+
$renderer = new Picqer\Barcode\Renderers\JpgRenderer();
12+
$renderer->useGd();
13+
$generated = $renderer->render($barcode);
14+
15+
$imageInfo = getimagesizefromstring($generated);
16+
17+
$this->assertGreaterThan(100, strlen($generated));
18+
$this->assertEquals(202, $imageInfo[0]); // Image width
19+
$this->assertEquals(30, $imageInfo[1]); // Image height
20+
$this->assertEquals('image/jpeg', $imageInfo['mime']);
21+
}
22+
23+
24+
public function test_jpg_barcode_generator_can_generate_code_39_barcode()
25+
{
26+
$barcode = (new Picqer\Barcode\Types\TypeCode39())->getBarcode('081231723897');
27+
28+
$renderer = new Picqer\Barcode\Renderers\JpgRenderer();
29+
$renderer->useGd();
30+
$generated = $renderer->render($barcode, 1);
31+
32+
$imageInfo = getimagesizefromstring($generated);
33+
34+
$this->assertGreaterThan(100, strlen($generated));
35+
$this->assertEquals(224, $imageInfo[0]); // Image width
36+
$this->assertEquals(30, $imageInfo[1]); // Image height
37+
$this->assertEquals('image/jpeg', $imageInfo['mime']);
38+
}
39+
40+
public function test_jpg_barcode_generator_can_use_different_height()
41+
{
42+
$barcode = (new Picqer\Barcode\Types\TypeCode128())->getBarcode('081231723897');
43+
44+
$renderer = new Picqer\Barcode\Renderers\JpgRenderer();
45+
$renderer->useGd();
46+
$generated = $renderer->render($barcode, 2, 45);
47+
48+
$imageInfo = getimagesizefromstring($generated);
49+
50+
$this->assertGreaterThan(100, strlen($generated));
51+
$this->assertEquals(202, $imageInfo[0]); // Image width
52+
$this->assertEquals(45, $imageInfo[1]); // Image height
53+
$this->assertEquals('image/jpeg', $imageInfo['mime']);
54+
}
55+
56+
public function test_jpg_barcode_generator_can_use_different_width_factor()
57+
{
58+
$barcode = (new Picqer\Barcode\Types\TypeCode128())->getBarcode('081231723897');
59+
60+
$renderer = new Picqer\Barcode\Renderers\JpgRenderer();
61+
$renderer->useGd();
62+
$generated = $renderer->render($barcode, 5);
63+
64+
$imageInfo = getimagesizefromstring($generated);
65+
66+
$this->assertGreaterThan(100, strlen($generated));
67+
$this->assertEquals(505, $imageInfo[0]); // Image width
68+
$this->assertEquals('image/jpeg', $imageInfo['mime']);
69+
}
70+
71+
72+
// Copied as Imagick
73+
74+
public function test_jpg_barcode_generator_can_generate_code_128_barcode_imagick()
75+
{
76+
if (! extension_loaded('imagick')) {
77+
$this->markTestSkipped();
78+
}
79+
80+
$barcode = (new Picqer\Barcode\Types\TypeCode128())->getBarcode('081231723897');
81+
82+
$renderer = new Picqer\Barcode\Renderers\JpgRenderer();
83+
$renderer->useImagick();
84+
$generated = $renderer->render($barcode);
85+
86+
$imageInfo = getimagesizefromstring($generated);
87+
88+
$this->assertGreaterThan(100, strlen($generated));
89+
$this->assertEquals(202, $imageInfo[0]); // Image width
90+
$this->assertEquals(30, $imageInfo[1]); // Image height
91+
$this->assertEquals('image/jpeg', $imageInfo['mime']);
92+
}
93+
94+
public function test_jpg_barcode_generator_can_generate_code_39_barcode_imagick()
95+
{
96+
if (! extension_loaded('imagick')) {
97+
$this->markTestSkipped();
98+
}
99+
100+
$barcode = (new Picqer\Barcode\Types\TypeCode39())->getBarcode('081231723897');
101+
102+
$renderer = new Picqer\Barcode\Renderers\JpgRenderer();
103+
$renderer->useImagick();
104+
$generated = $renderer->render($barcode, 1);
105+
106+
$imageInfo = getimagesizefromstring($generated);
107+
108+
$this->assertGreaterThan(100, strlen($generated));
109+
$this->assertEquals(224, $imageInfo[0]); // Image width
110+
$this->assertEquals(30, $imageInfo[1]); // Image height
111+
$this->assertEquals('image/jpeg', $imageInfo['mime']);
112+
}
113+
114+
public function test_jpg_barcode_generator_can_use_different_height_imagick()
115+
{
116+
if (! extension_loaded('imagick')) {
117+
$this->markTestSkipped();
118+
}
119+
120+
$barcode = (new Picqer\Barcode\Types\TypeCode128())->getBarcode('081231723897');
121+
122+
$renderer = new Picqer\Barcode\Renderers\JpgRenderer();
123+
$renderer->useGd();
124+
$generated = $renderer->render($barcode, 2, 45);
125+
126+
$imageInfo = getimagesizefromstring($generated);
127+
128+
$this->assertGreaterThan(100, strlen($generated));
129+
$this->assertEquals(202, $imageInfo[0]); // Image width
130+
$this->assertEquals(45, $imageInfo[1]); // Image height
131+
$this->assertEquals('image/jpeg', $imageInfo['mime']);
132+
}
133+
134+
public function test_jpg_barcode_generator_can_use_different_width_factor_imagick()
135+
{
136+
if (! extension_loaded('imagick')) {
137+
$this->markTestSkipped();
138+
}
139+
140+
$barcode = (new Picqer\Barcode\Types\TypeCode128())->getBarcode('081231723897');
141+
142+
$renderer = new Picqer\Barcode\Renderers\JpgRenderer();
143+
$renderer->useGd();
144+
$generated = $renderer->render($barcode, 5);
145+
146+
$imageInfo = getimagesizefromstring($generated);
147+
148+
$this->assertGreaterThan(100, strlen($generated));
149+
$this->assertEquals(505, $imageInfo[0]); // Image width
150+
$this->assertEquals('image/jpeg', $imageInfo['mime']);
151+
}
152+
}

0 commit comments

Comments
 (0)