[PHP] clase de código de barras
Resuelto
Tantor8
Mensajes publicados
46
Estado
Miembro
-
titou38 -
titou38 -
Hola,
Necesito generar un pdf que contenga imágenes de códigos de barras. Para ello utilizo fpdf y una clase encontrada en pitoo.com: http://pit.free.fr/code_php.php
Muy bien hecha y perfectamente funcional, probé esta clase en un archivo y como se indica en su sitio, basta con hacer:
para obtener una imagen en nuestra página.
Pero para insertarlo en el pdf, no sé cómo hacerlo. He intentado:
Y para la primera imagepng tengo el siguiente error:
Warning: imagepng(): supplied argument is not a valid Image resource in c:\program files\easyphp1-8\www\toutpack\format_pdf.php on line 169
Y para el $pdf->Image($file... tengo:
Warning: fopen(./CodeBarre/.png): failed to open stream: No such file or directory in c:\program files\easyphp1-8\www\toutpack\classfpdf\fpdf.php on line 1522
FPDF error: Can't open image file: ./CodeBarre/.png
Imagino que el segundo error es necesariamente debido al fallo en la creación del primero. Espero que alguien pueda ayudarme. Gracias por su ayuda.
--
¡Un tonto que camina llegará más lejos que un filósofo sentado!
Necesito generar un pdf que contenga imágenes de códigos de barras. Para ello utilizo fpdf y una clase encontrada en pitoo.com: http://pit.free.fr/code_php.php
Muy bien hecha y perfectamente funcional, probé esta clase en un archivo y como se indica en su sitio, basta con hacer:
echo "<img src=pi_barcode.php?type=EAN&code=".$_POST['codebarre12']."&height=50&readable=Y alt='sin imagen'></img>";
para obtener una imagen en nuestra página.
$_POST['codebarre12']siendo un código de 12 cifras ya que la clase crea automáticamente el bit de control.
Pero para insertarlo en el pdf, no sé cómo hacerlo. He intentado:
$file = "./CodeBarre/$codebarre.png"; /*creación de la imagen*/ $image=imagepng("pi_barcode.php?type=EAN&code=124578569854&height=$hcode&readable=Y"); /*guarda la imagen en el directorio actual*/ imagepng($image, $file); /*insertamos la imagen en el pdf*/ $x=$pdf->getX(); $y=$pdf->getY(); $pdf->SetFillColor(255,187,255); $pdf->Cell(100,$hcode+10,"codigo de barras",1,0,'C',$pdf->Image($file,$x,$y,0,$hcode,'PNG'));Y para la primera imagepng tengo el siguiente error:
Warning: imagepng(): supplied argument is not a valid Image resource in c:\program files\easyphp1-8\www\toutpack\format_pdf.php on line 169
Y para el $pdf->Image($file... tengo:
Warning: fopen(./CodeBarre/.png): failed to open stream: No such file or directory in c:\program files\easyphp1-8\www\toutpack\classfpdf\fpdf.php on line 1522
FPDF error: Can't open image file: ./CodeBarre/.png
Imagino que el segundo error es necesariamente debido al fallo en la creación del primero. Espero que alguien pueda ayudarme. Gracias por su ayuda.
--
¡Un tonto que camina llegará más lejos que un filósofo sentado!
3 respuestas
Re,
He modificado un poco mi código. Para crear la imagen, utilizo esta vez:
imagecreatefrompng crea la imagen a partir de una fuente, ya sea el archivo que contiene la clase. Luego imagepng la guarda en un directorio.
Pero tengo los mismos problemas que antes:
Advertencia: imagecreatefrompng(pi_barcode.php?type=EAN&code=124578569854&height=12): no se pudo abrir la corriente: argumento inválido en c:\program files\easyphp1-8\www\toutpack\format_pdf.php en la línea 171
Advertencia: imagepng(): el argumento proporcionado no es un recurso de imagen válido en c:\program files\easyphp1-8\www\toutpack\format_pdf.php en la línea 172
Advertencia: fopen(./CodeBarre/.png): no se pudo abrir la corriente: no existe tal archivo o directorio en c:\program files\easyphp1-8\www\toutpack\classfpdf\fpdf.php en la línea 1522
Error de FPDF: No se puede abrir el archivo de imagen: ./CodeBarre/.png
Gracias por su ayuda
--
¡Un tonto que camina irá más lejos que un filósofo sentado!
He modificado un poco mi código. Para crear la imagen, utilizo esta vez:
$im = imagecreatefrompng("pi_barcode.php?type=EAN&code=124578569854&height=$hcode&readable=Y"); imagepng($im,$file); imagecreatefrompng crea la imagen a partir de una fuente, ya sea el archivo que contiene la clase. Luego imagepng la guarda en un directorio.
Pero tengo los mismos problemas que antes:
Advertencia: imagecreatefrompng(pi_barcode.php?type=EAN&code=124578569854&height=12): no se pudo abrir la corriente: argumento inválido en c:\program files\easyphp1-8\www\toutpack\format_pdf.php en la línea 171
Advertencia: imagepng(): el argumento proporcionado no es un recurso de imagen válido en c:\program files\easyphp1-8\www\toutpack\format_pdf.php en la línea 172
Advertencia: fopen(./CodeBarre/.png): no se pudo abrir la corriente: no existe tal archivo o directorio en c:\program files\easyphp1-8\www\toutpack\classfpdf\fpdf.php en la línea 1522
Error de FPDF: No se puede abrir el archivo de imagen: ./CodeBarre/.png
Gracias por su ayuda
--
¡Un tonto que camina irá más lejos que un filósofo sentado!
Hola,
a partir de ahora puedo guardar mi código de barras en un archivo .png temporal. Para ello, he seguido un poco este tema:
https://www.developpez.net/forums/d546949/php/bibliotheques-frameworks/fpdf-fpdf-generateur-code-barres/#post3255401
Hay que retomar lo que se encuentra debajo de la clase en pi_barcode y incorporarlo a un método del pdf en el archivo php que crea el pdf:
Luego puedo llamarlo en el momento en que deseo ponerlo en el pdf:
Además, fue necesario modificar el método makeImage en la clase pi_barcode como sigue:
Pongo el encabezado en comentario porque causa problemas de otra manera y dado que la imagen se genera de todas formas, lo considero inútil.
El problema ahora es que no aparece nada en el pdf generado. Además, desde hace poco, me da el siguiente error:
Notice: Undefined property: HR in c:\program files\easyphp1-8\www\toutpack\pi_barcode.php on line 469
no entiendo por qué no está definida cuando antes funcionaba.
Si alguien tiene una solución para mi problema, gracias por ayudarme; de lo contrario, espero que esto sirva a otros en la misma situación que yo.
--
¡Un tonto que camina irá más lejos que un filósofo sentado!
a partir de ahora puedo guardar mi código de barras en un archivo .png temporal. Para ello, he seguido un poco este tema:
https://www.developpez.net/forums/d546949/php/bibliotheques-frameworks/fpdf-fpdf-generateur-code-barres/#post3255401
Hay que retomar lo que se encuentra debajo de la clase en pi_barcode y incorporarlo a un método del pdf en el archivo php que crea el pdf:
<?php include('pdf.php'); class PDF extends FPDF{ ... //genera el código de barras function genCode($type, $code, $height, $readable, $width, $showtype){ include('pi_barcode.php'); $type = strtoupper($type); switch( $type ) { case "C128C" : if (preg_match("/^[0-9]{2,48}$/", $code)){ $tmp = strlen("$code"); if(($tmp%2)!=0) $code = "0$code"; } else { $type = "ERR"; $code = "CODE 128C REQUIRES DIGITS ONLY"; } case "C128" : $carok = true; for($i=0;$i<strlen($code);$i++) { $tmp = ord(substr($code,$i,1)) ; if($tmp < 32 OR $tmp > 126) $carok = false; } if( !$carok ) { $type = "ERR"; $code = "UNAUTHORIZED CHARS IN 128 CODE"; } break; case "UPC" : $code = "0$code"; case "EAN" : $long = strlen( $code ) ; $factor = 3; $sum = 0; if (preg_match("/^[0-9]{8}$/", $code) OR preg_match("/^[0-9]{13}$/", $code)){ // if ($long==13){ for ($index = ($long - 1); $index > 0; $index--) { $sum += substr( $code, $index - 1, 1 ) * $factor ; $factor = 4 - $factor ; } $cc = ( ( 1000 - $sum ) % 10 ) ; if ( substr( $code, -1, 1) != $cc ) { $type = "ERR"; $code = "CHECKSUM ERROR IN EAN/UPC CODE"; } } elseif (preg_match("/^[0-9]{7}$/", $code) OR preg_match("/^[0-9]{12}$/", $code)){ // } elseif ($long==12){ for ($index = ($long ); $index > 0; $index--) { $sum += substr( $code, $index - 1, 1 ) * $factor ; $factor = 4 - $factor ; } $cc = ( ( 1000 - $sum ) % 10 ) ; $code .= "$cc" ; } else { $type = "ERR"; $code = "THIS CODE IS NOT EAN/UPC TYPE"; } break; case "C25I" : $tmp = strlen("$code"); if(($tmp%2)==0) { $code = "0$code"; $tmp++; } case "C25" : if (preg_match("/^[0-9]{1,48}$/", $code)){ $checksum = 0; $factor = 3; $tmp = strlen("$code"); for($i=$tmp-1; $i>=0; $i--) { $checksum += (intval(substr($code,$i,1))*$factor); $factor = 4-$factor; } $checksum = 10-($checksum%10); if($checksum==10) $checksum = 0; $code .= "$checksum"; } else { $type = "ERR"; $code = "CODE C25 REQUIRES DIGITS ONLY"; } break; case "C39" : if(preg_match("/^[0-9A-Z\-\.\$\/+% ]{1,48}$/i", $code)) { $code = "*$code*"; } else { $type = "ERR"; $code = "UNAUTHORIZED CHARS IN CODE 39"; } break; case "CODABAR" : if(!preg_match("/^(A|B|C|D)[0-9\-\$:\/\.\+]{1,48}(A|B|C|D)$/i", $code)) { $type = "ERR"; $code = "CODABAR START/STOP : ABCD"; } break; case "MSI" : if (preg_match("/^[0-9]{1,48}$/", $code)){ $checksum = 0; $factor = 1; $tmp = strlen("$code"); for($i=0; $i<$tmp; $i++) { $checksum += (intval(substr($code,$i,1))*$factor); $factor++; if($factor > 10) $factor = 1; } $checksum = (1000-$checksum)%10; $code .= "$checksum"; } else { $type = "ERR"; $code = "CODE MSI REQUIRES DIGITS ONLY"; } break; case "C11" : if (preg_match("/^[0-9\-]{1,48}$/", $code)){ $checksum = 0; $factor = 1; $tmp = strlen("$code"); for($i=$tmp-1; $i>=0; $i--) { $tmp = substr($code,$i,1); if($tmp == "-") $tmp=10; else $tmp = intval($tmp); $checksum += ($tmp*$factor); $factor++; if($factor>10) $factor=1; } $checksum = $checksum%11; if($checksum==10) $code .= $checksum . "-"; else $code .= "$checksum"; } else { $type = "ERR"; $code = "UNAUTHORIZED CHARS IN CODE 11"; } break; case "POSTNET" : if (preg_match("/^[0-9]{5}$/", $code) OR preg_match("/^[0-9]{9}$/", $code) OR preg_match("/^[0-9]{11}$/", $code)){ $checksum = 0; $tmp = strlen("$code"); for($i=$tmp-1; $i>=0; $i--) { $checksum += intval(substr($code,$i,1)); } $checksum = 10-($checksum%10); if($checksum==10) $checksum=0; $code .= "$checksum"; } else { $type = "ERR"; $code = "POSTNET MUST BE 5/9/11 DIGITS"; } break; case "KIX" : if (preg_match("/^[A-Z0-9]{1,50}$/", $code)){ // ***** EL CÓDIGO KIX no tiene checksum (corrección V2.02) // $checksum = 0; // $tmp = strlen("$code"); // for($i=$tmp-1; $i>=0; $i--) { // $checksum += intval(substr($code,$i,1)); // } // $checksum = 10-($checksum%10); // if($checksum==10) $checksum=0; // $code .= "$checksum"; } else { $type = "ERR"; $code = "UNAUTHORIZED CHARS IN KIX CODE"; } break; case "CMC7" : if(!preg_match("/^[0-9A-E]{1,48}$/", $code)) { $type = "ERR"; $code = "CMC7 MUST BE NUMERIC or ABCDE"; } break; default : $type = "ERR"; $code = "UNKWOWN BARCODE TYPE"; break; } // ***** Ancho por defecto if( isset( $width ) && ( $width >= 10 ) ) { $hw = $width ; } else { $hw = 10 ; } // ***** Altura por defecto if( isset( $height ) && ( $height > 0 ) ) { $hh = $height ; } else { $hh = 10 ; } // ***** Otras valores por defecto if( isset( $readable ) && ( $readable == "Y" ) ) { $hr = "Y" ; } else{ $hr = "N" ; } if( !isset( $showtype ) ) { $showtype = "N" ; } // ***** Creación del objeto $objCode = new pi_barcode( $type, $code, $hh, $hr, $hw, $showtype ) ; $objCode -> makeImage() ; } } ?> Luego puedo llamarlo en el momento en que deseo ponerlo en el pdf:
/*elegir mostrar o no los números*/ if(isset($_POST['chiffre'])){ $pdf->genCode('EAN',$codebarre12, $hcode, 'Y', '', ''); }else{ $pdf->genCode('EAN',$codebarre12, $hcode, '', '', ''); } /*insertamos la imagen en el pdf*/ $file="codebarre.png"; $x=$pdf->setX(30); $y=$pdf->getY(); $pdf->SetFillColor(255,187,255); $pdf->Cell(100,$hcode+10,"código de barras",1,0,'C',$pdf->Image($file,$x,$y,0,$hcode,'PNG')); Además, fue necesario modificar el método makeImage en la clase pi_barcode como sigue:
//Header( "Content-type: image/png"); /*muestra la imagen imagepng($img);*/ //guarda la imagen imagepng($img,"codebarre.png"); //destruye la imagen imagedestroy($img); }//fin del método makeImage()
Pongo el encabezado en comentario porque causa problemas de otra manera y dado que la imagen se genera de todas formas, lo considero inútil.
El problema ahora es que no aparece nada en el pdf generado. Además, desde hace poco, me da el siguiente error:
Notice: Undefined property: HR in c:\program files\easyphp1-8\www\toutpack\pi_barcode.php on line 469
no entiendo por qué no está definida cuando antes funcionaba.
Si alguien tiene una solución para mi problema, gracias por ayudarme; de lo contrario, espero que esto sirva a otros en la misma situación que yo.
--
¡Un tonto que camina irá más lejos que un filósofo sentado!
¡Empiezo y termino este tema! lol
Entonces, para el error de RRHH, he puesto el parámetro readable en Y, de modo que siempre muestra el código de barras (los números + las líneas).
En cuanto a la imagen, he añadido un parámetro en makeImage con el nombre del archivo de destino. Así, cada código tiene un archivo. Antes era un archivo común que pensaba poder usar directamente insertándolo en el pdf. El problema es que el pdf parece generarse al final de la ejecución de la página cuando hacemos el output. Así que en ese momento solo tenía la última imagen.
¡Hasta luego!
--
¡Un tonto que camina irá más lejos que un filósofo sentado!
Entonces, para el error de RRHH, he puesto el parámetro readable en Y, de modo que siempre muestra el código de barras (los números + las líneas).
En cuanto a la imagen, he añadido un parámetro en makeImage con el nombre del archivo de destino. Así, cada código tiene un archivo. Antes era un archivo común que pensaba poder usar directamente insertándolo en el pdf. El problema es que el pdf parece generarse al final de la ejecución de la página cuando hacemos el output. Así que en ese momento solo tenía la última imagen.
¡Hasta luego!
--
¡Un tonto que camina irá más lejos que un filósofo sentado!