baks-dev/barcode
Laravel/PHP 8.4+ пакет для генерации и считывания штрихкодов: Aztec, Code39/93/128, DataMatrix, EAN-8/13, ITF, PDF417, QRCode, UPC-A/E. Требует imagick и вспомогательные утилиты для обработки изображений/PDF.
Installation:
composer require baks-dev/barcode
Ensure your server has imagick, libpoppler-glib-dev, and librsvg2-dev installed (see README).
Grant Execute Permissions:
chmod +x vendor/baks-dev/barcode/Writer/Generate
chmod +x vendor/baks-dev/barcode/Reader/Decode
chmod +x vendor/baks-dev/barcode/Pdf/PdfCropImg
First Use Case: Generate a QR code in Laravel:
use BaksDev\Barcode\Facades\BarcodeGenerator;
$path = BarcodeGenerator::generate('QRCode', 'https://example.com', [
'save' => true,
'format' => 'png',
'outputPath' => storage_path('app/barcodes/qr_example.png'),
]);
Decode a Barcode:
use BaksDev\Barcode\Facades\BarcodeReader;
$result = BarcodeReader::decode(storage_path('app/barcodes/qr_example.png'));
// Returns: ['text' => 'https://example.com', 'type' => 'QRCode']
PDF Integration: Embed a barcode in a PDF:
use BaksDev\Barcode\Facades\PdfBarcode;
$pdfPath = PdfBarcode::embedBarcode(
storage_path('app/invoice.pdf'),
'EAN-13',
'1234567890128',
100, // x position
100 // y position
);
Dynamic Generation: Use facades or service container bindings to generate barcodes on demand:
// In a controller or service
public function generateLabel($sku) {
$path = BarcodeGenerator::generate('EAN-13', $sku, [
'format' => 'png',
'outputPath' => storage_path("app/barcodes/{$sku}.png"),
'scale' => 3,
]);
return response()->file($path);
}
Batch Processing: Offload to a queue job for high-volume generation (e.g., inventory labels):
// app/Jobs/GenerateBarcodeJob.php
public function handle() {
foreach ($this->products as $product) {
BarcodeGenerator::generate('DataMatrix', $product->serial_number, [
'outputPath' => storage_path("app/barcodes/{$product->id}.png"),
]);
}
}
Storage Integration: Save to disk or cloud storage (e.g., S3) with Laravel’s filesystem:
use Illuminate\Support\Facades\Storage;
$path = BarcodeGenerator::generate('Code128', 'ABC123', [
'save' => true,
'format' => 'png',
'outputPath' => Storage::disk('s3')->path('barcodes/ABC123.png'),
]);
API Endpoint for Scanning:
// routes/api.php
Route::post('/barcodes/decode', function (Request $request) {
$file = $request->file('barcode_image');
$result = BarcodeReader::decode($file->path());
return response()->json($result);
});
Validation: Handle decoding failures gracefully:
try {
$result = BarcodeReader::decode($imagePath);
return $result['text'];
} catch (\Exception $e) {
Log::error("Barcode decode failed: " . $e->getMessage());
return null;
}
Dynamic Invoice Labels:
Embed barcodes in PDFs generated with libraries like barryvdh/laravel-dompdf:
use BaksDev\Barcode\Facades\PdfBarcode;
$pdf = PDF::loadView('invoice', ['order' => $order]);
PdfBarcode::embedBarcode(
$pdf->output(),
'PDF417',
$order->tracking_number,
50, 50
);
Multi-Page Documents:
Use PdfCropImg for complex layouts:
# CLI usage (e.g., in a Laravel command)
vendor/baks-dev/barcode/Pdf/PdfCropImg input.pdf output.pdf barcode.png 100 100
Bind to Interface:
// app/Providers/AppServiceProvider.php
public function register() {
$this->app->bind(\BaksDev\Barcode\Contracts\BarcodeGenerator::class, function () {
return new \BaksDev\Barcode\Services\BarcodeGenerator();
});
}
Dependency Injection:
public function __construct(private BarcodeGenerator $generator) {}
public function createBarcode() {
$this->generator->generate('QRCode', 'data');
}
Artisan Commands: Create custom commands for bulk operations:
// app/Console/Commands/GenerateBulkBarcodes.php
public function handle() {
foreach ($this->products as $product) {
BarcodeGenerator::generate('EAN-13', $product->sku, [
'outputPath' => storage_path("app/barcodes/{$product->id}.png"),
]);
}
}
Events: Trigger events after barcode generation:
// Listen for barcode generation
event(new BarcodeGenerated($barcodeData));
Policies: Restrict barcode generation to authorized users:
public function generate(User $user, $type, $data) {
return $user->can('generate-barcodes');
}
Caching: Cache frequently generated barcodes (e.g., product SKUs):
$path = Cache::remember("barcode_{$sku}", now()->addHours(1), function () use ($sku) {
return BarcodeGenerator::generate('EAN-13', $sku, ['format' => 'png']);
});
Queue Jobs: Use Laravel queues for batch processing:
GenerateBarcodeJob::dispatch($product)->onQueue('barcodes');
Unit Tests: Mock the generator/reader to test logic:
$mock = Mockery::mock(\BaksDev\Barcode\Contracts\BarcodeGenerator::class);
$mock->shouldReceive('generate')->once()->andReturn('/path/to/barcode.png');
$this->app->instance(\BaksDev\Barcode\Contracts\BarcodeGenerator::class, $mock);
Feature Tests: Test barcode generation and decoding:
public function test_barcode_generation() {
$path = BarcodeGenerator::generate('QRCode', 'test', ['format' => 'png']);
$this->assertFileExists($path);
$this->assertStringContainsString('test', file_get_contents($path));
}
Imagick Dependencies:
imagick or incorrect permissions cause failures.php -m | grep imagick and ensure CLI tools have execute permissions.endroid/qr-code for QR-only cases if Imagick is unavailable.PDF Handling:
PdfCropImg may fail with complex PDFs or unsupported fonts.pdftk or ghostscript as alternatives if needed.Barcode Type Limitations:
Aztec) may require specific data formats.Memory Limits:
memory_limit or process in smaller batches.Decoding Accuracy:
imagick (e.g., resize, enhance contrast) before decoding.Path Handling:
outputPath may break in shared hosting.storage_path() or relative paths.CLI Tool Permissions:
Generate, Decode, or `How can I help you explore Laravel packages today?