Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / Gemini PR Review (pull_request) Successful in 16s
Laravel Pint / pint (pull_request) Failing after 2m38s
Laravel Larastan / larastan (pull_request) Failing after 13m18s
1057 lines
38 KiB
PHP
1057 lines
38 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\ItemCharacteristic;
|
|
use App\Models\StickerDetail;
|
|
use App\Models\StickerStructureDetail;
|
|
use Illuminate\Http\Response;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\Schema;
|
|
use TCPDF;
|
|
|
|
class StickerPdfService
|
|
{
|
|
public function generateStickerItem(string $stickerId, Collection $dynamicElements, ?ItemCharacteristic $itemCharacteristic)
|
|
{
|
|
|
|
$dynamicValueMap = [];
|
|
|
|
foreach ($dynamicElements as $element) {
|
|
|
|
$column = $element->characteristics_type;
|
|
|
|
$value = '';
|
|
|
|
if (
|
|
$itemCharacteristic &&
|
|
$column &&
|
|
Schema::hasColumn('item_characteristics', $column)
|
|
) {
|
|
$value = $itemCharacteristic->{$column};
|
|
}
|
|
|
|
$dynamicValueMap[$element->id] = [
|
|
'design_type' => $element->design_element_type, // Text / Image
|
|
'value' => $value,
|
|
];
|
|
}
|
|
|
|
$structure = StickerStructureDetail::where('sticker_id', $stickerId)
|
|
->first();
|
|
|
|
$structureId = $structure->id;
|
|
$elements = StickerDetail::where(
|
|
'sticker_structure_detail_id',
|
|
$structureId
|
|
)->get();
|
|
|
|
$width = (float) $structure->sticker_width;
|
|
$height = (float) $structure->sticker_height;
|
|
|
|
$pdf = new TCPDF('P', 'mm', [$width, $height], true, 'UTF-8', false);
|
|
|
|
// $pdf->SetMargins(
|
|
// (float) $structure->sticker_lmargin,
|
|
// (float) $structure->sticker_tmargin,
|
|
// (float) $structure->sticker_rmargin,
|
|
// );
|
|
|
|
// //$pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
// $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
|
|
$pdf->setPrintHeader(false);
|
|
$pdf->setPrintFooter(false);
|
|
// $pdf->setCellPaddings(0, 0, 0, 0);
|
|
// $pdf->setCellMargins(5, 5, 5, 5);
|
|
|
|
// Set margins
|
|
// $pdf->SetMargins(5, 5, 5); // left, top, right
|
|
|
|
$pdf->SetMargins(
|
|
(float) $structure->sticker_lmargin,
|
|
(float) $structure->sticker_tmargin,
|
|
(float) $structure->sticker_rmargin,
|
|
);
|
|
$pdf->SetAutoPageBreak(false, 0);
|
|
|
|
$pdf->AddPage();
|
|
|
|
$pdf->SetFont('helvetica', 'B', 10);
|
|
|
|
foreach ($elements as $row) {
|
|
|
|
switch ($row->design_element_type) {
|
|
|
|
case 'Text':
|
|
|
|
$pdf->SetFont(
|
|
$row->string_font ?? 'helvetica',
|
|
'',
|
|
(int) ($row->string_size ?? 10)
|
|
);
|
|
|
|
$pdf->SetTextColor(
|
|
...$this->hexToRgb($row->element_colour ?? '#000000')
|
|
);
|
|
|
|
$textValue = $row->string_value ?? '';
|
|
|
|
if (
|
|
$row->element_type == 'Dynamic' &&
|
|
isset($dynamicValueMap[$row->id])
|
|
) {
|
|
$textValue = $dynamicValueMap[$row->id]['value'];
|
|
}
|
|
|
|
$pdf->Text(
|
|
(float) ($row->string_x_value ?? 0),
|
|
(float) ($row->string_y_value ?? 0),
|
|
(string) $textValue
|
|
);
|
|
|
|
break;
|
|
|
|
case 'QR':
|
|
$pdf->write2DBarcode(
|
|
$row->qr_value ?? '',
|
|
'QRCODE,H',
|
|
(float) ($row->qr_x_value ?? 0),
|
|
(float) ($row->qr_y_value ?? 0),
|
|
(float) ($row->qr_size ?? 10),
|
|
(float) ($row->qr_size ?? 10)
|
|
);
|
|
break;
|
|
|
|
case 'Image':
|
|
|
|
$imagePath = null;
|
|
|
|
if (
|
|
$row->element_type == 'Dynamic' &&
|
|
isset($dynamicValueMap[$row->id]) &&
|
|
! empty($dynamicValueMap[$row->id]['value'])
|
|
) {
|
|
$imageName = strtolower($dynamicValueMap[$row->id]['value']).'.png';
|
|
|
|
$imagePath = public_path('images/'.ltrim($imageName, '/'));
|
|
}
|
|
|
|
$pdf->Image(
|
|
$imagePath,
|
|
(float) ($row->image_x ?? 0),
|
|
(float) ($row->image_y ?? 0),
|
|
(float) ($row->image_width ?? 0),
|
|
(float) ($row->image_height ?? 0)
|
|
);
|
|
break;
|
|
case 'Shape':
|
|
if ($row->shape_name == 'Line') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$pdf->Line(
|
|
(float) $row->shape_x1_value,
|
|
(float) $row->shape_y1_value,
|
|
(float) $row->shape_x2_value,
|
|
(float) $row->shape_y2_value
|
|
);
|
|
} elseif ($row->shape_name == 'Rectangle') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$x1 = (float) $row->shape_x1_value;
|
|
$y1 = (float) $row->shape_y1_value;
|
|
$x2 = (float) $row->shape_x2_value;
|
|
$y2 = (float) $row->shape_y2_value;
|
|
|
|
$x = min($x1, $x2);
|
|
$y = min($y1, $y2);
|
|
$width = abs($x2 - $x1);
|
|
$height = abs($y2 - $y1);
|
|
|
|
$pdf->Rect($x, $y, $width, $height, 'D');
|
|
} elseif ($row->shape_name == 'CurvedRectangle') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$x1 = (float) $row->shape_x1_value;
|
|
$y1 = (float) $row->shape_y1_value;
|
|
$x2 = (float) $row->shape_x2_value;
|
|
$y2 = (float) $row->shape_y2_value;
|
|
|
|
$x = min($x1, $x2);
|
|
$y = min($y1, $y2);
|
|
$width = abs($x2 - $x1);
|
|
$height = abs($y2 - $y1);
|
|
|
|
// radius in mm
|
|
// $radius = 3;
|
|
$radius = (float) $row->curve_radius;
|
|
|
|
$pdf->RoundedRect(
|
|
$x,
|
|
$y,
|
|
$width,
|
|
$height,
|
|
$radius,
|
|
'1111', // ← round all 4 corners (default)
|
|
'D'
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
$pdfContent = $pdf->Output('', 'S'); // 'S' returns string
|
|
|
|
// Encode as base64
|
|
return base64_encode($pdfContent);
|
|
|
|
// // return $pdf->Output('sticker.pdf', 'S');
|
|
// $pdfContent = $pdf->Output('sticker.pdf', 'S');
|
|
|
|
// return (new Response($pdfContent, 200))
|
|
// ->header('Content-Type', 'application/pdf')
|
|
// ->header('Content-Disposition', 'inline; filename="sticker.pdf"');
|
|
|
|
}
|
|
|
|
public function generate1(string $stickerId, Collection $dynamicElements, ?ItemCharacteristic $itemCharacteristic)
|
|
{
|
|
|
|
$dynamicValueMap = [];
|
|
|
|
foreach ($dynamicElements as $element) {
|
|
|
|
$column = $element->characteristics_type;
|
|
|
|
$value = '';
|
|
|
|
if (
|
|
$itemCharacteristic &&
|
|
$column &&
|
|
Schema::hasColumn('item_characteristics', $column)
|
|
) {
|
|
$value = $itemCharacteristic->{$column};
|
|
}
|
|
|
|
$dynamicValueMap[$element->id] = [
|
|
'design_type' => $element->design_element_type, // Text / Image
|
|
'value' => $value,
|
|
];
|
|
}
|
|
|
|
$structure = StickerStructureDetail::where('sticker_id', $stickerId)
|
|
->first();
|
|
|
|
$structureId = $structure->id;
|
|
$elements = StickerDetail::where(
|
|
'sticker_structure_detail_id',
|
|
$structureId
|
|
)->get();
|
|
|
|
$width = (float) $structure->sticker_width;
|
|
$height = (float) $structure->sticker_height;
|
|
|
|
$pdf = new TCPDF('P', 'mm', [$width, $height], true, 'UTF-8', false);
|
|
|
|
// $pdf->SetMargins(
|
|
// (float) $structure->sticker_lmargin,
|
|
// (float) $structure->sticker_tmargin,
|
|
// (float) $structure->sticker_rmargin,
|
|
// );
|
|
|
|
// //$pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
// $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
|
|
$pdf->setPrintHeader(false);
|
|
$pdf->setPrintFooter(false);
|
|
// $pdf->setCellPaddings(0, 0, 0, 0);
|
|
// $pdf->setCellMargins(5, 5, 5, 5);
|
|
|
|
// Set margins
|
|
// $pdf->SetMargins(5, 5, 5); // left, top, right
|
|
|
|
$pdf->SetMargins(
|
|
(float) $structure->sticker_lmargin,
|
|
(float) $structure->sticker_tmargin,
|
|
(float) $structure->sticker_rmargin,
|
|
);
|
|
$pdf->SetAutoPageBreak(false, 0);
|
|
|
|
$pdf->AddPage();
|
|
|
|
$pdf->SetFont('helvetica', 'B', 10);
|
|
|
|
foreach ($elements as $row) {
|
|
|
|
switch ($row->design_element_type) {
|
|
|
|
case 'Text':
|
|
|
|
$pdf->SetFont(
|
|
$row->string_font ?? 'helvetica',
|
|
'',
|
|
(int) ($row->string_size ?? 10)
|
|
);
|
|
|
|
$pdf->SetTextColor(
|
|
...$this->hexToRgb($row->element_colour ?? '#000000')
|
|
);
|
|
|
|
$textValue = $row->string_value ?? '';
|
|
|
|
if (
|
|
$row->element_type == 'Dynamic' &&
|
|
isset($dynamicValueMap[$row->id])
|
|
) {
|
|
$textValue = $dynamicValueMap[$row->id]['value'];
|
|
}
|
|
|
|
$pdf->Text(
|
|
(float) ($row->string_x_value ?? 0),
|
|
(float) ($row->string_y_value ?? 0),
|
|
(string) $textValue
|
|
);
|
|
|
|
break;
|
|
|
|
case 'QR':
|
|
$pdf->write2DBarcode(
|
|
$row->qr_value ?? '',
|
|
'QRCODE,H',
|
|
(float) ($row->qr_x_value ?? 0),
|
|
(float) ($row->qr_y_value ?? 0),
|
|
(float) ($row->qr_size ?? 10),
|
|
(float) ($row->qr_size ?? 10)
|
|
);
|
|
break;
|
|
|
|
case 'Image':
|
|
|
|
$imagePath = null;
|
|
|
|
if (
|
|
$row->element_type == 'Dynamic' &&
|
|
isset($dynamicValueMap[$row->id]) &&
|
|
! empty($dynamicValueMap[$row->id]['value'])
|
|
) {
|
|
$imageName = strtolower($dynamicValueMap[$row->id]['value']).'.png';
|
|
|
|
$imagePath = public_path('images/'.ltrim($imageName, '/'));
|
|
}
|
|
|
|
$pdf->Image(
|
|
$imagePath,
|
|
(float) ($row->image_x ?? 0),
|
|
(float) ($row->image_y ?? 0),
|
|
(float) ($row->image_width ?? 0),
|
|
(float) ($row->image_height ?? 0)
|
|
);
|
|
break;
|
|
case 'Shape':
|
|
if ($row->shape_name == 'Line') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$pdf->Line(
|
|
(float) $row->shape_x1_value,
|
|
(float) $row->shape_y1_value,
|
|
(float) $row->shape_x2_value,
|
|
(float) $row->shape_y2_value
|
|
);
|
|
} elseif ($row->shape_name == 'Rectangle') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$x1 = (float) $row->shape_x1_value;
|
|
$y1 = (float) $row->shape_y1_value;
|
|
$x2 = (float) $row->shape_x2_value;
|
|
$y2 = (float) $row->shape_y2_value;
|
|
|
|
$x = min($x1, $x2);
|
|
$y = min($y1, $y2);
|
|
$width = abs($x2 - $x1);
|
|
$height = abs($y2 - $y1);
|
|
|
|
$pdf->Rect($x, $y, $width, $height, 'D');
|
|
} elseif ($row->shape_name == 'CurvedRectangle') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$x1 = (float) $row->shape_x1_value;
|
|
$y1 = (float) $row->shape_y1_value;
|
|
$x2 = (float) $row->shape_x2_value;
|
|
$y2 = (float) $row->shape_y2_value;
|
|
|
|
$x = min($x1, $x2);
|
|
$y = min($y1, $y2);
|
|
$width = abs($x2 - $x1);
|
|
$height = abs($y2 - $y1);
|
|
|
|
// radius in mm
|
|
// $radius = 3;
|
|
$radius = (float) $row->curve_radius;
|
|
|
|
$pdf->RoundedRect(
|
|
$x,
|
|
$y,
|
|
$width,
|
|
$height,
|
|
$radius,
|
|
'1111', // ← round all 4 corners (default)
|
|
'D'
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
// return $pdf->Output('sticker.pdf', 'S');
|
|
$pdfContent = $pdf->Output('sticker.pdf', 'S');
|
|
|
|
return (new Response($pdfContent, 200))
|
|
->header('Content-Type', 'application/pdf')
|
|
->header('Content-Disposition', 'inline; filename="sticker.pdf"');
|
|
|
|
}
|
|
|
|
public function generate(string $stickerId, array $elements)
|
|
{
|
|
$structure = StickerStructureDetail::where('sticker_id', $stickerId)
|
|
->first();
|
|
|
|
// $stickerId = $structure->sticker_id;
|
|
|
|
// $elements = StickerDetail::where('sticker_structure_detail_id', $stickerId)->get();
|
|
|
|
// dd($elements);
|
|
$structureId = $structure->id;
|
|
$elements = StickerDetail::where(
|
|
'sticker_structure_detail_id',
|
|
$structureId
|
|
)->get();
|
|
|
|
$width = (float) $structure->sticker_width;
|
|
$height = (float) $structure->sticker_height;
|
|
|
|
$pdf = new TCPDF('P', 'mm', [$width, $height], true, 'UTF-8', false);
|
|
|
|
// $pdf->SetMargins(
|
|
// (float) $structure->sticker_lmargin,
|
|
// (float) $structure->sticker_tmargin,
|
|
// (float) $structure->sticker_rmargin,
|
|
// );
|
|
|
|
// //$pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
// $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
|
|
$pdf->setPrintHeader(false);
|
|
$pdf->setPrintFooter(false);
|
|
// $pdf->setCellPaddings(0, 0, 0, 0);
|
|
$pdf->setCellMargins(5, 5, 5, 5);
|
|
|
|
// Set margins
|
|
$pdf->SetMargins(5, 5, 5); // left, top, right
|
|
// $pdf->SetAutoPageBreak(false, 0); // bottom = 0
|
|
|
|
$pdf->SetMargins(
|
|
(float) $structure->sticker_lmargin,
|
|
(float) $structure->sticker_tmargin,
|
|
(float) $structure->sticker_rmargin,
|
|
(float) $structure->sticker_bmargin,
|
|
);
|
|
|
|
// $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
// $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
|
|
// dd($pdf->getMargins());
|
|
|
|
$pdf->AddPage();
|
|
|
|
$pdf->SetFont('helvetica', 'B', 10); // font, style, size in points
|
|
|
|
// // 📍 ADD TEXT: 3mm from left, 10mm from top
|
|
// $pdf->Text(3, 10, 'Sticker ID: ' . $stickerId);
|
|
|
|
// // Optional: add more text
|
|
// $pdf->SetFont('helvetica', '', 8);
|
|
// $pdf->Text(45, 45, 'Batch: X1');
|
|
// $pdf->Text(3, 20, '✓ Valid');
|
|
|
|
foreach ($elements as $row) {
|
|
|
|
switch ($row->design_element_type) {
|
|
|
|
case 'Text':
|
|
$pdf->SetFont(
|
|
$row->string_font ?? 'helvetica',
|
|
'',
|
|
(int) ($row->string_size ?? 10)
|
|
);
|
|
$pdf->SetTextColor(...$this->hexToRgb($row->element_colour ?? '#000000'));
|
|
$pdf->Text(
|
|
(float) ($row->string_x_value ?? 0),
|
|
(float) ($row->string_y_value ?? 0),
|
|
$row->string_value ?? ''
|
|
);
|
|
break;
|
|
|
|
case 'QR':
|
|
$pdf->write2DBarcode(
|
|
$row->qr_value ?? '',
|
|
'QRCODE,H',
|
|
(float) ($row->qr_x_value ?? 0),
|
|
(float) ($row->qr_y_value ?? 0),
|
|
(float) ($row->qr_size ?? 10),
|
|
(float) ($row->qr_size ?? 10)
|
|
);
|
|
break;
|
|
|
|
case 'Image':
|
|
if (empty($row->image_path)) {
|
|
break;
|
|
}
|
|
|
|
$imagePath = storage_path('app/public/'.ltrim($row->image_path, '/'));
|
|
|
|
// Optional: check if file actually exists (avoid TCPDF crash)
|
|
if (! file_exists($imagePath)) {
|
|
// Log or skip — or use a placeholder
|
|
break;
|
|
}
|
|
|
|
$pdf->Image(
|
|
$imagePath,
|
|
(float) ($row->image_x ?? 0),
|
|
(float) ($row->image_y ?? 0),
|
|
(float) ($row->image_width ?? 0),
|
|
(float) ($row->image_height ?? 0)
|
|
);
|
|
break;
|
|
case 'Shape':
|
|
if ($row->shape_name == 'Line') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$pdf->Line(
|
|
(float) $row->shape_x1_value,
|
|
(float) $row->shape_y1_value,
|
|
(float) $row->shape_x2_value,
|
|
(float) $row->shape_y2_value
|
|
);
|
|
} elseif ($row->shape_name == 'Rectangle') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$x1 = (float) $row->shape_x1_value;
|
|
$y1 = (float) $row->shape_y1_value;
|
|
$x2 = (float) $row->shape_x2_value;
|
|
$y2 = (float) $row->shape_y2_value;
|
|
|
|
$x = min($x1, $x2);
|
|
$y = min($y1, $y2);
|
|
$width = abs($x2 - $x1);
|
|
$height = abs($y2 - $y1);
|
|
|
|
$pdf->Rect($x, $y, $width, $height, 'D');
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
// return $pdf->Output('sticker.pdf', 'S');
|
|
$pdfContent = $pdf->Output('sticker.pdf', 'S');
|
|
|
|
return (new Response($pdfContent, 200))
|
|
->header('Content-Type', 'application/pdf')
|
|
->header('Content-Disposition', 'inline; filename="sticker.pdf"');
|
|
}
|
|
|
|
public function generateSticker(string $stickerId, array $elements)
|
|
{
|
|
$structure = StickerStructureDetail::where('sticker_id', $stickerId)
|
|
->first();
|
|
|
|
// $stickerId = $structure->sticker_id;
|
|
|
|
// $elements = StickerDetail::where('sticker_structure_detail_id', $stickerId)->get();
|
|
|
|
// dd($elements);
|
|
$structureId = $structure->id;
|
|
$elements = StickerDetail::where(
|
|
'sticker_structure_detail_id',
|
|
$structureId
|
|
)->get();
|
|
|
|
$width = (float) $structure->sticker_width;
|
|
$height = (float) $structure->sticker_height;
|
|
|
|
$pdf = new TCPDF('P', 'mm', [$width, $height], true, 'UTF-8', false);
|
|
|
|
// $pdf->SetMargins(
|
|
// (float) $structure->sticker_lmargin,
|
|
// (float) $structure->sticker_tmargin,
|
|
// (float) $structure->sticker_rmargin,
|
|
// );
|
|
|
|
// //$pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
// $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
|
|
$pdf->setPrintHeader(false);
|
|
$pdf->setPrintFooter(false);
|
|
// $pdf->setCellPaddings(0, 0, 0, 0);
|
|
$pdf->setCellMargins(5, 5, 5, 5);
|
|
|
|
// Set margins
|
|
$pdf->SetMargins(5, 5, 5); // left, top, right
|
|
// $pdf->SetAutoPageBreak(false, 0); // bottom = 0
|
|
|
|
$pdf->SetMargins(
|
|
(float) $structure->sticker_lmargin,
|
|
(float) $structure->sticker_tmargin,
|
|
(float) $structure->sticker_rmargin,
|
|
(float) $structure->sticker_bmargin,
|
|
);
|
|
|
|
// $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
// $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
|
|
// dd($pdf->getMargins());
|
|
|
|
$pdf->AddPage();
|
|
|
|
$pdf->SetFont('helvetica', 'B', 10); // font, style, size in points
|
|
|
|
// // 📍 ADD TEXT: 3mm from left, 10mm from top
|
|
// $pdf->Text(3, 10, 'Sticker ID: ' . $stickerId);
|
|
|
|
// // Optional: add more text
|
|
// $pdf->SetFont('helvetica', '', 8);
|
|
// $pdf->Text(45, 45, 'Batch: X1');
|
|
// $pdf->Text(3, 20, '✓ Valid');
|
|
|
|
foreach ($elements as $row) {
|
|
|
|
switch ($row->design_element_type) {
|
|
|
|
case 'Text':
|
|
$pdf->SetFont(
|
|
$row->string_font ?? 'helvetica',
|
|
'',
|
|
(int) ($row->string_size ?? 10)
|
|
);
|
|
$pdf->SetTextColor(...$this->hexToRgb($row->element_colour ?? '#000000'));
|
|
$pdf->Text(
|
|
(float) ($row->string_x_value ?? 0),
|
|
(float) ($row->string_y_value ?? 0),
|
|
$row->string_value ?? ''
|
|
);
|
|
break;
|
|
|
|
case 'QR':
|
|
$pdf->write2DBarcode(
|
|
$row->qr_value ?? '',
|
|
'QRCODE,H',
|
|
(float) ($row->qr_x_value ?? 0),
|
|
(float) ($row->qr_y_value ?? 0),
|
|
(float) ($row->qr_size ?? 10),
|
|
(float) ($row->qr_size ?? 10)
|
|
);
|
|
break;
|
|
|
|
case 'Image':
|
|
if (empty($row->image_path)) {
|
|
break;
|
|
}
|
|
|
|
$imagePath = storage_path('app/public/'.ltrim($row->image_path, '/'));
|
|
|
|
// Optional: check if file actually exists (avoid TCPDF crash)
|
|
if (! file_exists($imagePath)) {
|
|
// Log or skip — or use a placeholder
|
|
break;
|
|
}
|
|
|
|
$pdf->Image(
|
|
$imagePath,
|
|
(float) ($row->image_x ?? 0),
|
|
(float) ($row->image_y ?? 0),
|
|
(float) ($row->image_width ?? 0),
|
|
(float) ($row->image_height ?? 0)
|
|
);
|
|
break;
|
|
case 'Shape':
|
|
if ($row->shape_name == 'Line') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$pdf->Line(
|
|
(float) $row->shape_x1_value,
|
|
(float) $row->shape_y1_value,
|
|
(float) $row->shape_x2_value,
|
|
(float) $row->shape_y2_value
|
|
);
|
|
} elseif ($row->shape_name == 'Rectangle') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$x1 = (float) $row->shape_x1_value;
|
|
$y1 = (float) $row->shape_y1_value;
|
|
$x2 = (float) $row->shape_x2_value;
|
|
$y2 = (float) $row->shape_y2_value;
|
|
|
|
$x = min($x1, $x2);
|
|
$y = min($y1, $y2);
|
|
$width = abs($x2 - $x1);
|
|
$height = abs($y2 - $y1);
|
|
|
|
$pdf->Rect($x, $y, $width, $height, 'D');
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
$pdfContent = $pdf->Output('', 'S'); // 'S' returns string
|
|
|
|
// Encode as base64
|
|
return base64_encode($pdfContent);
|
|
|
|
// // return $pdf->Output('sticker.pdf', 'S');
|
|
// $pdfContent = $pdf->Output('sticker.pdf', 'S');
|
|
|
|
// return (new Response($pdfContent, 200))
|
|
// ->header('Content-Type', 'application/pdf')
|
|
// ->header('Content-Disposition', 'inline; filename="sticker.pdf"');
|
|
}
|
|
|
|
public function generatePdf1(string $stickerId, Collection $dynamicElements, ?ItemCharacteristic $itemCharacteristic, ?string $serialNumber)
|
|
{
|
|
|
|
$dynamicValueMap = [];
|
|
|
|
foreach ($dynamicElements as $element) {
|
|
|
|
$column = $element->characteristics_type;
|
|
|
|
$value = '';
|
|
|
|
if (
|
|
$itemCharacteristic &&
|
|
$column &&
|
|
Schema::hasColumn('item_characteristics', $column)
|
|
) {
|
|
$value = $itemCharacteristic->{$column};
|
|
}
|
|
|
|
$dynamicValueMap[$element->id] = [
|
|
'design_type' => $element->design_element_type, // Text / Image
|
|
'value' => $value,
|
|
];
|
|
}
|
|
|
|
$structure = StickerStructureDetail::where('sticker_id', $stickerId)
|
|
->first();
|
|
|
|
$structureId = $structure->id;
|
|
$elements = StickerDetail::where(
|
|
'sticker_structure_detail_id',
|
|
$structureId
|
|
)->get();
|
|
|
|
$width = (float) $structure->sticker_width;
|
|
$height = (float) $structure->sticker_height;
|
|
|
|
$pdf = new TCPDF('P', 'mm', [$width, $height], true, 'UTF-8', false);
|
|
|
|
// $pdf->SetMargins(
|
|
// (float) $structure->sticker_lmargin,
|
|
// (float) $structure->sticker_tmargin,
|
|
// (float) $structure->sticker_rmargin,
|
|
// );
|
|
|
|
// //$pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
// $pdf->SetAutoPageBreak(false, (float) $structure->sticker_bmargin);
|
|
|
|
$pdf->setPrintHeader(false);
|
|
$pdf->setPrintFooter(false);
|
|
// $pdf->setCellPaddings(0, 0, 0, 0);
|
|
// $pdf->setCellMargins(5, 5, 5, 5);
|
|
|
|
// Set margins
|
|
// $pdf->SetMargins(5, 5, 5); // left, top, right
|
|
|
|
$pdf->SetMargins(
|
|
(float) $structure->sticker_lmargin,
|
|
(float) $structure->sticker_tmargin,
|
|
(float) $structure->sticker_rmargin,
|
|
);
|
|
$pdf->SetAutoPageBreak(false, 0);
|
|
|
|
$pdf->AddPage();
|
|
|
|
if (!empty($serialNumber)) {
|
|
$pdf->SetFont('helvetica', 'B', 10);
|
|
$pdf->SetTextColor(0, 0, 0);
|
|
|
|
// HARD-CODED POSITION (mm)
|
|
$x = 40; // change as needed
|
|
$y = 60; // change as needed
|
|
|
|
$pdf->Text($x, $y, (string) $serialNumber);
|
|
}
|
|
|
|
$pdf->SetFont('helvetica', 'B', 10);
|
|
|
|
foreach ($elements as $row) {
|
|
|
|
switch ($row->design_element_type) {
|
|
|
|
case 'Text':
|
|
|
|
$pdf->SetFont(
|
|
$row->string_font ?? 'helvetica',
|
|
'',
|
|
(int) ($row->string_size ?? 10)
|
|
);
|
|
|
|
$pdf->SetTextColor(
|
|
...$this->hexToRgb($row->element_colour ?? '#000000')
|
|
);
|
|
|
|
$textValue = $row->string_value ?? '';
|
|
|
|
if (
|
|
$row->element_type == 'Dynamic' &&
|
|
isset($dynamicValueMap[$row->id])
|
|
) {
|
|
$textValue = $dynamicValueMap[$row->id]['value'];
|
|
}
|
|
|
|
$pdf->Text(
|
|
(float) ($row->string_x_value ?? 0),
|
|
(float) ($row->string_y_value ?? 0),
|
|
(string) $textValue
|
|
);
|
|
|
|
break;
|
|
|
|
case 'QR':
|
|
$pdf->write2DBarcode(
|
|
$row->qr_value ?? '',
|
|
'QRCODE,H',
|
|
(float) ($row->qr_x_value ?? 0),
|
|
(float) ($row->qr_y_value ?? 0),
|
|
(float) ($row->qr_size ?? 10),
|
|
(float) ($row->qr_size ?? 10)
|
|
);
|
|
break;
|
|
|
|
case 'Image':
|
|
|
|
$imagePath = null;
|
|
|
|
if (
|
|
$row->element_type == 'Dynamic' &&
|
|
isset($dynamicValueMap[$row->id]) &&
|
|
! empty($dynamicValueMap[$row->id]['value'])
|
|
) {
|
|
$imageName = strtolower($dynamicValueMap[$row->id]['value']).'.png';
|
|
|
|
$imagePath = public_path('images/'.ltrim($imageName, '/'));
|
|
}
|
|
|
|
$pdf->Image(
|
|
$imagePath,
|
|
(float) ($row->image_x ?? 0),
|
|
(float) ($row->image_y ?? 0),
|
|
(float) ($row->image_width ?? 0),
|
|
(float) ($row->image_height ?? 0)
|
|
);
|
|
break;
|
|
case 'Shape':
|
|
if ($row->shape_name == 'Line') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$pdf->Line(
|
|
(float) $row->shape_x1_value,
|
|
(float) $row->shape_y1_value,
|
|
(float) $row->shape_x2_value,
|
|
(float) $row->shape_y2_value
|
|
);
|
|
} elseif ($row->shape_name == 'Rectangle') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$x1 = (float) $row->shape_x1_value;
|
|
$y1 = (float) $row->shape_y1_value;
|
|
$x2 = (float) $row->shape_x2_value;
|
|
$y2 = (float) $row->shape_y2_value;
|
|
|
|
$x = min($x1, $x2);
|
|
$y = min($y1, $y2);
|
|
$width = abs($x2 - $x1);
|
|
$height = abs($y2 - $y1);
|
|
|
|
$pdf->Rect($x, $y, $width, $height, 'D');
|
|
} elseif ($row->shape_name == 'CurvedRectangle') {
|
|
$pdf->SetLineWidth((float) ($row->shape_pen_size ?? 0.3));
|
|
|
|
if (isset($row->element_colour)) {
|
|
$rgb = $this->hexToRgb($row->element_colour);
|
|
$pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
|
|
} else {
|
|
$pdf->SetDrawColor(0, 0, 0);
|
|
}
|
|
|
|
$x1 = (float) $row->shape_x1_value;
|
|
$y1 = (float) $row->shape_y1_value;
|
|
$x2 = (float) $row->shape_x2_value;
|
|
$y2 = (float) $row->shape_y2_value;
|
|
|
|
$x = min($x1, $x2);
|
|
$y = min($y1, $y2);
|
|
$width = abs($x2 - $x1);
|
|
$height = abs($y2 - $y1);
|
|
|
|
// radius in mm
|
|
// $radius = 3;
|
|
$radius = (float) $row->curve_radius;
|
|
|
|
$pdf->RoundedRect(
|
|
$x,
|
|
$y,
|
|
$width,
|
|
$height,
|
|
$radius,
|
|
'1111', // ← round all 4 corners (default)
|
|
'D'
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
// return $pdf->Output('sticker.pdf', 'S');
|
|
$pdfContent = $pdf->Output('sticker1.pdf', 'S');
|
|
$filename = "sticker_{$stickerId}_" . time() . ".pdf";
|
|
|
|
// return (new Response($pdfContent, 200))
|
|
// ->header('Content-Type', 'application/pdf');
|
|
// ->header('Content-Disposition', 'inline; filename="sticker.pdf"');
|
|
return response($pdfContent, 200)
|
|
->header('Content-Type', 'application/pdf')
|
|
->header('Content-Disposition', 'inline; filename="'.$filename.'"')
|
|
->header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')
|
|
->header('Pragma', 'no-cache')
|
|
->header('Expires', '0');
|
|
|
|
}
|
|
|
|
// private function hexToRgb($hex)
|
|
// {
|
|
// $hex = ltrim($hex, '#');
|
|
// return [
|
|
// hexdec(substr($hex, 0, 2)),
|
|
// hexdec(substr($hex, 2, 2)),
|
|
// hexdec(substr($hex, 4, 2)),
|
|
// ];
|
|
// }
|
|
private function hexToRgb($hex)
|
|
{
|
|
if (! is_string($hex) || ($hex = trim($hex)) === '') {
|
|
return [0, 0, 0];
|
|
}
|
|
$hex = ltrim($hex, '#');
|
|
if (strlen($hex) == 3) {
|
|
$hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
|
|
}
|
|
if (strlen($hex) !== 6 || ! ctype_xdigit($hex)) {
|
|
return [0, 0, 0];
|
|
}
|
|
|
|
return [
|
|
hexdec(substr($hex, 0, 2)), // integer
|
|
hexdec(substr($hex, 2, 2)), // integer
|
|
hexdec(substr($hex, 4, 2)), // integer
|
|
];
|
|
}
|
|
}
|