Con PHP, cómo obtener una imagen de una BD y mostrarla en un PDF ?

Espero te encuentres bien. Me da un poco de vergüenza contigo que nuevamente vuelva a preguntarte, pero es que ya llevo 1 día o mas luchando con este inconveniente y aún no he logrado solución, y la verdad nadie me ha enseñado PHP ni MySQL ni HTML - todo esto lo he estado autoaprendiendo y estoy trabajando solo, lo cual no ha sido fácil. Espero me pudieras colaborar:

Con PHP estoy generando un PDF usando la librería 'fpdf'. El reporte se me está generando bien. Pero ahora requiero tomar de la BD una imagen (de un campo tipo 'longblob') y mostrarla en el encabezado del PDF dentro de la "function Header()".

Ya lo he intentado escribiendo en el código previamente la linea "header("Content-type: image/jpeg");" sabiendo de antemano que las imágenes cargadas son de extensión "jpg"; pero al usar esta instrucción parece que el programa no hace nada - solamente muestra un cuadro pequeñito en donde parece que intentara mostrar la imagen pero no lo logra.

Entonces luego intenté hacer todo lo que respecta a la obtención de la imagen en un Php aparte, colocando la instrucción "header("Content-type: image/jpeg");" de primera dentro del archivo (para evitar posibles conflictos con posibles uso de la misma función en la clase PDF de la librería 'fpdf'), pero el programa tampoco logra mostrar la imagen. Cuando dejo de ejecutar esta instrucción, es decir la pongo dentro de un comentario con "//", el programa si hace todo lo demás. Aunque si esto me funcionara no podría mostrar la imagen dentro de la ejecución de este programa llamado, sino devolverla como parámetro para que se use dentro de la clase PDF de la librería 'fpdpf' - estoy en proceso de saber cómo haría esto entonces. En todo caso te muestro a continuación el código de este programita al que podría llamar:

*** *** *** *** *** *** *** ***
<?php
//header("Content-type: image/jpeg");
$codid = "1111";
$hostname_prueba = "localhost";
$database_prueba = "prueba";
$username_prueba = "root";
$password_prueba = "";
$prueba = mysql_pconnect($hostname_prueba, $username_prueba, $password_prueba) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db($database_prueba, $prueba);
$sql = "select `LOGO`, `NOMBRE`, `DIRECCIÓN`";
$sql = $sql." from proveedores";
$sql = $sql." where `COD_ID` = '".$codid."'";
$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'];
echo "(desde Longblog.php....) Nombre Proveedor: ".$nombre_proveedor."<br/>";
echo "(desde Longblog.php....) Dirección Proveedor: ".$direcc_proveedor."<br/>";
$imagen = $reg['LOGO'];
echo $imagen;
?>
*** *** *** *** *** *** *** ***

¿Cómo se podría obtener la imagen y mostrarla en el encabezado del PDF?

Si no pudiera tomarla y mostrarla directamente, ¿existe alguna forma de tomarla, Guardarla temporalmente dentro del espacio web, y luego tomar ese archivo guardado, asignarlo a una variable y mostrar esta variable dentro del encabezado de la clase 'PDF' dentro de la "function Header()"?.

2

2 respuestas

Respuesta
1

Cuando ingresas tu imagen en la base de datos, esta no queda como una imagen en si, si no, como un conjunto de datos almacenable. Internamente para la base de datos no hay diferencias entre una imagen y un audio todos son datos.

Cuando rescatas esa imagen desde la base de datos tienes que procersarla para que el navegador la muestre como una imagen y en ese caso estas en la razón de colocar el header correspondiente pero por otro lado el mismo hecho de colocar texto en el mismo script "corrompe" los datos de esa imagen haciendo que no se muestre.

Tienes que tener mucho cuidado con las salidas de tu script para no corromer los datos.

Para tu caso te recomiendo lo siguiente.

En el script donde estas generando tu pdf. Haz la consulta a la base de datos y guarda el resultado de la imagen en una variable y se la entregarás a la función para añadir imágenes así tal cual.

$image = $reg['logo'];
$pdf->MemImage($image, 50, 30);

De esta forma fpdf tomara esos "datos" desde la base de datos y los procesara como una imagen y la depositará en el lugar que corresponda.

Hice lo que me recomendaste, pero con esto el programa no mostró nada - la página web quedó completamente en blanco. Entonces para tener idea de lo que estaba sucediendo lo corrí en mi sitio local, y el error mostrado es el siguiente:

****** ****** ****** ******

Fatal error: Call to undefined method PDF::MemImage() in C:\wamp\www\REFOMAG_pruebas\Templates\REPORTProformas_f4.php on line 82

****** ****** ****** ******

¿Me puedes hacer llegar el código donde estas realizando esta acción?

Al parecer falta que incluyas alguna librería.

Hola. Me demoré bastante en responder, por lo que me ocupé adelantando otros requerimientos del programa. Aquí te envío el código con el que estoy probando (y que actualmente genera el mensaje error “Fatal error: Call to undefined method PDF::MemImage() in C:\wamp\www\pruebas\prog_prueba.php on line 52”):

********* *********
<?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()
{
$this->Image('Imagenes/logo_proveedor.png', 10,10,80);
$this->Ln(40);
}
// 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->MemImage($logo_proveedor, 50, 30);
//$pdf->Cell(47,4,'Fecha (Date):','TL',0,'L');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(11,4,'Fecha ','TL',0,'L');
//...
$pdf->Output( );
?>
********* *********

Ya no estoy probando llamando a otro programa el cual tendría que devolver como parámetro la imagen, sino que ese código que te estoy enviando corresponde al programa definitivo el cual genera el reporte (le quité parte de código irrelevante en el inconveniente). Entonces, la idea sería no generar la imagen en la línea 52, sino generarla dentro de la función ‘Header()’, y en lugar de “ $this->Image('Imagenes/logo_proveedor.png', 10,10,80);” sería colocar “ $this->Image($logo_proveedor, 10,10,80);” para que muestre en el encabezado de cada página la imagen tomada de la BD.

No he encontrado librería asociada a ‘MemImage()’

Gracias.

Con respecto a MemImage encontré esto

<a>http://stackoverflow.com/questions/11958602/fpdf-memimage-problems-oo-syntax</a>

Si te ayuda me avisas, así seguimos avanzando con la implementación de tu script

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:

"Warning: getimagesize() expects parameter 1 to be string, resource given in C:\wamp\www\REFOMAG_pruebas\Templates\fpdf17\fpdf.php on line 1213".

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 ?.

Este es el código:

**** **** ****

<?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( );
?>

**** **** ****

Para guardar tu imagen haz lo siguiente (no uses fwrite ya que se utiliza en archivos de texto)

file_put_contents('./mi_imagen.jpg', $logo_proveedor);

De esta forma cuando necesites usarla en la función image de pdf solo necesitas llamar la ubicación de la imagen.

$this->Image("./mi_imagen.jpg", 10,10,80,'','jpg');
Respuesta

Es fácil

Usas la librería fpdf

Acabo de hacer eso hace una hora

Dame tu correo y te envío el código

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas