Con PHP cómo tomar imagen de la BD y mostrarla en Header de PDF usando fpdf
AUTOR PREGUNTA #1
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ŽÌókkÖŒ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
Esto también te interesa!
PREGUNTAS SIMILARES
#2
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 #3
[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ŽÌókkÖŒuÌù#<p>
AUTOR PREGUNTA #4
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]
#5
$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 #6
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.
#7
AUTOR PREGUNTA #8
#9
AUTOR PREGUNTA #10
******* ******* ******* *******
[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]