J'ai une erreur: jsPDF n'est pas défini, j'utilise actuellement le code suivant:
import { Component, OnInit, Inject } from '@angular/core';
import 'jspdf';
declare let jsPDF;
@Component({
....
providers: [
{ provide: 'Window', useValue: window }
]
})
export class GenratePdfComponent implements OnInit {
constructor(
@Inject('Window') private window: Window,
) { }
download() {
var doc = jsPDF();
doc.text(20, 20, 'Hello world!');
doc.text(20, 30, 'This is client-side Javascript, pumping out a PDF.');
doc.save('Test.pdf');
}
}
J'ai installé npm de jsPDF mais je ne sais pas comment importer jspdf et exécuter avec angular-cli: 1.0.0-beta.17
Je l'ai fait, après avoir fait beaucoup de R & D, il ne reste que quelques étapes à suivre: Install:
npm install jspdf --save
typings install dt~jspdf --global --save
npm install @types/jspdf --save
_ {Ajouter la suite dans angular-cli.json:} _
"scripts": [ "../node_modules/jspdf/dist/jspdf.min.js" ]
html:
<button (click)="download()">download </button>
composant 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');
}
}
J'ai créé une démo jsPdf basée sur cette réponse avec l'aide de @gsmalhotra
Première installation
npm install jspdf --save
J'ai utilisé un tableau d'images, convertissant d'abord l'image en base64 (jsPDF n'autorise pas les URL d'image)
getBase64Image(img) {
var canvas = document.createElement("canvas");
console.log("image");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
var dataURL = canvas.toDataURL("image/jpeg");
return dataURL;
}
Puis, dans une boucle, j'ai appelé la fonction ci-dessus qui renvoie une image base64, puis j'ai ajouté une image à PDF à l'aide de doc.addImage()
.
for(var i=0;i<this.images.length;i++){
let imageData= this.getBase64Image(document.getElementById('img'+i));
doc.addImage(imageData, "JPG", 10, (i+1)*10, 180, 150);
doc.addPage();
}
Code HTML
<div class="col-md-4" *ngFor="let img of images;let i=index">
<img id="img{{i}}" class="img-fluid" crossOrigin="Anonymous" [src]="img.url">
</div>
Vieille question, mais c’est une solution alternative que je me suis lancée dans mon application angulaire. J'ai fini par modifier cette solution jsPDF pour travailler sans utiliser le CLI ionic/cordova.
npm install jspdf --save
npm install @types/jspdf --save
npm install html2canvas --save
npm install @types/html2canvas --save
Ajouter un identifiant à n'importe quel div contenant le contenu que vous voulez générer le PDF
<div id="html2Pdf">your content here</div>
Importer les bibliothèques
import * as jsPDF from 'jspdf';
import * as html2canvas from 'html2canvas';
Ajouter la méthode pour générer le PDF
generatePdf() {
const div = document.getElementById("html2Pdf");
const options = {background: "white", height: div.clientHeight, width: div.clientWidth};
html2canvas(div, options).then((canvas) => {
//Initialize JSPDF
let doc = new jsPDF("p", "mm", "a4");
//Converting canvas to Image
let imgData = canvas.toDataURL("image/PNG");
//Add image Canvas to PDF
doc.addImage(imgData, 'PNG', 20, 20);
let pdfOutput = doc.output();
// using ArrayBuffer will allow you to put image inside PDF
let buffer = new ArrayBuffer(pdfOutput.length);
let array = new Uint8Array(buffer);
for (let i = 0; i < pdfOutput.length; i++) {
array[i] = pdfOutput.charCodeAt(i);
}
//Name of pdf
const fileName = "example.pdf";
// Make file
doc.save(fileName);
});
}
J'ai trouvé que cette solution fonctionnait bien pour mon application Web et que je pouvais contrôler le moment où je souhaitais générer le fichier PDF (après avoir reçu des données de manière asynchrone). De plus, je n'avais besoin d'installer aucune bibliothèque à l'échelle mondiale.