From 03d742a32e06c5601f9c93d130ecac8910089bb6 Mon Sep 17 00:00:00 2001 From: khaled-sadegh <sadegh2000ndb@gmail.com> Date: Thu, 9 Feb 2023 03:06:24 +0100 Subject: [PATCH] premiere modification convention --- package-lock.json | 90 +++++++++++++++++++++-- package.json | 2 + src/internships/internships.controller.ts | 9 +++ src/internships/internships.service.ts | 50 +++++++++++++ 4 files changed, 145 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e57a031..84e8a8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,9 +24,11 @@ "mailgun-js": "^0.22.0", "mongoose": "^6.7.2", "multer": "^1.4.5-lts.1", + "node-fetch": "^2.6.9", "passport": "^0.6.0", "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", + "pdf-lib": "^1.17.1", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0" @@ -3005,6 +3007,22 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "dependencies": { + "pako": "^1.0.6" + } + }, + "node_modules/@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "dependencies": { + "pako": "^1.0.10" + } + }, "node_modules/@pkgr/utils": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", @@ -10748,9 +10766,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -11119,6 +11137,11 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -11307,6 +11330,22 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, + "node_modules/pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "dependencies": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, + "node_modules/pdf-lib/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/peberminta": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.8.0.tgz", @@ -16409,6 +16448,22 @@ } } }, + "@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "requires": { + "pako": "^1.0.6" + } + }, + "@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "requires": { + "pako": "^1.0.10" + } + }, "@pkgr/utils": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", @@ -22504,9 +22559,9 @@ } }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", "requires": { "whatwg-url": "^5.0.0" } @@ -22766,6 +22821,11 @@ } } }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -22907,6 +22967,24 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, + "pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "requires": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, "peberminta": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.8.0.tgz", diff --git a/package.json b/package.json index 4ef62fc..245e3d9 100644 --- a/package.json +++ b/package.json @@ -40,9 +40,11 @@ "mailgun-js": "^0.22.0", "mongoose": "^6.7.2", "multer": "^1.4.5-lts.1", + "node-fetch": "^2.6.9", "passport": "^0.6.0", "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", + "pdf-lib": "^1.17.1", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0" diff --git a/src/internships/internships.controller.ts b/src/internships/internships.controller.ts index 3db74f0..82b3230 100644 --- a/src/internships/internships.controller.ts +++ b/src/internships/internships.controller.ts @@ -49,6 +49,14 @@ export class InternshipsController { return this._internshipsService.create(internshipDto); } + @Post("/generate/:id") + generatePDF(@Param() params: { id: string }): Promise<InternshipEntity> { + return this._internshipsService.generatePDF(params.id); + } + + + + @Put(':studentId') update( @Param() params: { studentId: string }, @@ -103,4 +111,5 @@ export class InternshipsController { ): Promise<InternshipEntity | void> { return this._internshipsService.delete(params.studentId); } + } diff --git a/src/internships/internships.service.ts b/src/internships/internships.service.ts index 9d3af20..038980d 100644 --- a/src/internships/internships.service.ts +++ b/src/internships/internships.service.ts @@ -2,6 +2,11 @@ import { Injectable } from '@nestjs/common'; import { InternshipDao } from './dao/internships.dao'; import { CreateInternshipDto } from './dto/create-internship.dto'; import { InternshipEntity } from './entities/internship.entity'; +import { PDFDocument, StandardFonts, rgb, degrees } from 'pdf-lib'; +import { readFileSync, writeFileSync } from 'fs'; +import { join } from 'path'; + + @Injectable() export class InternshipService { @@ -16,6 +21,51 @@ export class InternshipService { create = (internship: CreateInternshipDto): Promise<InternshipEntity> => this._internshipsDao.save(internship); + async generatePDF (id: string): Promise<InternshipEntity>{ + + console.log("generation pdf"); + + const filePath = join(__dirname, '..', '..', 'files', 'convention_a_modifier.pdf'); + const existingPdfBytes = readFileSync(filePath); + + const pdfDoc = await PDFDocument.load(existingPdfBytes); + + // Embed the Helvetica font + const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica); + + // Get the first page of the document + const pages = pdfDoc.getPages(); + console.log("nombres de pages : ", pages.length ) + const firstPage = pages[0]; + + // Get the width and height of the first page + const { width, height } = firstPage.getSize(); + + // Draw a string of text diagonally across the first page + firstPage.drawText('This text was added with JavaScript!', { + x: 5, + y: height / 2 + 300, + size: 50, + font: helveticaFont, + color: rgb(0.95, 0.1, 0.1), + rotate: degrees(-45), + }); + + + // Serialize the PDFDocument to bytes (a Uint8Array) + const pdfBytes = await pdfDoc.save(); + const newFileName = 'convention-' + id; + const newFilePath = join(__dirname, '..', '..', 'files', newFileName + '.pdf'); + writeFileSync(newFilePath, pdfBytes); + + //on recupere les informations de l'entreprise + var nomEntreprise = 'capgemini'; + var adresse = '99 rue CEDEX, Courbevoie'; + + return null; + } + + update = ( studentId: string, internship: CreateInternshipDto, -- GitLab