Skip to content

Commit f94e6fe

Browse files
authored
Merge branch 'picqer:main' into TypeCode32
2 parents 01f34d3 + 7df93b4 commit f94e6fe

12 files changed

+283
-34
lines changed

.github/workflows/phpunit.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: phpunit
22

3-
on: [push]
3+
on: [push, pull_request]
44

55
jobs:
66
build:

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
vendor
22
composer.lock
33
composer.phar
4+
.phpunit.result.cache

Readme.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ file_put_contents('barcode.png', $generator->getBarcode('081231723897', $generat
5353

5454
## Image types
5555
```php
56-
$generatorSVG = new Picqer\Barcode\BarcodeGeneratorSVG();
57-
$generatorPNG = new Picqer\Barcode\BarcodeGeneratorPNG();
58-
$generatorJPG = new Picqer\Barcode\BarcodeGeneratorJPG();
59-
$generatorHTML = new Picqer\Barcode\BarcodeGeneratorHTML();
56+
$generatorSVG = new Picqer\Barcode\BarcodeGeneratorSVG(); // Vector based SVG
57+
$generatorPNG = new Picqer\Barcode\BarcodeGeneratorPNG(); // Pixel based PNG
58+
$generatorJPG = new Picqer\Barcode\BarcodeGeneratorJPG(); // Pixel based JPG
59+
$generatorHTML = new Picqer\Barcode\BarcodeGeneratorHTML(); // Pixel based HTML
60+
$generatorHTML = new Picqer\Barcode\BarcodeGeneratorDynamicHTML(); // Vector based HTML
6061
```
6162

6263
## Accepted barcode types

generate-verified-files.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ function getSaveFilename($value) {
1212
$generatorHTML = new Picqer\Barcode\BarcodeGeneratorHTML();
1313
file_put_contents('tests/verified-files/081231723897-code128.html', $generatorHTML->getBarcode('081231723897', $generatorHTML::TYPE_CODE_128));
1414

15+
file_put_contents('tests/verified-files/12345678903-imb.html', $generatorHTML->getBarcode('12345678903', $generatorHTML::TYPE_IMB));
16+
17+
$generatorDynamicHTML = new Picqer\Barcode\BarcodeGeneratorDynamicHTML();
18+
file_put_contents('tests/verified-files/081231723897-dynamic-code128.html', $generatorDynamicHTML->getBarcode('081231723897', $generatorDynamicHTML::TYPE_CODE_128));
19+
20+
file_put_contents('tests/verified-files/12345678903-dynamic-imb.html', $generatorDynamicHTML->getBarcode('12345678903', $generatorDynamicHTML::TYPE_IMB));
21+
1522
$generatorSVG = new Picqer\Barcode\BarcodeGeneratorSVG();
1623
file_put_contents('tests/verified-files/0049000004632-ean13.svg', $generatorSVG->getBarcode('0049000004632', $generatorSVG::TYPE_EAN_13));
1724

src/BarcodeGeneratorDynamicHTML.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace Picqer\Barcode;
4+
5+
class BarcodeGeneratorDynamicHTML extends BarcodeGenerator
6+
{
7+
private const WIDTH_PRECISION = 6;
8+
9+
/**
10+
* Return an HTML representation of barcode.
11+
* This 'dynamic' version uses percentage based widths and heights, resulting in a vector-y qualitative result.
12+
*
13+
* @param string $barcode code to print
14+
* @param string $type type of barcode
15+
* @param string $foregroundColor Foreground color for bar elements as '#333' or 'orange' for example (background is transparent).
16+
* @return string HTML code.
17+
*/
18+
public function getBarcode($barcode, $type, string $foregroundColor = 'black')
19+
{
20+
$barcodeData = $this->getBarcodeData($barcode, $type);
21+
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;
41+
42+
return $html;
43+
}
44+
}

src/BarcodeGeneratorHTML.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class BarcodeGeneratorHTML extends BarcodeGenerator
66
{
77
/**
88
* Return an HTML representation of barcode.
9+
* This original version uses pixel based widths and heights. Use Dynamic HTML version for better quality representation.
910
*
1011
* @param string $barcode code to print
1112
* @param string $type type of barcode
@@ -28,8 +29,9 @@ public function getBarcode($barcode, $type, int $widthFactor = 2, int $height =
2829

2930
if ($bar->isBar() && $barWidth > 0) {
3031
$positionVertical = round(($bar->getPositionVertical() * $height / $barcodeData->getHeight()), 3);
32+
3133
// draw a vertical bar
32-
$html .= '<div style="background-color:' . $foregroundColor . ';width:' . $barWidth . 'px;height:' . $barHeight . 'px;position:absolute;left:' . $positionHorizontal . 'px;top:' . $positionVertical . 'px;">&nbsp;</div>' . PHP_EOL;
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;
3335
}
3436

3537
$positionHorizontal += $barWidth;

tests/BarcodeDynamicHtmlTest.php

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

tests/BarcodeHtmlTest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,12 @@ public function test_html_barcode_generator_can_generate_code_128_barcode()
1111

1212
$this->assertStringEqualsFile('tests/verified-files/081231723897-code128.html', $generated);
1313
}
14+
15+
public function test_html_barcode_generator_can_generate_imb_barcode_to_test_heights()
16+
{
17+
$generator = new Picqer\Barcode\BarcodeGeneratorHTML();
18+
$generated = $generator->getBarcode('12345678903', $generator::TYPE_IMB);
19+
20+
$this->assertStringEqualsFile('tests/verified-files/12345678903-imb.html', $generated);
21+
}
1422
}
Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
<div style="font-size:0;position:relative;width:202px;height:30px;">
2-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:0px;top:0px;">&nbsp;</div>
3-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:6px;top:0px;">&nbsp;</div>
4-
<div style="background-color:black;width:6px;height:30px;position:absolute;left:12px;top:0px;">&nbsp;</div>
5-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:22px;top:0px;">&nbsp;</div>
6-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:30px;top:0px;">&nbsp;</div>
7-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:38px;top:0px;">&nbsp;</div>
8-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:44px;top:0px;">&nbsp;</div>
9-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:48px;top:0px;">&nbsp;</div>
10-
<div style="background-color:black;width:6px;height:30px;position:absolute;left:56px;top:0px;">&nbsp;</div>
11-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:66px;top:0px;">&nbsp;</div>
12-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:72px;top:0px;">&nbsp;</div>
13-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:82px;top:0px;">&nbsp;</div>
14-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:88px;top:0px;">&nbsp;</div>
15-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:94px;top:0px;">&nbsp;</div>
16-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:106px;top:0px;">&nbsp;</div>
17-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:110px;top:0px;">&nbsp;</div>
18-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:118px;top:0px;">&nbsp;</div>
19-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:128px;top:0px;">&nbsp;</div>
20-
<div style="background-color:black;width:8px;height:30px;position:absolute;left:132px;top:0px;">&nbsp;</div>
21-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:142px;top:0px;">&nbsp;</div>
22-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:146px;top:0px;">&nbsp;</div>
23-
<div style="background-color:black;width:6px;height:30px;position:absolute;left:154px;top:0px;">&nbsp;</div>
24-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:162px;top:0px;">&nbsp;</div>
25-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:166px;top:0px;">&nbsp;</div>
26-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:176px;top:0px;">&nbsp;</div>
27-
<div style="background-color:black;width:6px;height:30px;position:absolute;left:186px;top:0px;">&nbsp;</div>
28-
<div style="background-color:black;width:2px;height:30px;position:absolute;left:194px;top:0px;">&nbsp;</div>
29-
<div style="background-color:black;width:4px;height:30px;position:absolute;left:198px;top:0px;">&nbsp;</div>
2+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:0px;top:0">&nbsp;</div>
3+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:6px;top:0">&nbsp;</div>
4+
<div style="background-color:black;width:6px;height:30px;position:absolute;left:12px;top:0">&nbsp;</div>
5+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:22px;top:0">&nbsp;</div>
6+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:30px;top:0">&nbsp;</div>
7+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:38px;top:0">&nbsp;</div>
8+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:44px;top:0">&nbsp;</div>
9+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:48px;top:0">&nbsp;</div>
10+
<div style="background-color:black;width:6px;height:30px;position:absolute;left:56px;top:0">&nbsp;</div>
11+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:66px;top:0">&nbsp;</div>
12+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:72px;top:0">&nbsp;</div>
13+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:82px;top:0">&nbsp;</div>
14+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:88px;top:0">&nbsp;</div>
15+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:94px;top:0">&nbsp;</div>
16+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:106px;top:0">&nbsp;</div>
17+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:110px;top:0">&nbsp;</div>
18+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:118px;top:0">&nbsp;</div>
19+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:128px;top:0">&nbsp;</div>
20+
<div style="background-color:black;width:8px;height:30px;position:absolute;left:132px;top:0">&nbsp;</div>
21+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:142px;top:0">&nbsp;</div>
22+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:146px;top:0">&nbsp;</div>
23+
<div style="background-color:black;width:6px;height:30px;position:absolute;left:154px;top:0">&nbsp;</div>
24+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:162px;top:0">&nbsp;</div>
25+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:166px;top:0">&nbsp;</div>
26+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:176px;top:0">&nbsp;</div>
27+
<div style="background-color:black;width:6px;height:30px;position:absolute;left:186px;top:0">&nbsp;</div>
28+
<div style="background-color:black;width:2px;height:30px;position:absolute;left:194px;top:0">&nbsp;</div>
29+
<div style="background-color:black;width:4px;height:30px;position:absolute;left:198px;top:0">&nbsp;</div>
3030
</div>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<div style="font-size:0;position:relative;width:100%;height:100%">
2+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:0%;top:0">&nbsp;</div>
3+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:2.970297%;top:0">&nbsp;</div>
4+
<div style="background-color:black;width:2.970297%;height:100%;position:absolute;left:5.940594%;top:0">&nbsp;</div>
5+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:10.891089%;top:0">&nbsp;</div>
6+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:14.851485%;top:0">&nbsp;</div>
7+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:18.811881%;top:0">&nbsp;</div>
8+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:21.782178%;top:0">&nbsp;</div>
9+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:23.762376%;top:0">&nbsp;</div>
10+
<div style="background-color:black;width:2.970297%;height:100%;position:absolute;left:27.722772%;top:0">&nbsp;</div>
11+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:32.673267%;top:0">&nbsp;</div>
12+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:35.643564%;top:0">&nbsp;</div>
13+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:40.594059%;top:0">&nbsp;</div>
14+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:43.564356%;top:0">&nbsp;</div>
15+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:46.534653%;top:0">&nbsp;</div>
16+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:52.475248%;top:0">&nbsp;</div>
17+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:54.455446%;top:0">&nbsp;</div>
18+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:58.415842%;top:0">&nbsp;</div>
19+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:63.366337%;top:0">&nbsp;</div>
20+
<div style="background-color:black;width:3.960396%;height:100%;position:absolute;left:65.346535%;top:0">&nbsp;</div>
21+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:70.29703%;top:0">&nbsp;</div>
22+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:72.277228%;top:0">&nbsp;</div>
23+
<div style="background-color:black;width:2.970297%;height:100%;position:absolute;left:76.237624%;top:0">&nbsp;</div>
24+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:80.19802%;top:0">&nbsp;</div>
25+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:82.178218%;top:0">&nbsp;</div>
26+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:87.128713%;top:0">&nbsp;</div>
27+
<div style="background-color:black;width:2.970297%;height:100%;position:absolute;left:92.079208%;top:0">&nbsp;</div>
28+
<div style="background-color:black;width:0.990099%;height:100%;position:absolute;left:96.039604%;top:0">&nbsp;</div>
29+
<div style="background-color:black;width:1.980198%;height:100%;position:absolute;left:98.019802%;top:0">&nbsp;</div>
30+
</div>

0 commit comments

Comments
 (0)