Angular2 - Generate pdf from HTML using jspdf

49,784

Solution 1

What I found worked was adding:

<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script>

to the index.html file (it could presumably be elsewhere).

I then used:

const elementToPrint = document.getElementById('foo'); //The html element to become a pdf
const pdf = new jsPDF('p', 'pt', 'a4');
pdf.addHTML(elementToPrint, () => {
    doc.save('web.pdf');
});

Which no longer uses html2canvas in the code.
You can then remove the following import:

import * as html2canvas from 'html2canvas';

Solution 2

In case someone prefer not to use cdn scripts & would like to use a more (angular) way, this worked for me in Angular 6:

Using this way will give you better support & autocomplete in the editor & will help you avoid depending on cdn scripts (if you wanna avoid them, like me)

Based on the excellent answer here & since it was hard for me to find that answer, I am re-sharing what was stated in it & helped me use jsPDF in Angular 6 (all credit goes to the original author of this answer)

You should run these cmds:

npm install jspdf --save

typings install dt~jspdf --global --save

npm install @types/jspdf --save

Add following in angular-cli.json:

"scripts": [ "../node_modules/jspdf/dist/jspdf.min.js" ]

html:

<button (click)="download()">download </button>

component ts:

import { Component, OnInit, Inject } from '@angular/core';
import * as jsPDF from 'jspdf'
@Component({
  ...
  providers: [
    { provide: 'Window',  useValue: window }
  ]
})
export class GenratePdfComponent implements OnInit {

  constructor(
    @Inject('Window') private window: Window,
    ) { }

  download() {

        var doc = new jsPDF();
        doc.text(20, 20, 'Hello world!');
        doc.text(20, 30, 'This is client-side Javascript, pumping out a PDF.');
        doc.addPage();
        doc.text(20, 20, 'Do you like that?');

        // Save the PDF
        doc.save('Test.pdf');
    }
}

Solution 3

Anyone still trying to convert an Html div to a pdf can opt to use html2pdf, with a couple of lines you can do everything with ease.

var element = document.getElementById('element-to-print');
html2pdf(element);

Solution 4

Try it like this:

GeneratePDF () {
    html2canvas(this.element.nativeElement, <Html2Canvas.Html2CanvasOptions>{
      onrendered: function(canvas: HTMLCanvasElement) {
        var pdf = new jsPDF('p','pt','a4');    
        var img = canvas.toDataURL("image/png");
        pdf.addImage(img, 'PNG', 10, 10, 580, 300);
        pdf.save('web.pdf');
      }
    });
  }

Solution 5

Use this way stackblitz example

import {jsPDF} from 'jspdf';

@ViewChild('content', {static: false}) content: ElementRef;


public downloadPDF() {
   const doc = new jsPDF();

   const specialElementHandlers = {
      '#editor': function (element, renderer) {
       return true;
       }
   };

   const content = this.content.nativeElement;

   doc.fromHTML(content.innerHTML, 15, 15, {
      width: 190,
     'elementHandlers': specialElementHandlers
   });

   doc.save('fileName.pdf');
}
Share:
49,784
FlorisdG
Author by

FlorisdG

Front-end web-developer by day, game-developer by night.

Updated on July 05, 2022

Comments

  • FlorisdG
    FlorisdG almost 2 years

    For a project I'm working on I need to be able to generate a PDF of the page the user is currently on, for which I'll use jspdf. Since I have a HTML I need to generate a PDF with, I'll need the addHTML() function. There are a lot of topic about this, saying

    You'll either need to use html2canvas or rasterizehtml.

    I've chosen to use html2canvas. This is what my code looks like at the moment:

    import { Injectable, ElementRef, ViewChild } from '@angular/core';
    import * as jsPDF from 'jspdf';
    import * as d3 from 'd3';
    import * as html2canvas from 'html2canvas';
    
    @Injectable ()
    export class pdfGeneratorService {
    
      @ViewChild('to-pdf') element: ElementRef;
    
      GeneratePDF () {
        html2canvas(this.element.nativeElement, <Html2Canvas.Html2CanvasOptions>{
          onrendered: function(canvas: HTMLCanvasElement) {
            var pdf = new jsPDF('p','pt','a4');
    
            pdf.addHTML(canvas, function() {
              pdf.save('web.pdf');
            });
          }
        });
      }
    }
    

    When this function is called, I get a console error:

    EXCEPTION: Error in ./AppComponent class AppComponent - inline template:3:4 caused by: You need either https://github.com/niklasvh/html2canvas or https://github.com/cburgmer/rasterizeHTML.js

    Why exactly is this? I give a canvas as parameter and it still says I need to use html2canvas.

  • Tim Schimandle
    Tim Schimandle about 7 years
    Would be nice if the import statement worked. But This should be selected as the answer for now.
  • Vignesh
    Vignesh over 6 years
    @Greg without importing the script in index.html. Can we able to do load html2canvas.js
  • Pratap A.K
    Pratap A.K over 6 years
    where are you using html2canvas in your code apart from importing? I'm getting error You need either github.com/niklasvh/html2canvas or github.com/cburgmer/rasterizeHTML.js Error: You need either github.com/niklasvh/html2canvas or github.com/cburgmer/rasterizeHTML.js at Object.e.API.addHTML
  • balazs630
    balazs630 over 6 years
    Thanks, this solution worked for me in an Angular 5 project! Adding the script in index.html is crucial, if you only add it in angular.cli.json, it will not work somehow. The scipt needs to be in index.html.This is the newest version right now: 0.5.0-beta4
  • Vignesh
    Vignesh over 6 years
    I tried your suggestion it worked fine after updating the packages to latest version >"html2canvas:1.0.0-alpha.9", "jspdf": "^1.3.5", "jquery": "^3.3.1". Generating of pdf from HTML using jspdf is not working.
  • Sadiq Ali
    Sadiq Ali about 6 years
    Can you let me know the reason for the down vote? html2pdf uses jspdf internally and it makes things a lot easier. Someone might find it useful as this question is what most people stumble upon.
  • akcasoy
    akcasoy about 4 years
    @Vignesh "npm i html2canvas", and add the file path ("node_modules/html2canvas/dist/html2canvas.js") in your angular.json scripts array.