Devolviendo un PDF por AJAX

1,009 views
Skip to first unread message

yyeshua

unread,
Nov 11, 2010, 3:05:13 PM11/11/10
to symfony-es
Buen día señores, he aquí que estoy con un problema que no logro
resolver.

Para mi proyecto he creado una clase que se encarga de hacer una
petición SOAP a un servidor Jasper. Ya probé la clase fuera de sf y
funciona bien, et los log y la barra de sf no devuelven ningún error
concerniente a la petición SOAP. Jasper me devuelve un PDF que quiero
mostrar al cliente.

La petición la hago vía AJAX utilizando ExtJS.

El action en sf captura bien la petición, y la procesa.

$jasperClient = new JasperClient();
$pdf = $jasperClient->getReport();

En el ejemplo del cual creé mi clase imprimía el pdf muy fácil:

header('Content-type: application/pdf');
echo $pdf;

Desde luego eso no funciona dentro de un action o un template de
symfony @_@

¿Tenéis algún mecanismo con el cual pueda devolver el PDF desde el
action o la plantilla?.

Saludos.

Rigoberto Reyes

unread,
Nov 11, 2010, 5:20:13 PM11/11/10
to symfo...@googlegroups.com
usa un iframe

2010/11/11 yyeshua <yye...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a symfo...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a symfony-es+...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/symfony-es?hl=es.


Leandro

unread,
Nov 12, 2010, 8:46:17 AM11/12/10
to symfony-es
Hola, uno de los mencanismos para devolver el pdf podría ser:
En el Action:

$jasperClient = new JasperClient();
$pdf = $jasperClient->getReport();

$response = $this->getResponse();
$response->clearHttpHeaders();
$response->setContentType('application/pdfl');
$response->setHttpHeader('Content-Disposition: attachment;
filename="file.pdf";');
$response->sendHttpHeaders();
$response->setContent($pdf);

return sfView::NONE;

Una nota al pie:
Que necesidad tenés de hacerlo por AJAX? con sólo apuntar el navegador
a la url correcta
y forzando la descarga tendríamos el pdf sin dejar la página actual.
Es eso lo que buscás?

yyeshua

unread,
Nov 16, 2010, 11:11:35 AM11/16/10
to symfony-es
Hola. @Leandro de hecho hice algo similar a lo que pones, un poco más
sencillo:

/////-----------------Inicia código
$client = new JasperClient();
$pdf = $client->requestReport();

$response = $this->getResponse();
$response->setContentType('application/pdf');

return $this->renderText($pdf);

/////-----------------Termina código

Lo estaba haciendo por AJAX porque la petición la realizaba desde
ExtJS. Pero de hecho mi intención es que se descargue o se abra en una
pestaña aparte, esto último no lo he conseguido. Lo que sucede es que
el PDF se abre en el navegador cortesía de adobe, pero se abre en la
misma pestaña y no he logrado que se abra en una diferente @_@

Había pensado en decirle al formulario un target="_blank", pero no
encuentro por ningún lado como asignar ese atributo a un formulario de
ExtJS. Y tampoco encuentro como forzar la descarga =/

Bueno, gracias, saludos, y nuevas soluciones son bienvenidas ^^

Leandro

unread,
Nov 16, 2010, 1:58:50 PM11/16/10
to symfony-es
Si, mucho más simple como decís vos.
Abrir en una nueva pestaña nosé, pero para forzar la descarga lo
estarías haciendo con:

$response->setHttpHeader('Content-Disposition: attachment;
filename="file.pdf";');

Saludos!
Reply all
Reply to author
Forward
0 new messages