Revista Tecnología

Generar PDF con Angular JS 5

Publicado el 17 agosto 2018 por Juan Ricardo Castro Lurita @pepoflex

Demo Github

Angular JS cuenta con muchas características que ayudan mucho al Desarrollo Web, una de estas es la de poder generar PDFs dinámicamente desde un contenido HTML, e incluso puedes manipular el PDF que se va generar para darle una mejor presentación, en este artículo te enseñaremos a como generar un hermoso PDF con imágenes.

Generar PDF con Angular JS 5

imagen: tristatetechnology.com

Desplegando Librerías

Nosotros avalamos el Desarrollo de Software ágil ya que es parte importante en la entrega del producto al cliente, vamos usar 2 librerías para nuestro ejemplo una es HTML2Canvas y jsPDF .

jsPDF

Con esta librería vamos a generar PDFs en nuestra vista Fron, para instalarlo vamos a nuestra consola de comandos y escribimos

npm install jspdf --save

HTML2Canvas

Con la anterior librería generamos PDF, pero necesitamos que el PDF se genere desde el contenido que se encuentre en una capa o div HTML de nuestra vista Front, para ello usaremos esta librería que nos facilitará la tarea de renderizar el contenido HTML de nuestra vista, para instalarlo ejecutamos 2 comandos cada uno por separado

// Primero ejecutamos este comando
npm install --save html2canvas

// Luego este otro
npm install --save @types/html2canvas

Componente

En nuestro componente llamado app.component.ts instanciamos las librerías que hemos instalado en el paso anterior

import * as jsPDF from 'jspdf';
import * as html2canvas from 'html2canvas';

Ahora vamos a crear 4 variables de contenidos un titulo y 3 imágenes que mostraremos en nuestra vista Front, las imagenes las colocamos dentro de nuestra carpeta assets y dentro de ella otra carpeta llamada img

export class AppComponent {

  titulo = 'Generar PDF con Angular JS 5';
  imagen1 = 'assets/img/tc.jpg';
  imagen2 = 'assets/img/pm.jpg';
  imagen3 = 'assets/img/al.jpg';

}

Ahora nuestra función, muy importante que se ejecutará al ser llamada con un botón que para Generar el PDF desde nuestra vista Front, esta función nos va permitir renderzar imágenes con el atributo allowTaint, también definimos la calidad del PDF que se generará con el atributo scale.

generarPDF(){
    html2canvas(document.getElementById('contenido'), {
       // Opciones
       allowTaint: true,
       useCORS: false,
       // Calidad del PDF
       scale: 1
    }).then(function(canvas) {
    var img = canvas.toDataURL("image/png");
    var doc = new jsPDF();
    doc.addImage(img,'PNG',7, 20, 195, 105);
    doc.save('postres.pdf');
   });
}

En el método addImage que esta dentro de la función generarPDF, definimos el formato de salida del gráfico PDF de tipo PNG y la ubicación en el PDF del contenido que este con las coordenadas x=7 y en y=20, asi mismo definimos el ancho=195 y el alto=105 del contenido dentro del PDF

doc.addImage(img,'PNG',7, 20, 195, 105);

Veamos el código completo de nuestro app.component.ts

import { Component } from '@angular/core';
import * as jsPDF from 'jspdf';
import * as html2canvas from 'html2canvas';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent {

  titulo = 'Generar PDF con Angular JS 5';
  imagen1 = 'assets/img/tc.jpg';
  imagen2 = 'assets/img/pm.jpg';
  imagen3 = 'assets/img/al.jpg';

  	generarPDF(){
	    html2canvas(document.getElementById('contenido'), {
        // Opciones
        allowTaint: true,
        useCORS: false,
        // Calidad del PDF
        scale: 1
      }).then(function(canvas) {
		    var img = canvas.toDataURL("image/png");
		    var doc = new jsPDF();
		    doc.addImage(img,'PNG',7, 20, 195, 105);
		    doc.save('postres.pdf');
	    });
  	}

}

La Vista

En nuestra vista colocaremos un contenedor en donde están todos los elementos que Angular va a renderizar a PDF, colocamos una capa con el id=”contenido” y un botón que al hacerle click llamará a la función generarPDF() para proceder a renderizar el contenido a PDF

<div class="album py-5" align="center">
        <div class="container" id="contenido">

          <h2>Postres</h2>

          <div class="row">            
            
            <div class="col-md-4">
              <div class="card mb-4 shadow-sm">
                <img src="{{imagen1}}" title="Torta de Chocolate" alt="Torta de Chocolate">
                <div class="card-body">
                  <p class="card-text">Torta de Chocolate</p>
                </div>
              </div>
            </div>
            
            <div class="col-md-4">
              <div class="card mb-4 shadow-sm">
                <img src="{{imagen2}}" title="Pie de Manzana" alt="Pie de Manzana">
                <div class="card-body">
                  <p class="card-text">Pie de Manzana</p>
                </div>
              </div>
            </div>

            <div class="col-md-4">
              <div class="card mb-4 shadow-sm">
                <img src="{{imagen3}}" title="Arroz con Leche" alt="Arroz con Leche">
                <div class="card-body">
                  <p class="card-text">Arroz con Leche</p>
                </div>
              </div>
            </div>

            
          </div>          
          
        </div>

        <button (click)="generarPDF()" class="btn btn-info">Crear PDF</button>

</div>

Nota

Para trabajar con comandos NPM es necesario que tengas instalado Node JS, si no lo tienes aún te recomendamos leer nuestro artículo Que es y Como instalar Node JS para que sepas de que trata.

Generar PDF con Angular JS 5

imagen: atharvasystem.com

Síguenos en las Redes Sociales para que no te pierdas nuestros próximos contenidos.


Volver a la Portada de Logo Paperblog

Revista