Cargando

Con PHP cómo tomar imagen de la BD y mostrarla en Header de PDF usando fpdf




13 Respuestas de expertos
Pulsa corazón para recibir avisos de nuevas Respuestas

  AUTOR PREGUNTA

Publicado 08 junio 2014 - 06:40
Hola. Espero que alguien por favor me pueda colaborar dándome al menos ideas de solución para superar este inconveniente. De antemano gracias:

Usando PHP, estoy tratando de leer una imagen que está almacenada en un campo tipo "longblob" de una tabla de la BD; esta imagen debo mostrarla en el encabezado de un archivo PDF el cual se genera con la librería 'fpdf', pero al ejecutar el programa se presenta el mensaje de error "FPDF error: Unsupported image type: ÂsdÏqé;(9„çÈ ë5t@f–ódxŽÌók­kÖŒuÌù#" y no muestra nada más.

El código es el siguiente:
******* ******* ******* *******
<?php
// se llama la librería para generar PDF y se establecen parámetros generales para el mismo

require_once('../Templates/fpdf17/fpdf.php');
require_once('../Connections/prueba.php');
mysql_select_db($database_prueba, $prueba);

class PDF extends FPDF
{
// Cabecera de página del Reporte
function Header()
{

global $logo_proveedor;

$this->Image($logo_proveedor, 10,10,80);
}

// Pie de página del Reporte
function Footer()
{
$this->SetY(-15);
$this->SetFont('Arial','I',8);
$this->Cell(0,10,'Page '.$this->PageNo().' / {nb}',0,0,'C');
}
}

$sql = "select `NOMBRE`, `DIRECCION`, `TELEFONO`, `FAX`, `LOGO`";
$sql = $sql." from proveedores";
$sql = $sql." where `TAX_ID` = '1111' ";
$result = mysql_query($sql, $prueba) or die("Error en: $sql: " . mysql_error());
$reg = mysql_fetch_array($result, MYSQL_ASSOC);

$nombre_proveedor = $reg['NOMBRE'];
$direcc_proveedor = $reg['DIRECCION'];
$telefono_proveedor = $reg['TELEFONO'];
$fax_proveedor = $reg['FAX'];
$logo_proveedor = $reg['LOGO'];

//
// Creación del objeto de la clase heredada
//
$pdf = new PDF('P','mm','Letter');
$pdf->AliasNbPages();
$pdf->AddPage();
$pdf->SetFont('Arial','',10);

//
// Generación de las Líneas del Encabezado
//
$pdf->SetTextColor(220, 12, 12);
$pdf->Cell(0,4,'PRUEBA MUESTRA IMAGEN DE BASE_DE_DATOS','T',1,'L');
$pdf->SetTextColor(0, 0, 0);

$pdf->Cell(47,4,'Fecha (Date):','TL',0,'L');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(11,4,'Fecha ','TL',0,'L');
//...
$pdf->Output( );
?>
******* ******* ******* *******

La idea es que la imagen se imprima al ejecutar la linea 16 ($this->Image($logo_proveedor, 10,10,80) ;). He intentado también usando previamente la instrucción "header('Content-type: image/x-png');
", sabiendo que la imagen es tipo PNG, pero de esta forma el programa muestra lo que muestra es un cuadro de diálogo "Guardar como" colocando por defecto el nombre del programa para el dato "Nombre" y, si le doy guardar, genera archivo cuya primera linea es "<b>FPDF error:</b> Unsupported image type: ÂsdÏqé;(9„çÈ ë5t@f–ódxŽÌók" y el resto de lineas tienen una serie de caracteres extraños como "basura".

Gracias y espero por favor me colaboren.
  • 2 personas más tuvieron esta duda Yo también
  • Volver arriba

Publicado 08 junio 2014 - 17:43
Hola Enrique,

Necesitaría más detalles para ayudarte, realiza un print de la variable [color=#282828][font=helvetica, arial, sans-serif]$logo_proveedor y me dices que te trae, trata con esto:[/font][/color]

[color=#282828][font=helvetica, arial, sans-serif]
global $logo_proveedor;
print_r($logo_proveedor);
$this->Image($logo_proveedor, 10,10,80);
[/font][/color]

[color=#282828][font=helvetica, arial, sans-serif]Sí no te imprime nada forza la salida con un exit:[/font][/color]

[color=#282828][font=helvetica, arial, sans-serif]
global $logo_proveedor;
print_r($logo_proveedor); exit;
$this->Image($logo_proveedor, 10,10,80);
[/font][/color]

[color=#282828][font=helvetica, arial, sans-serif]Quedo atento a tus comentarios.[/font][/color]

   AUTOR PREGUNTA

Publicado 09 junio 2014 - 05:47
con el "print_r" se imprime lo siguiente:

[color=#000000][font='Times New Roman'][size=1]‰PNG  IHDROÇ™YÑósRGB®ÎégAMA± üa pHYsÂÂ(J€KIDATx^íÝ=lÜFÆñ‘»T©’.U$g¨K*¹º4ٍ*iŒ4«ê î\ª3‚“p•¶ ܤpåÆ®¹«¬*é ")Õu¹*Uºóq8óòûc8Kî’œÿ0d‰»\rW|ôΐœÙúQ€Nد€Oð@x€Â<žàð„'x <Àá Oð@x€Â<žàð„'x`[/size][/font][/color]Ï!<çÇ7,¡9^„爞ó@`†ðÂsšV KAhN á9"„çøõ”‚Àœ.ÂsDÏqé;(9„çÈ ë5T@f–óDxŽÌók­kÖŒuÌù#<p>

   AUTOR PREGUNTA

Publicado 09 junio 2014 - 18:27
[color=#666666][font=Arial, Helvetica, sans-serif]
Gracias. Estoy intentando una altenativa de solución, no mostrando la imagen de una vez sino guardándola en un archivo (con fopen y fwrite) y luego mostrar el contenido de ese archivo dentro del Header con "$this->Image()") y al final cerrar y eliminar el archivo. Sí genera el archivo y guarda en él la imagen de la BD, pero al intentar ejecutar la instrucción "$this->Image($handle, 10,10,80,'','jpg')" genera el siguiente. mensaje de error:[/font][/color][color=#666666][font=Arial, Helvetica, sans-serif]
"Warning: getimagesize() expects parameter 1 to be string, resource given in C:\wamp\www\REFOMAG_pruebas\Templates\fpdf17\fpdf.php on line 1213". [/font][/color][color=#666666][font=Arial, Helvetica, sans-serif]
Lo que observo es que no está aceptando como válido el primer parámetro ("$handle") - probé dándole como parámetro directamente el nombre del archivo "mi_imagen.jpg" pero menos lo acepta. ¿sabes cómo podría manejar este parámetro de forma que funcione bien la instrucción ?.[/font][/color]
[color=#666666][font=Arial, Helvetica, sans-serif]
Este es el código:[/font][/color][color=#666666][font=Arial, Helvetica, sans-serif]
**** **** ****[/font][/color][color=#666666][font=Arial, Helvetica, sans-serif]
<?php
// se llama la librería para generar PDF y se establecen parámetros generales para el mismo
require_once('../Templates/fpdf17/fpdf.php');
require_once('../Connections/prueba.php');
mysql_select_db($database_prueba, $prueba);
class PDF extends FPDF
{
// Cabecera de página del Reporte
function Header()
{
global $logo_proveedor;
global $handle;
$this->Image($handle, 10,10,80,'','jpg');
}
// Pie de página del Reporte
function Footer()
{
$this->SetY(-15);
$this->SetFont('Arial','I',8);
$this->Cell(0,10,'Page '.$this->PageNo().' / {nb}',0,0,'C');
}
}
$sql = "select `NOMBRE`, `DIRECCIÓN`, `TELÉFONO`, `FAX`, `LOGO`";
$sql = $sql." from proveedores";
$sql = $sql." where `ID` = '1111' ";
$result = mysql_query($sql, $prueba) or die("Error en: $sql: " . mysql_error());
$reg = mysql_fetch_array($result, MYSQL_ASSOC);
$nombre_proveedor = $reg['NOMBRE'];
$direcc_proveedor = $reg['DIRECCIÓN'];
$telefono_proveedor = $reg['TELÉFONO'];
$fax_proveedor = $reg['FAX'];
$logo_proveedor = $reg['LOGO'];
$handle = fopen("mi_imagen.jpg", 'x');
fwrite($handle, $logo_proveedor);
//
// Creación del objeto de la clase heredada
//
$pdf = new PDF('P','mm','Letter');
$pdf->AliasNbPages();
$pdf->AddPage();
$pdf->SetFont('Arial','',10);
fclose($handle);
unlink("mi_imagen.jpg");
//
// Generación de las Líneas del Encabezado
//
$pdf->SetTextColor(220, 12, 12);
$pdf->Cell(0,4,'SOLUCION ALTERNATIVA --- PRUEBA MUESTRA IMAGEN DE BASE_DE_DATOS','T',1,'L');
//...
$pdf->Output( );
?>[/font][/color][color=#666666][font=Arial, Helvetica, sans-serif]
**** **** ****[/font][/color]

Publicado 09 junio 2014 - 21:38
No uses fopen para manejar la imagen, te recomiendo que tengas la imagen en alguna ruta en tu proyecto, así solo necesitarías guardar la ruta en una variable, por ejemplo:

$logo_proveedor = "img/imagen.jpg";

Y luego crea una celda y allí, imprimes la imagen:

$this->Cell( 40, 40, $pdf->Image($logo_proveedor, $pdf->GetX(), $pdf->GetY(), 33.78), 0, 0, 'L', false );


   AUTOR PREGUNTA

Publicado 10 junio 2014 - 03:56
Gracias. La situación es que así está establecida la BD y yo no soy la persona que decide cómo manejar el almacenamiento de la información de las imágenes (son logotipos). Pero te cuento que ya solucioné la toma de la imagen de la BD y su muestra en el reporte, pero a nivel Local. Ahora tengo un inconveniente ya cuando intento ejecutar la solución en el sitio web de Producción - espero que ojalá pudieras colaborarme con este nuevo inconveniente.

Te cuento (para tu retroalimentación y para las demás personas que lean el foro) cómo solucioné a nivel local:
[size=4]> $handle = fopen("Imagenes/temp/mi_imagen.jpg", 'x'); (se crea el archivo con extensión jpg)[/size]
> fwrite($handle, $logo_proveedor); (se almacena la imagen de la BD dentro del archivo creado)
> [size=4]$this->Image('Imagenes/temp/mi_imagen.jpg', 10,10,80,'','jpg'); (dentro de la función [/size][size=4]Header(), no se hace referencia a $handle sino a la ruta completa del archivo incluyendo su nombre[/size][size=4]) (el problema era que no me aceptó el hacer referencia a "[/size][size=4]$handle[/size][size=4]")[/size]

[size=4]El inconveniente [/size][size=4]cuando intento ejecutar la solución en el sitio web de Producción es que veo que no se logra almacenar la información de la imagen. El archivo que normalmente se genera con la imagen, es de 14.311 Bytes (14 KB); y dentro del sitio web se genera el archivo pero con 4 Bytes (0 KB), y cuando lo abro con el visualizador de fotos de Windows, dentro de él no se ve la imagen sino la leyenda "Visualizador de fotos de Windows no puede abrir esta imagen porque el archivo parece estar dañado o es demasiado grande". Cuando lo intento abrir con Paint se genera el siguiente mensaje de advertencia: "Paint no puede leer este archivo. Este archivo no es un archivo de mapa de bits válido o su formato no es compatible".[/size]

[size=4]Lo que alcanzo a ver es que no se logra almacenar la imagen y queda un archivo corrupto.[/size]

¿Sabes qué podría estar sucediendo ? Te agradecería mucho si puedes colaborarme.

Publicado 10 junio 2014 - 16:41
Has verificado los settings de tu PHP.ini para la escucha del servidor en producción de esas peticiones? Eso te puede estar ocasionando los problemas, verifica que esto allow-url-fopen no esté en false. Aquí te dejo un enlace de la documentación oficial:

Por favor Identificate o Registrate para poder ver este contenido



   AUTOR PREGUNTA

Publicado 10 junio 2014 - 22:21
Gracias. Ya verifiqué el valor para allow-url-fopen, y está en "ON" - está activada. La verifiqué por código de programa, ya que no tengo acceso a ver el php.ini, pero sí, es buena idea, le pediré el favor al proveedor del servidor que me verifiqué algunos otros posibles parámetros. ¿Cuál otro parámetro podría estar incidiendo ?

Publicado 11 junio 2014 - 03:49
Verifica file-uploads, ese parámetro por lo general viene desactivado, eso quizá es lo que te puede estar ocasionando el error. Quedo atento a tu respuesta.

   AUTOR PREGUNTA

Publicado 12 junio 2014 - 21:25
Creo que estaba verificando mal el valor de los parámetros - estaba preguntando así: "if ( ‘allow_url_fopen’ == ‘Off’)". Pero ahora estoy verificando preguntando así:
******* ******* ******* *******
[size=4]echo "pregunta por 1"."<br/>";[/size]
if ( ‘allow_url_fopen’ == 1)
echo "allow-url-fopen = ONN";
else
echo "allow-url-fopen = OFFFFFF";
echo "<br/>";
if ( ‘file_uploads’ == 1)
echo "file_uploads = ONN";
else
echo "file_uploads = OFFFFFF";
echo "<br/>";
echo "pregunta por 0"."<br/>";
if ( ‘allow_url_fopen’ == 0)
echo "allow-url-fopen = OFFFFFF";
else
echo "allow-url-fopen = ONN";
echo "<br/>";
if ( ‘file_uploads’ == 0)
echo "file_uploads = OFFFFFF";
else
echo "file_uploads = ONN";
[size=4]******* ******* ******* ******* [/size]
En todos casos resulta que los parámetros están con valor 0 (desactivados).

Entonces creé un .thaccess dentro de la carpeta "[color=#282828][font=helvetica, arial, sans-serif]Imagenes/temp/[/font][/color]", con el propósito de que dentro de esta carpeta estos dos parámetros estén siempre activados - aunque los programas están dentro de la carpeta que está conteniendo a "[color=#282828][font=helvetica, arial, sans-serif][size=4]Imagenes/[/size][/font][/color][size=4]". El contenido del .htaccess es:[/size]
[size=4]******* ******* ******* ******* [/size]

file_uploads = 1
allow_url_fopen = 1

[size=4]******* ******* ******* ******* [/size]

El resultado usando el .htaccess sigue siendo el mismo: [color=#282828][font=helvetica, arial, sans-serif][size=4]no se logra almacenar la imagen y queda un archivo corrupto[/size][/font][/color]


X