Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Vista Previa de PDF sin guardarlo necesariamente

5 de febrero de 2016

He estado buscando la forma de mostrar una vista previa del pdf sin guardar el mismo pero no he tenido exito. Explicando mejor lo que necesito:

Tengo un formulario que al llenar los datos me gustaria que existiera la posibilidad de imprimir una plantilla de pdf con dichos datos cargados con una estetica definida. Luego, no quiero tener que guardar el pdf porque no lo necesito, o sea si se quisiera imprimir la planilla tocaria ir a los datos del trabajador y nuevamente dar vista previa e imprimir. Pero lo que quiero es que sea algo dinamico que se genere al momento porque luego si se cambia algun dato del trabajador tocaria volver a generar el pdf y borrar el anterior en caso de que lo guarde. Estuve pensando en generarlo como un temporal mientras se este mostrando la vista previa y luego eliminarlo. He visto los plugins viewer.js y pdf.js en otras discusiones de aqui del foro como opcion pero dependen de un pdf ya generado.

Lo que quiero es evitarme que salga esta pantalla del navegador de guardar pdf y ademas tener 500 pdfs guardados que raramente volvere a usar.

Existe la posibilidad de generar la vista previa sin tener un pdf guardado o me tocaria aplicar la parte de crearlo temporal??


Respuestas

#1

Para ese caso he utilizado la clase FPDF, lo que hago es generarlo más no se guarda y cada vez que necesites ves el documento se podrá visualizar, y es fácil de utilizar esa clase de php en su sitio oficial hay ejemplo detallado de como generarlo.

@eng_teresa

7 febrero 2016, 15:54
#2

Comparto mi solución con ustedes. Finalmente lo que hice fue utilizar el bundle https://github.com/KnpLabs/KnpSnappyBundle para generarlo, luego le habilite la opción de sobreescritura para que lo guardara con el mismo nombre siempre y de tal manera solo tener el último que se generó.

Luego utilicé pdf.js para visualizar el archivo porque el objetivo final de la funcionalidad es mostrarle al usuario en la misma aplicación el PDF con los datos del usuario para imprimir(inicialmente configuré viewer.js pero no tiene soporte para imprimir https://github.com/kogmbh/ViewerJS/issues/131). Acá les dejo algunas partes relevantes por si alguien las necesita algún día.

Generación del PDF con la opción de sobreescribir activa (cuarto parámetro de generateFromHtml en true)

$this->get('knp_snappy.pdf')->generateFromHtml(
            $this->renderView(
                '@TalentoHumano/Trabajador/utiles/pdf_datos_trabajador.html.twig', array(
                    'trabajador' => $trabajador
                )),
            '/var/www/html/Project/web/uploads/snappy/trabajador.pdf',
            array(),
            true
        );

Muestro el pdf generado con PDF.js

<iframe
        src="{{ asset('bundles/backend/plugins/pdfjs/web/viewer.html') }}?file={{ asset('uploads/snappy/trabajador.pdf') }}"
        width="1170" height="450">
</iframe>

Saludos.

@RoberRielo

12 febrero 2016, 6:00
#3

No sé si entendí bien la pregunta, pero en uno de mis proyecto tengo generar un certificado, obviamente con datos variable y con un formato predefinido.

Mi solución pasó por generar el certificado en html, en twig, pasando las variables. Una vez construido el cuerpo del certificado uso la clase TCPDF, la cual tengo integrada en mi proyecto Symfony2, y ocupo un método para generar el pdf en html que trae la clase. Una vez generado el pdf, en el método de salida de la clase, le indico si deseo que el pdf se muestre por pantalla, o que se descargue directamente al disco duro. Para verlo en pantalla, usa el visor pdf que tenga el navegador por defecto. En caso de no tenerlo, o de tener desactivada esa opción (que me pasó en firefox) el archivo se descarga al disco del usuario. En ningún momento lo almaceno como temporal en el servidor.

Para imprimir el certificado, se usa la impresión que trae el navegador por defecto.

Te dejo parte del código que usé para solucionar esto:

/**
     * Action que genera el PDF del certificado. Según el parámetro de 
     * la URL que se pase, el pdf se muestra en pantalla o se descarga
     * 
     * @Route("/pdf/cert/ant/{hash}", name="consultas_certificado_antiguedad_pdf", 
     *      defaults={"descargar" = 0})
     * @Route("/pdf/cert/ant/{hash}/{descargar}", name="consultas_certificado_antiguedad_pdf_down", 
     *      requirements={"descargar" : "[0-1]"})
     * @Method({"GET"})
     */
    public function generarCertificadoAntiguedadAction($hash, $descargar)
    {
        /* Obtiene el personal asociado al usuario que ha iniciado sesión */
        $personal = $this->get('security.token_storage')->getToken()->getUser()->getPersonal();
 
        // lógica para comparar los hash, si pasa validacion sigue el codigo
 
        /* Se obtiene el script del certificado desde los parámetros */
        $script = $this->get('app.parametros')->getCert_ant(); //El script del certificado viene formateado en HTML
 
        /* Se extraen los marcadores a través de una expresión regular */
        preg_match_all('/@[email protected](?<entidad>\w+)\.(?<atributo>\w+)@[email protected]/', $script, $marcadores);
 
        /* Se realiza el reemplazo de los valores por los marcadores */
        $html_body = $this->reemplazarMarcadores($marcadores, $script);
 
        /* Se obtienen los html de las diferentes secciones que componen el PDF */
        $html_estilos = $this->render('consultas/pdf/cert_antiguedad_estilos.html.twig')->getContent();
        $html_titulo = $this->render('consultas/pdf/cert_antiguedad_titulo.html.twig', array('personal'=>$personal))->getContent();
 
        /* Obtiene el servicio de generación de PDF */
        $pdf = $this->get('app.pdf_manager.printer');
 
        /* Setea si se imprimirá tanto el header como el footer, además de 
         * agregar una página vacía, el título y el cuerpo */
        $pdf->setImprimirHeader(true)
                ->setImprimirFooter(false)
                ->agregarPaginaVacia()
                ->agregarHTMLCell('','','',16,$html_estilos.$html_titulo)
                ->agregarHTMLCell('','','',35,$html_estilos.$html_body);
 
        /* Dependiendo del parámetro $descargar de la URL, el archivo se visualiza o se descarga */
        $destino = $descargar ? 'D' : 'I';
 
        $nombreArchivo = sprintf('Certificado Antiguedad %s.pdf', $personal->getNombre());
 
        /* Se genera el pdf a través de $pdf->Output() con el nombre del archivo
         * y el destino (ver en pantalla o descargar) */
        return $pdf->Output($nombreArchivo,$destino);
    }

Con eso solucioné mi problema. La clave está en la generación de mi contenido hmtl a través las plantillas twig:

$html_titulo = $this->render('consultas/pdf/cert_antiguedad_titulo.html.twig', array('personal'=>$personal))->getContent();
$html_body = $this->reemplazarMarcadores($marcadores, $script);
$html_estilos = $this->render('consultas/pdf/cert_antiguedad_estilos.html.twig')->getContent();

Espero poder haber aportado un granito de arena, si es que entendí bien el problema. Si necesitas que ahonde más, solo dilo.

Saludos desde Chile

@SebaRiquelmeP

13 febrero 2016, 4:27