From d302bfa6b7c34d38132256014a44db1ed2ab4da4 Mon Sep 17 00:00:00 2001 From: Maximilian Lenkeit Date: Sat, 24 Apr 2021 11:43:33 +0200 Subject: [PATCH 1/4] feat(poster): generate pdf with qr code --- README.md | 8 ++++ assets/.DS_Store | Bin 0 -> 6148 bytes assets/pt-poster-1.0.0.pdf | Bin 0 -> 63205 bytes bin/cli | 1 + lib/generate-poster.js | 27 +++++++++++++ lib/index.js | 14 ++++++- lib/yargs/commands/poster.js | 32 +++++++++++++++ package-lock.json | 74 +++++++++++++++++++++++++++++++++-- package.json | 1 + 9 files changed, 152 insertions(+), 5 deletions(-) create mode 100644 assets/.DS_Store create mode 100644 assets/pt-poster-1.0.0.pdf create mode 100644 lib/generate-poster.js create mode 100644 lib/yargs/commands/poster.js diff --git a/README.md b/README.md index 7beea59..bacd4ea 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,14 @@ $ cwa-event-qr-code terminal \ --type 1 \ --default-check-in-length-in-minutes 30 +# Create poster +$ cwa-event-qr-code poster \ + --description hello-world \ + --address hello \ + --type 1 \ + --default-check-in-length-in-minutes 30 \ + --filepath hello-world.pdf + # Alternatively, you can skip the global installation by using npx $ npx cwa-event-qr-code --help ``` diff --git a/assets/.DS_Store b/assets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2e1f0a230490fc09b3263270ab6465cf59865c73 GIT binary patch literal 6148 zcmeHKyG{c^3>-s>NHi%^u0$OqP(EM@m*N_PL_tfQ4W}gHRbR(v!`NOBr-POP*^xcF zUfZjk;v55z*~|JI7y%ek74fE~FM6)plcVAhB9%3!nBWEt7I^4I|LoA*Q&gyNjmu8{ z0?({=g**BunBx^2?C5*KiuHH=ZScsGDb8@f8r!((bFMzGwYO_rA#Pdx6_|29FiTw1_QxBmw{v7jX@y<8N_E*F4V!TSrT$ R-_nWkM?iTA2?qXxfe(R|B1!-N literal 0 HcmV?d00001 diff --git a/assets/pt-poster-1.0.0.pdf b/assets/pt-poster-1.0.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2e7bfaf10432b6f6e62506ca822d7a80d1273311 GIT binary patch literal 63205 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 { + const templateFilepath = path.resolve(__dirname, '../assets/pt-poster-1.0.0.pdf') + const template = await readFile(templateFilepath) + + const pdfDoc = await PDFDocument.load(template) + + const pngImage = await pdfDoc.embedPng(qrCode) + const pngDims = pngImage.scaleToFit(400, 400) + const page = pdfDoc.getPage(0) + page.drawImage(pngImage, { + x: page.getWidth() / 2 - pngDims.width / 2, + y: page.getHeight() / 2 - pngDims.height + 340, + width: pngDims.width, + height: pngDims.height, + }) + + return pdfDoc.save() +} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 7b7059f..388f82c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,13 +1,17 @@ 'use strict' +const fs = require('fs') const QRCode = require('qrcode') const { promisify } = require('util') const generateQRCodePayload = require('./generate-qr-code-payload') const generateQRCodeUrl = require('./generate-qr-code-url') +const generatePoster = require('./generate-poster') const qrCodeToFile = promisify(QRCode.toFile) const qrCodeToString = promisify(QRCode.toString) +const readFile = promisify(fs.readFile) +const writeFile = promisify(fs.writeFile) const createEventQRCode = ({ locationData, vendorData }) => { const toQRCodePayloadBuffer = () => generateQRCodePayload({ locationData, vendorData }) @@ -32,6 +36,13 @@ const createEventQRCode = ({ locationData, vendorData }) => { const url = await toURL() return qrCodeToString(url, { type: 'terminal' }) } + const toPoster = async (filepath) => { + const pngFilepath = `${filepath}.png` + await toFile(pngFilepath, { width: 1000, type: 'png' }) + const qrCode = await readFile(pngFilepath) + const pdf = await generatePoster({ qrCode, locationData }) + await writeFile(filepath, pdf) + } return { toQRCodePayloadBuffer, @@ -39,7 +50,8 @@ const createEventQRCode = ({ locationData, vendorData }) => { toFile, toPNG, toSVG, - toString + toString, + toPoster } } diff --git a/lib/yargs/commands/poster.js b/lib/yargs/commands/poster.js new file mode 100644 index 0000000..81ab076 --- /dev/null +++ b/lib/yargs/commands/poster.js @@ -0,0 +1,32 @@ +'use strict' + +const path = require('path') +const { createEventQRCode } = require('../../index') +const { + addOptionsForLocationData, + addOptionsForVendorData, + getLocationDataFromArgv, + getVendorDataFromArgv +} = require('../yargs-util') + +module.exports = () => { + return { + command: ['poster'], + desc: 'create poster with QR code', + builder: yargs => { + addOptionsForLocationData(yargs) + addOptionsForVendorData(yargs) + yargs.option('filepath') + }, + handler: async argv => { + const locationData = getLocationDataFromArgv(argv) + const vendorData = getVendorDataFromArgv(argv) + const eventQRCode = createEventQRCode({ locationData, vendorData }) + + const filepath = path.resolve(process.cwd(), argv.filepath) + await eventQRCode.toPoster(filepath) + + console.log(`Created ${filepath}`) + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0427dd7..4f72c87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { + "pdf-lib": "1.16.0", "protobufjs": "6.10.2", "qrcode": "1.4.4", "yargs": "16.2.0" @@ -23,6 +24,9 @@ "lint-staged": "10.5.4", "snazzy": "9.0.0", "standard": "16.0.3" + }, + "engines": { + "node": ">=15" } }, "node_modules/@babel/code-frame": { @@ -422,6 +426,22 @@ "node": "^10.12.0 || >=12.0.0" } }, + "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/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -3304,6 +3324,11 @@ "node": ">=6" } }, + "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/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3375,6 +3400,17 @@ "node": ">=8" } }, + "node_modules/pdf-lib": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.16.0.tgz", + "integrity": "sha512-P/1SSmElOBKrPlbc+Sn7UxikRQbzVA64+4Dh6/uczPscvq/NatP9eryoOguyBTpTnzICNiG8EnMH4Ziqp2TnFA==", + "dependencies": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, "node_modules/picomatch": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", @@ -4609,8 +4645,7 @@ "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/type-check": { "version": "0.4.0", @@ -5155,6 +5190,22 @@ "strip-json-comments": "^3.1.1" } }, + "@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" + } + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -7287,6 +7338,11 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7337,6 +7393,17 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pdf-lib": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.16.0.tgz", + "integrity": "sha512-P/1SSmElOBKrPlbc+Sn7UxikRQbzVA64+4Dh6/uczPscvq/NatP9eryoOguyBTpTnzICNiG8EnMH4Ziqp2TnFA==", + "requires": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, "picomatch": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", @@ -8269,8 +8336,7 @@ "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "type-check": { "version": "0.4.0", diff --git a/package.json b/package.json index 2207c20..1c11c92 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ }, "homepage": "https://github.com/corona-warn-app/cwa-event-qr-code#readme", "dependencies": { + "pdf-lib": "1.16.0", "protobufjs": "6.10.2", "qrcode": "1.4.4", "yargs": "16.2.0" From 28caab77d23d1777ccdb42a082ce26769f21dcb5 Mon Sep 17 00:00:00 2001 From: Maximilian Lenkeit Date: Sat, 24 Apr 2021 11:51:29 +0200 Subject: [PATCH 2/4] refactor(poster): avoid temporary png file on disk --- lib/index.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/index.js b/lib/index.js index 388f82c..7619b93 100644 --- a/lib/index.js +++ b/lib/index.js @@ -9,6 +9,7 @@ const generateQRCodeUrl = require('./generate-qr-code-url') const generatePoster = require('./generate-poster') const qrCodeToFile = promisify(QRCode.toFile) +const qrCodeToBuffer = promisify(QRCode.toBuffer) const qrCodeToString = promisify(QRCode.toString) const readFile = promisify(fs.readFile) const writeFile = promisify(fs.writeFile) @@ -24,6 +25,10 @@ const createEventQRCode = ({ locationData, vendorData }) => { const url = await toURL() return qrCodeToFile(filepath, url, options) } + const toBuffer = async (options) => { + const url = await toURL() + return qrCodeToBuffer(url, options) + } const toPNG = async (filepath, options) => { options.type = 'png' return toFile(filepath, options) @@ -37,9 +42,7 @@ const createEventQRCode = ({ locationData, vendorData }) => { return qrCodeToString(url, { type: 'terminal' }) } const toPoster = async (filepath) => { - const pngFilepath = `${filepath}.png` - await toFile(pngFilepath, { width: 1000, type: 'png' }) - const qrCode = await readFile(pngFilepath) + const qrCode = await toBuffer({ width: 1000, type: 'png' }) const pdf = await generatePoster({ qrCode, locationData }) await writeFile(filepath, pdf) } From b553d749971bcb8fcfd7dfc9c1ac67501237dd75 Mon Sep 17 00:00:00 2001 From: Maximilian Lenkeit Date: Sat, 24 Apr 2021 19:13:34 +0200 Subject: [PATCH 3/4] feat(poster): display description and address --- lib/generate-poster.js | 37 ++++++++++++++++++++++++++++++++---- lib/index.js | 1 - lib/yargs/commands/poster.js | 2 +- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/lib/generate-poster.js b/lib/generate-poster.js index 5a307ab..2e43048 100644 --- a/lib/generate-poster.js +++ b/lib/generate-poster.js @@ -2,7 +2,11 @@ const fs = require('fs') const path = require('path') -const { PDFDocument } = require('pdf-lib') +const { + PDFDocument, + rgb, + StandardFonts +} = require('pdf-lib') const { promisify } = require('util') const readFile = promisify(fs.readFile) @@ -20,8 +24,33 @@ module.exports = async ({ qrCode, locationData }) => { x: page.getWidth() / 2 - pngDims.width / 2, y: page.getHeight() / 2 - pngDims.height + 340, width: pngDims.width, - height: pngDims.height, + height: pngDims.height }) - + + const fontSize = 10 + const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica) + const maxTextWidth = 420 + const truncateText = text => { + while (helveticaFont.widthOfTextAtSize(text, fontSize) > maxTextWidth) { + text = text.substr(0, text.length - 1) + } + return text + } + + page.drawText(truncateText(locationData.description), { + x: 80, + y: 325, + size: fontSize, + font: helveticaFont, + color: rgb(0, 0, 0) + }) + page.drawText(truncateText(locationData.address), { + x: 80, + y: 310, + size: fontSize, + font: helveticaFont, + color: rgb(0, 0, 0) + }) + return pdfDoc.save() -} \ No newline at end of file +} diff --git a/lib/index.js b/lib/index.js index 7619b93..ee6baf5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -11,7 +11,6 @@ const generatePoster = require('./generate-poster') const qrCodeToFile = promisify(QRCode.toFile) const qrCodeToBuffer = promisify(QRCode.toBuffer) const qrCodeToString = promisify(QRCode.toString) -const readFile = promisify(fs.readFile) const writeFile = promisify(fs.writeFile) const createEventQRCode = ({ locationData, vendorData }) => { diff --git a/lib/yargs/commands/poster.js b/lib/yargs/commands/poster.js index 81ab076..d5b3baa 100644 --- a/lib/yargs/commands/poster.js +++ b/lib/yargs/commands/poster.js @@ -29,4 +29,4 @@ module.exports = () => { console.log(`Created ${filepath}`) } } -} \ No newline at end of file +} From 5b0ef24d8f54085ec89542df5b17b0c73d8186e5 Mon Sep 17 00:00:00 2001 From: Maximilian Lenkeit Date: Sat, 24 Apr 2021 19:31:14 +0200 Subject: [PATCH 4/4] chore(notices): add pdf-lib --- THIRD-PARTY-NOTICES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/THIRD-PARTY-NOTICES b/THIRD-PARTY-NOTICES index a0c3974..d997e1c 100644 --- a/THIRD-PARTY-NOTICES +++ b/THIRD-PARTY-NOTICES @@ -10,6 +10,11 @@ corona-warn-app.opensource@sap.com Components: ----------- +Component: pdf-lib +Licensor: Andrew Dillon and other contributors +Website: https://github.com/Hopding/pdf-lib +License: MIT License + Component: protobufjs Licensor: Google Inc. and other contributors Website: https://github.com/protobufjs/protobuf.js