VISUALIZAR PDF EN UN IFRAME SYMFONY2

Hace algunos dias tuve este dilema, mi aplicacion generaba varios PDF, los cuales se guardaban en una subcarpeta dentro de la carpeta web de la aplicacion, pues bien, los PDF existian, eran accesibles para la aplicacion pero… ¿Como se los mostraba al Usuario? busque varias formas clasicas en PHP para incrustar el PDF en una pagina web y que fueran visibles como si estuvieramos viendo un PDF online o un documento word pero debido al sistema de rutas que maneja Symfony2 me era un poco problematico.

Mientras buscaba una manera me encontre con un post bastante util el cual me ayudo a solucionar este pequeño gran problema que ya empezaba a ser un dolor de cabeza, el cual detallo a continuacion:

  1. Lo primero que haremos sera descargar el Viewer.js desde su pagina oficial viewerjs.org, el link de descargar esta mas abajo en la pagina, te recomiendo buscar la palabra «Download» con tu navegador, puedes descargar cualquiera de las dos opciones que te da, personalmente descargue la primera.
  2. Ahora crearemos una carpeta llamada public dentro de nuestro bundle especificamente en symfony\src\RutaDelBundle\Resources, quedando la direccion completa asi symfony\src\RutaDelBundle\Resources\public 
  3. Una vez creada la carpeta, tomaremos nuestro archivo descargado de la pagina de viewer y lo descompriremos dentro de la carpeta public que creamos arriba, lo cual nos generara una carpeta llamada por ejemplo viewerjs-0.5.4, asi que la renombraremos y la dejaremos como viewer.js 
  4. Ahora, haremos que nuestra aplicacion la copie a donde corresponda, para ello ejecutaremos este comando en la consola de windows si te muestra algun error, recuerda que debes estar dentro de la carpeta donde esta tu proyecto para que reconozca app/console
    php app/console assets:install web

    Si todo sale bien, esto nos copiara la carpeta que acabamos de crear a la carpeta web con todo lo que implica.

  5. Por ultimo para visualizar el PDF en nuestra pagina lo que personalmente hice fue ocupar un iframe y quedo asi, por razones obvias omitire el primer y ultimo signo de apertura y cierre para que no intente cargarlo aqui 😉
    iframe
     id="viewer"
     src="{{ asset('bundles/anweb/viewer.js/index.html') }}#{{ asset('/bundle/pdf/prueba.pdf') }}"
     width='920' height='400'
    ></iframe

    Ahora veamos que posee:

    A) El id viewer te recomiendo no modificarlo para no producir problemas
    B) El SRC se divide en tres partes:
    B.1) La primera es la ruta que generamos arriba con el comando, puedes buscarla, estara dentro de la carpeta /web/bundles/ y debe ir tal cual esta ahi (bundles/NOMBRE/viewer.js/index.html), de otro modo te mostrara un error de ruta.
    B.2) La segunda es el # que le indica al Viewer.js que lo que sigue a continuacion es lo que el debe buscar y mostrar.
    B.3) Por ultimo la ruta de nuestro archivo te recomiendo que este dentro de la carpeta web para que nuestro asset pueda encontrarlo facilmente.
    C) El ancho y alto es segun tus necesidades

Bueno, con esto ya estaria incrustando nuestro PDF en una pagina web de Symfony2, pero como no todo es copiar y pegar aqui vamos a dar unos pequeños datos por los cual estuve varias horas indagando en el codigo

  1. Para ocultar los botones por ejemplo de Presentacion, Fullscreen, etc debes hacerlo si o si por CSS, ya que de otro modo produciras un error en el Javascript del Viewer y te empezaras a complicar mas de la cuenta, asi que dentro del archivo viewer.js/index.html crea un  tag style y segun el ID que posea lo que deseas ocultar le agregas un display: none y listo.
  2. Es un detalle menor la verdad, pero en el firebug te muestra un error de 1024 caracteres porque no encuentra la cabecera meta, esto es debido a los comentarios que posee en la parte superior puedes cortarlos y pegarlos al final de la pagina o borrarlos, es tu decision.
  3. Dentro del listado de Zoom que te muestra existe una opcion llamada custom la cual puedes personalizar, si no la ocuparas te recomiendo comentarla, ya que de otro modo se mostrara una linea vacia.
  4. Por ultimo pero no menos importante, por defecto al mostrarte un documento te carga una vista Automatic o auto para cambiar esta vista o zoom por alguna de las opciones que te muestra el select scaleSelectContainer (ver index.html), la unica manera que encontre es abrir el archivo viewer.js y buscar:
     e("auto");

    Una vez encontrado esto solo debes cambiar la palabra auto por el valor del select, por ejemplo si deseamos que al cargar el PDF se muestre en Full Width bastara con dejar

     e("page-width");

    Y listo, notese que la opcion en el archivo index.html es:

     <option id="pageWidthOption" value="page-width">Full Width</option>

    Nosotros solo tomamos el value que este posee y lo reemplazamos

 

Eso seria todo, espero te sea de utilidad.

 

Saludos