Autosave: 20260521-205255

This commit is contained in:
Flatlogic Bot 2026-05-21 20:52:55 +00:00
parent 1a7ea8d1c8
commit cd09784a88
3 changed files with 89 additions and 58 deletions

View File

@ -66,45 +66,44 @@ if (empty($codes)) {
align-items: center; align-items: center;
overflow: hidden; overflow: hidden;
text-align: center; text-align: center;
padding: 5mm 1mm 1mm 1mm; /* Restaurado a 5mm para bajar el contenido */ padding: 2mm 1mm 1mm 1mm; /* Reducido para dar más espacio vertical */
border: 0.1mm solid #eee; /* Guía visual en pantalla */ border: 0.1mm solid #eee; /* Guía visual en pantalla */
} }
.producto-nombre { .producto-nombre {
font-size: 6px; font-size: 6px;
font-weight: normal; line-height: 1.1;
line-height: 1; margin-bottom: 1.5mm; /* Aumentado para separar del código */
margin-bottom: 1mm;
text-transform: uppercase; text-transform: uppercase;
white-space: nowrap; display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis;
width: 100%; width: 100%;
word-break: break-all;
} }
.barcode-container { .barcode-container {
height: 9mm; /* Revertido a 9mm */ height: 9mm;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin: 1mm 0; /* Margen vertical */ margin: 0.8mm 0; /* Ajuste milimétrico vertical */
padding: 0 1mm; padding: 0 1mm;
box-sizing: border-box; box-sizing: border-box;
width: 100%; /* Ocupa el ancho de la etiqueta para centrar */ width: 100%;
} }
.barcode-container svg { .barcode-container svg {
height: 9mm; /* Revertido a 9mm */ height: 9mm;
width: auto; width: auto;
display: block; display: block;
margin: 0 auto; margin: 0 auto;
shape-rendering: crispEdges;
} }
.sku-text { .sku-text {
font-size: 7px; font-size: 7px;
font-weight: normal; margin-top: 1.2mm; /* Aumentado para separar del código */
margin-top: 0.5mm;
letter-spacing: 0.5px; letter-spacing: 0.5px;
} }
@ -152,8 +151,8 @@ if (empty($codes)) {
<div class="producto-nombre"><?php echo htmlspecialchars($name); ?></div> <div class="producto-nombre"><?php echo htmlspecialchars($name); ?></div>
<div class="barcode-container"> <div class="barcode-container">
<?php <?php
// widthFactor 1.1 para barras más negras/gruesas sin perder escaneo // widthFactor 1.0 y barReduction 0.15 para separar un poco más las barras
echo $generator->getBarcode($code, 1.1, 72); echo $generator->getBarcode($code, 1.0, 72, 'black', 0.15);
?> ?>
</div> </div>
<div class="sku-text"><?php echo htmlspecialchars($code); ?></div> <div class="sku-text"><?php echo htmlspecialchars($code); ?></div>

View File

@ -11,7 +11,7 @@ class BarcodeGenerator
$this->barcode_codes = $this->getCode128Map(); $this->barcode_codes = $this->getCode128Map();
} }
public function getBarcode($code, $widthFactor = 1, $height = 50, $foregroundColor = 'black') public function getBarcode($code, $widthFactor = 1, $height = 50, $foregroundColor = 'black', $barReduction = 0)
{ {
$barcodeData = $this->getBarcodeData($code); $barcodeData = $this->getBarcodeData($code);
if (!$barcodeData) return ''; if (!$barcodeData) return '';
@ -22,9 +22,12 @@ class BarcodeGenerator
$barArray = str_split($barcodeData['bars']); $barArray = str_split($barcodeData['bars']);
for ($i = 0; $i < count($barArray); $i++) { for ($i = 0; $i < count($barArray); $i++) {
$width = $widthFactor * (int)$barArray[$i]; $val = (int)$barArray[$i];
$width = $widthFactor * $val;
if ($i % 2 == 0) { // Even indices are bars, odd are spaces if ($i % 2 == 0) { // Even indices are bars, odd are spaces
$bars .= '<rect x="' . $x . '" y="0" width="' . $width . '" height="' . $height . '" style="fill:' . $foregroundColor . ';" />'; // Apply bar reduction to increase white space between bars
$drawWidth = max(0.4, $width - $barReduction);
$bars .= '<rect x="' . $x . '" y="0" width="' . $drawWidth . '" height="' . $height . '" style="fill:' . $foregroundColor . ';" />';
} }
$x += $width; $x += $width;
} }
@ -43,12 +46,26 @@ class BarcodeGenerator
$len = strlen($code); $len = strlen($code);
$indices = []; $indices = [];
$indices[] = 104; // Start B // Check if code is purely numeric and has even length for Code 128C
// Or just use Code 128B as fallback
for ($i = 0; $i < $len; $i++) { if (ctype_digit($code) && $len >= 2) {
$val = $this->getCharValue('B', $code[$i]); $indices[] = 105; // Start C
if ($val !== null) { for ($i = 0; $i < $len; $i += 2) {
$indices[] = $val; if ($i + 1 < $len) {
$indices[] = (int)substr($code, $i, 2);
} else {
// Odd number of digits, switch to B for the last one
$indices[] = 100; // Code B
$indices[] = $this->getCharValue('B', $code[$i]);
}
}
} else {
$indices[] = 104; // Start B
for ($i = 0; $i < $len; $i++) {
$val = $this->getCharValue('B', $code[$i]);
if ($val !== null) {
$indices[] = $val;
}
} }
} }

View File

@ -61,44 +61,43 @@ $generator = new BarcodeGenerator();
align-items: center; align-items: center;
overflow: hidden; overflow: hidden;
text-align: center; text-align: center;
padding: 5mm 1mm 1mm 1mm; /* Restaurado a 5mm para bajar el contenido */ padding: 2mm 1mm 1mm 1mm; /* Reducido para dar más espacio vertical */
} }
.producto-nombre { .producto-nombre {
font-size: 6px; font-size: 6px;
font-weight: normal; line-height: 1.1;
line-height: 1; margin-bottom: 1.5mm; /* Aumentado para separar del código */
margin-bottom: 1mm;
text-transform: uppercase; text-transform: uppercase;
white-space: nowrap; display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis;
width: 100%; width: 100%;
word-break: break-all;
} }
.barcode-container { .barcode-container {
height: 9mm; /* Revertido a 9mm */ height: 9mm;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin: 1mm 0; margin: 0.8mm 0; /* Ajuste milimétrico vertical */
padding: 0 1mm; padding: 0 1mm;
box-sizing: border-box; box-sizing: border-box;
width: 100%; width: 100%;
} }
.barcode-container svg { .barcode-container svg {
height: 9mm; /* Revertido a 9mm */ height: 9mm;
width: auto; width: auto;
display: block; display: block;
margin: 0 auto; margin: 0 auto;
shape-rendering: crispEdges;
} }
.sku-text { .sku-text {
font-size: 7px; font-size: 7px;
font-weight: normal; margin-top: 1.2mm; /* Aumentado para separar del código */
margin-top: 0.5mm;
letter-spacing: 0.5px; letter-spacing: 0.5px;
} }
@ -132,32 +131,48 @@ $generator = new BarcodeGenerator();
<div class="etiquetas-container"> <div class="etiquetas-container">
<?php <?php
$skus = ['AFS-0317', 'AFS-0318', 'AFS-0319', 'SKU-1001', 'SKU-1002', 'SKU-1003', 'TEST-001', 'TEST-002', 'TEST-003']; // Fila 1: Configuración Actual (Equilibrada)
for ($i = 0; $i < 9; $i++): // Fila 2: Líneas Reforzadas (Más gruesas para impresoras con poca fuerza)
$sku = $skus[$i]; // Fila 3: Contraste Alto (Líneas más finas, espacios blancos más grandes)
$skus = ['AFS-0317', 'AFS-0318', 'AFS-0319'];
// Fila 1: Actual
foreach ($skus as $sku) {
echo '<div class="etiqueta">
<div class="producto-nombre">OPCIÓN 1: ACTUAL</div>
<div class="barcode-container">' . $generator->getBarcode($sku, 1.0, 72, 'black', 0.15) . '</div>
<div class="sku-text">' . $sku . '</div>
</div>';
}
// Fila 2: Reforzada (Líneas más gruesas)
foreach ($skus as $sku) {
echo '<div class="etiqueta">
<div class="producto-nombre">OPCIÓN 2: REFORZADA</div>
<div class="barcode-container">' . $generator->getBarcode($sku, 1.1, 72, 'black', 0.05) . '</div>
<div class="sku-text">' . $sku . '</div>
</div>';
}
// Fila 3: Contraste Alto (Líneas más finas)
foreach ($skus as $sku) {
echo '<div class="etiqueta">
<div class="producto-nombre">OPCIÓN 3: FINAS</div>
<div class="barcode-container">' . $generator->getBarcode($sku, 1.0, 72, 'black', 0.25) . '</div>
<div class="sku-text">' . $sku . '</div>
</div>';
}
?> ?>
<div class="etiqueta">
<div class="producto-nombre">PRODUCTO <?php echo $sku; ?></div>
<div class="barcode-container">
<?php
// widthFactor 1.1 para barras más negras/gruesas sin perder escaneo
echo $generator->getBarcode($sku, 1.1, 72);
?>
</div>
<div class="sku-text"><?php echo $sku; ?></div>
</div>
<?php endfor; ?>
</div> </div>
<div class="no-print" style="max-width: 500px; background: white; padding: 15px; border-radius: 8px; margin-top: 20px; font-size: 13px; line-height: 1.4; border: 1px solid #ddd;"> <div class="no-print" style="max-width: 600px; background: white; padding: 15px; border-radius: 8px; margin-top: 20px; font-size: 13px; line-height: 1.4; border: 1px solid #ddd;">
<p style="margin-top: 0;"><strong> Ajustes de Escaneo y Compatibilidad:</strong></p> <p style="margin-top: 0;"><strong>🔬 Prueba de Grosor de Líneas:</strong></p>
<ul style="text-align: left; padding-left: 20px;"> <ul style="text-align: left; padding-left: 20px;">
<li><b>Fuente:</b> Cambiada a <b>Verdana</b> (más legible en impresoras térmicas).</li> <li><b>Opción 1 (Actual):</b> El equilibrio que veníamos usando.</li>
<li><b>Texto:</b> Grosor mantenido en "normal" para evitar empaste.</li> <li><b>Opción 2 (Reforzada):</b> Las líneas negras son más anchas. Útil si tu impresora imprime muy "pálido".</li>
<li><b>Barras más negras:</b> Aplicado <code>crispEdges</code> para máxima nitidez.</li> <li><b>Opción 3 (Finas):</b> Las líneas negras son más delgadas, dejando más espacio blanco. Útil si la tinta térmica se "chorrea" o expande mucho.</li>
<li><b>Ancho de Barra:</b> Factor 1.1 (ligeramente más gruesas para mayor contraste).</li>
<li><b>Altura:</b> 9mm.</li>
</ul> </ul>
<p><b>¿Cuál de las 3 filas escanea más rápido con tu lector?</b></p>
</div> </div>
</body> </body>