downloadPDF() {
const pdf = new jsPDF('p', 'mm', 'a4', false);
const content = this.invoiceDiv.nativeElement;
const footer = this.footerDiv.nativeElement;
// Set page dimensions (a4 size)
const imgWidth = 210;
const pageHeight = 295;
html2canvas(content).then((canvas) => {
const imgData = canvas.toDataURL('image/png', 1); // convert content to img data
const imgHeight = (canvas.height * imgWidth) / canvas.width;
let heightLeft = imgHeight; // keep track of amount of content left to be pushed to pdf
let position = 0;
// Add content to first page
pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight); // add a certain portion of the image data to pdf
if (heightLeft >= pageHeight) {
// this whole page will be needed
heightLeft -= pageHeight;
} else {
// there will be space left in the page after filling in the content
heightLeft = pageHeight - heightLeft;
}
// Add content to subsequent pages
if (imgHeight > pageHeight) {
// need more than 1 page
while (heightLeft >= 0) {
position = heightLeft - imgHeight; // find out the position where the next portion of the img data will be attached
pdf.addPage();
pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
if (heightLeft >= pageHeight) {
heightLeft -= pageHeight;
} else {
heightLeft = pageHeight - heightLeft; // all contents added. calc how much space is left in the last page
break;
}
}
}
html2canvas(footer).then((footerCanvas) => {
const footerImgData = footerCanvas.toDataURL('image/png');
const footerImgHeight = (footerCanvas.height * imgWidth) / footerCanvas.width;
// Check if there is enough space for footer on current page
if (heightLeft - footerImgHeight > 0) {
position += pageHeight - footerImgHeight + 3; // add the footer at the end of the page (+3 to handle jantrik truti)
pdf.addImage(footerImgData, 'PNG', 0, position, imgWidth, footerImgHeight);
} else {
// Add new page and add footer there
pdf.addPage();
position = 0;
pdf.addImage(footerImgData, 'PNG', 0, position, imgWidth, footerImgHeight);
}
const padZerosPipe = new PadZerosPipe();
pdf.save('invoice-' + padZerosPipe.transform(this.invoiceData.InvoiceNo, 3) + '.pdf');
});
});
}