Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Ajax + codeigniter + tcpdf

Estas en el tema de Ajax + codeigniter + tcpdf en el foro de Javascript en Foros del Web. Buenas noches, necesito su ayuda con algo de mi aplicacion, es lo siguiente: tengo una vista que contiene un boton que al hacer clic envia ...
  #1 (permalink)  
Antiguo 26/06/2013, 18:20
 
Fecha de Ingreso: julio-2011
Mensajes: 6
Antigüedad: 12 años, 8 meses
Puntos: 0
Ajax + codeigniter + tcpdf

Buenas noches, necesito su ayuda con algo de mi aplicacion, es lo siguiente:
tengo una vista que contiene un boton que al hacer clic envia los datos(usando ajax) a un controlador que tiene una funcion que genera un pdf a partir de una consulta a la bd. Este proceso está bien.
El problema es que no se como cargar el archivo pdf creado. El responseText contiene el pdf generado pero es solo texto con código extraño. Si uso un window.open con la url del controlador genera el pdf pero como no paso los parámetros no realiza la consulta a la bd. Existe alguna forma de poder cargar el pdf pasando datos en una nueva pestaña.

Gracias de antemano!
  #2 (permalink)  
Antiguo 26/06/2013, 18:33
Avatar de Raziel_Ravenheart  
Fecha de Ingreso: agosto-2011
Ubicación: Ibagué, Tolima
Mensajes: 192
Antigüedad: 12 años, 7 meses
Puntos: 37
Respuesta: Ajax + codeigniter + tcpdf

No, básicamente esto solo se podría hacer con xmlhttprequest 2, la nueva api implementada en html5, pero realmente no hay necesidad de molestarse tanto.

Yo generalmente lo que hago es:
1. Generar el archivo, ya sea pdf, xls, doc, etc.

2. Guardo en una variable la ubicación del archivo en el servidor.

3. En la respuesta del ajax, o sea el responseText, en vez de enviar el archivo, lo que envio es el valor de la variable que se creó.

4. Luego con el valor recibido uso un window.open (creo, no estoy muy seguro) o en el mejor de los casos creo un enlace hacía dicho archivo, el cual al hacerle click, simplemente abre una ventana de solicitud de descarga, o en el caso de los archivos pdf, los abre en la misma ventana o en otra si se utiliza el atributo target="_blank"

Y listo, eso es todo. En el caso de archivos como los de word y excel, siempre abre una ventana de solicitud de descarga.
  #3 (permalink)  
Antiguo 27/06/2013, 07:35
 
Fecha de Ingreso: julio-2011
Mensajes: 6
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Ajax + codeigniter + tcpdf

Hola de nuevo, intenté hacer lo que dices pero ahora el problema es que mi archivo php no devuelve el nombre de la ruta ej: "archivopdf.pdf" sino que devuelve el contenido de dicho archivo y obviamente en el window.open la ruta queda mal. Existe alguna funcion en php que force la salida como string o no se que estoy haciendo mal para que no lo trate asi. Agradezco tu respuesta.
  #4 (permalink)  
Antiguo 27/06/2013, 08:21
Avatar de Raziel_Ravenheart  
Fecha de Ingreso: agosto-2011
Ubicación: Ibagué, Tolima
Mensajes: 192
Antigüedad: 12 años, 7 meses
Puntos: 37
Respuesta: Ajax + codeigniter + tcpdf

El TCPDF, utiliza la el método output para generar el archivo, este método recibe 2 parámetros, el primero es el nombre del archivo, y el segundo, el destino. En el segundo parámetro puede recibir los siguientes valores:

I: Envía el archivo en línea al navegador (comportamiento por defecto). Si se encuentra el plugin, lo utiliza. El nombre utilizado como primer parámetro, es utilizado cuando se escoge la opción "Guardar como..."
D: Lo envía al navegador y fuerza la descarga con el nombre dado en $name
F: Guarda el archivo en el servidor con el nombre dado en $name
S: Devuelve el documento como una cadena
FI:Equivalente a las opciones F+I
FD: Equivalente a las opciones F+D
E: Devuelve el documento como un adjunto en base64 con tipo mime multi-part email (RFC 2045)

TCPDF::output

Lo que tienes que hacer es guardar el archivo en el servidor con la opción 'F', luego utilizar el nombre utilizado en el primer parámetro ($name), junto con la dirección completa en donde se guarda, por ejemplo:

'/docs/archivo.pdf'

y eso es lo que se envía al navegador, se crea el enlace o con window.open debería iniciar la pantalla de descarga.

Intenta de nuevo y cualquier problema me comentas
  #5 (permalink)  
Antiguo 27/06/2013, 08:59
 
Fecha de Ingreso: julio-2011
Mensajes: 6
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Ajax + codeigniter + tcpdf

Hola y gracias de nuevo, ya habia probado lo que me comentaste y tampoco ha solucionado el problema, a continuación te muestro todo lo que estoy haciendo:

en la vista
Código:
<img src="images/pdf.png" title="Generar Reporte en PDF" onclick="cargarReporte('reporte','<?=$titulo?>','<?=$fil?>','_vehiculos/c_vehiculos/reporte');" />
la funcion javascript:

Código:
function cargarReporte(tabla,titulo,filtro,url)
{
	tb=document.getElementById(tabla);
	rows=tb.rows.length;
	cols=tb.rows[1].cells.length;
	data=new Array();
	headers=new Array();
	c=0;
	for (i=0;i<cols;i++)//columnas de la tabla
	{
		if(document.getElementById('check'+i).checked)
		{
			
			texto=tb.rows[1].cells[i].innerHTML;
			headers[c]=texto.substr(texto.lastIndexOf('>')+1);
			c++;
		}
	}
	document.getElementById('headers').value=headers;
	datos="filtro="+filtro+
	'&headers='+headers+'&titulo='+titulo;
	/*document.getElementById('form_rep').src=url;
	document.getElementById('form_rep').submit();*/
	var a= new Ajax();
	a.open("POST",url,false);
	a.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	a.send(datos);
	window.open(a.responseText,"Reporte","","_blank");
}
y en el controlador:

Código:
function reporte()
	{
		$archivo="images/example.pdf";
		
		//Datos de consulta
		$titulo=$this->input->post("titulo");
		$cols=$this->input->post("headers");
		$headers=explode(',',$cols);
		$filtro=$this->input->post("filtro");
		$lista=$this->m_vehiculos->cons($filtro);
		$this->load->library('pdf');
		//Datos del documento
		$this->pdf->SetCreator(PDF_CREATOR);
		$this->pdf->SetAuthor('CDA Motocesar');
		$this->pdf->SetTitle($titulo);
		$this->pdf->SetSubject($titulo);
		//Datos de encabezado
		$this->pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING, array(0,64,255), array(0,64,128));
		$this->pdf->setFooterData(array(0,64,0), array(0,64,128));
		//Cortar la pagina
		$this->pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
		//Añadir la página		
		$this->pdf->AddPage();
		//Codigo HTML
		$html="<p>hola mundo</p>";
		$this->pdf->writeHTML($html, true, 0, true, 0);

		$this->pdf->Output($archivo, 'F');
		echo $archivo;
		//return "images*ci_guia_usuario.pdf";
	}
la url que abre el window.open es:

Código:
http://127.0.0.1/misitio/%3Cdiv%20style=%22border:1px%20solid%20#990000;padding-left:20px;margin:0%200%2010px%200;%22%3E%3Ch4%3EA%20PHP%20Error%20was%20encountered%3C/h4%3E%3Cp%3ESeverity:%20Warning%3C/p%3E%3Cp%3EMessage:%20%20fopen%28images/example.pdf%29:%20failed%20to%20open%20stream:%20Permission%20denied%3C/p%3E%3Cp%3EFilename:%20tcpdf/tcpdf.php%3C/p%3E%3Cp%3ELine%20Number:%207640%3C/p%3E%3C/div%3E%3Cstrong%3ETCPDF%20ERROR:%20%3C/strong%3EUnable%20to%20create%20output%20file:%20images/example.pdf
es decir que el output de tcpdf genera el error y luego si imprime la variable de la ruta.

Ayuda porque ya no se que mas hacer
  #6 (permalink)  
Antiguo 27/06/2013, 10:07
Avatar de Raziel_Ravenheart  
Fecha de Ingreso: agosto-2011
Ubicación: Ibagué, Tolima
Mensajes: 192
Antigüedad: 12 años, 7 meses
Puntos: 37
Respuesta: Ajax + codeigniter + tcpdf

Más o menos se cual es el problema, pero por motivos de no tener a la mano todo el código vas a necesitar depurar tu mismo todo el código.

Si te das cuenta el error, está en lo que devuelve el controlador, si leíste bien lo poco que se entiende en la url es que no se puede abrir el archivo imiages/example.pdf

Para depurar esos errores, toca saber que es lo que se está enviando desde el navegador y que es lo que está recibiendo el servidor

Para saber que se envía desde el navegador antes de enviar lo que se encuentra en la variable "datos", usa el método log, del objeto console.

console.log(datos);

y eso lo puedes ver en el depurador de cualquier navegador, para los cuales recomiendo el que trae por defecto el google chrome o instalar el firebug para el firefox

Y para saber que es lo que está recibiendo el servidor, en este caso, localhost, usa la función
var_dump( $datos ); en php, en donde $datos es la variable que recibe los datos del servidor, en este caso, creo que la variable global $_POST.

La información la puedes ver en el mismo depurador, en la respuesta que envía el servidor, para saber que está produciendo el error.

Un consejo, el uso de short tags o seas "<?= ?>" está obsoleto y es muy desaconsejado...

Debes aprender a depurar el código como los datos que se envían y reciben para que con el tiempo puedas ir entendiendo la dinámica del asunto.

Además apostaría que, el nombre del archivo debe ser solo eso, el nombre, no una cadena que contenga una ruta hacia otro directorio es decir:

$archivo = ''example.pdf";

en vez de

$archivo = "images/example.pdf";

. Para pasar el archivo a otro directorio, debes pasarlo con la función rename de php

Espero que esto te ayude
  #7 (permalink)  
Antiguo 02/07/2013, 09:09
 
Fecha de Ingreso: julio-2011
Mensajes: 6
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Ajax + codeigniter + tcpdf

Hola, que pena no haber respondido antes. Gracias por tus sugerencias (ya hice las mejoras). Probé todo lo que me dijiste y al final no logré hacerlo por eso decidí usar window,open y pasar las variables por get con lo que por fin pude hacerlo. De todas formas, agradezco tu colaboración :D

Etiquetas: ajax, codeigniter, funcion, tcpdf
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:47.