banner render PDF

Es muy común tener que trabajar con documentos PDF en nuestras aplicaciones. En Laravel podemos generar PDFs haciendo uso de librerías como DOMPDF para después retornarlos de alguna forma al usuario. Haciendo uso de un plugin de Vue.js llamado vue-pdf podemos renderizar documentos PDF en el navegador de forma muy sencilla.

Ejemplo de vue-pdf

Instalación y configuración

El proceso de instalación de vue-pdf es muy simple, nada más debemos ejecutar el siguiente comando de NPM en la terminal:

#
npm install --save vue-pdf

Hecho esto importamos vue-pdf en nuestra aplicación de Vue.js:

import pdf from 'vue-pdf'

export default {
    components: {
        pdf
    }
}

Una vez importado podemos renderizar un documento PDF llamando al componente desde nuestra plantilla indicando en src la ruta a nuestro documento:

<template>
  <pdf src="/ruta/al/documento.pdf"></pdf>
</template>

Por defecto, solo la primera página de nuestro documento será renderizada. A continuación veremos cómo mostrar todas las páginas de nuestro documento además de aprender cómo personalizar el uso del plugin.

Propiedades

vue-pdf tiene tres propiedades que usamos para poder mostrar nuestro documento:

  • src: en esta propiedad indicamos la ubicación de nuestro documento.
  • page: en esta propiedad indicamos la página que queremos mostrar.
  • rotate: en esta propiedad indicamos la posición en la que queremos mostrar nuestro documento.

Supongamos que queremos mostrar nuestro documento en la segunda página y con una rotación de 180 grados, lo haríamos de la siguiente forma:

<-- Uso del componente -->
<pdf :src="/ruta/al/documento.pdf" :rotate="180" :page="2"></pdf>

En la propiedad rotate sólo múltiplos de 90 son válidos como valor (90, 180, 270 y 360).

Obteniendo el número de páginas

Para obtener el número de páginas debemos cambiar un poco la forma en la que cargamos nuestro documento. Ahora, en lugar de llamar directamente al documento en la propiedad src pasaremos un valor desde nuestra instancia de Vue. Esto nos permitirá no sólo obtener el número de páginas sino también realizar otro tipo de cambios, como renderizar todas las páginas del documento. Veamos los cambios que debemos realizar:

import pdf from 'vue-pdf'

var pdfDocument = pdf.createLoadingTask('/ruta/al/documento.pdf');

export default {
    data () {
        return {
            src: pdfDocument,
            numPages: 0
        }
    },
    components: {
        pdf
    }
}

Como puedes observar ahora cargamos el documento con pdf.createLoadingTask y lo guardamos en una variable llamada pdfDocument, que luego pasamos como valor a la propiedad src en data. En data también definimos una propiedad numPages con un valor por defecto de cero.

Hecho esto, en mounted() podemos actualizar la variable numPages con el número de páginas:

mounted() {
    this.src.then(pdf => {
        this.numPages = pdf.numPages;
    });
}

Para finalizar simplemente actualizamos nuestra plantilla. Observa que ahora en lugar de pasar la ruta al documento directamente enlazamos la propiedad src que tenemos en data:

<template>
    <div>
        Número de páginas: {{ numPages }}
        <pdf :src="src"></pdf>
    </div>
</template>

Renderizando todas las páginas

Hasta el momento sólo podemos ver una página a la vez, lo cual no es lo más ideal. A continuación veremos como podemos renderizar todas las páginas de nuestro documento PDF.

En nuestra instancia de Vue tenemos todo lo necesario para poder mostrar todas las páginas, simplemente debemos cambiar la plantilla, agregando un v-for donde utilizamos la propiedad numPages para renderizar todo:

<pdf 
     v-for="i in numPages"
     :key="i"
     :src="src"
     :page="i"
     style="display: inline-block; width: 100%"
></pdf>

Observa cómo en :page pasamos la página que queremos mostrar, que previamente obtenemos en el v-for.

Puedes ajustar la propiedad width de style para, por ejemplo, mostrar dos páginas a la vez.

Ejemplo al 50%

En la imagen superior la propiedad width está ajustada al 50%.

Si quieres conocer un poco más del plugin puedes visitar su repositorio en GitHub.

El libro usado en los ejemplos es La Elegancia de Vue 2 traducido por Styde y disponible en Leanpub.

Material relacionado

No olvides seguirnos en Twitter y suscribirte a nuestro boletín:

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.