From 5921fc5ede25779b3e5611549f615409c639d3a9 Mon Sep 17 00:00:00 2001 From: Antonio Ledebuhr Date: Wed, 26 Aug 2026 12:52:26 +0200 Subject: [PATCH] Add a reproducible pitch URL and link annotation to the CV. The script is idempotent, keeps the twelve A4 pages, and writes antoniolede.de/pitch on page 1 with a matching URI annotation. Co-authored-by: Cursor --- CV.pdf | Bin 590569 -> 592070 bytes package-lock.json | 50 +++++++++++++++- package.json | 4 +- scripts/add-cv-pitch-link.mjs | 107 ++++++++++++++++++++++++++++++++++ 4 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 scripts/add-cv-pitch-link.mjs diff --git a/CV.pdf b/CV.pdf index c3e5d5512e6b80634e06eb33dc4496be9c8bf094..2b7a2382772e5af63786f583361246484fa8b481 100644 GIT binary patch delta 92592 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 diff --git a/package-lock.json b/package-lock.json index da70d08..085eb6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "@axe-core/playwright": "^4.13.0", "@eslint/js": "^9.39.5", "@lhci/cli": "^0.15.1", - "@playwright/test": "^1.62.1", + "@playwright/test": "1.62.1", "@types/express": "^5.0.1", "@types/node": "^20.17.19", "angular-eslint": "^21.4.0", @@ -35,6 +35,7 @@ "eslint": "^9.39.5", "eslint-config-prettier": "^10.1.8", "jsdom": "^27.1.0", + "pdf-lib": "^1.17.1", "prettier": "^3.9.6", "typescript": "~5.9.2", "typescript-eslint": "^8.68.0", @@ -4285,6 +4286,26 @@ "third-party-web": "latest" } }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^1.0.10" + } + }, "node_modules/@playwright/test": { "version": "1.62.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz", @@ -10888,6 +10909,13 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -11064,6 +11092,26 @@ "dev": true, "license": "MIT" }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "0BSD" + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", diff --git a/package.json b/package.json index 196cc5b..982f73e 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "ci": "npm run lint && npm run format:check && npm run test:ci && npm run build", "e2e": "playwright test", "e2e:install": "playwright install chromium", - "lighthouse": "npm run build && lhci autorun" + "lighthouse": "npm run build && lhci autorun", + "cv:link": "node scripts/add-cv-pitch-link.mjs" }, "prettier": { "printWidth": 100, @@ -61,6 +62,7 @@ "eslint": "^9.39.5", "eslint-config-prettier": "^10.1.8", "jsdom": "^27.1.0", + "pdf-lib": "^1.17.1", "prettier": "^3.9.6", "typescript": "~5.9.2", "typescript-eslint": "^8.68.0", diff --git a/scripts/add-cv-pitch-link.mjs b/scripts/add-cv-pitch-link.mjs new file mode 100644 index 0000000..aee8866 --- /dev/null +++ b/scripts/add-cv-pitch-link.mjs @@ -0,0 +1,107 @@ +import { readFileSync, writeFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { PDFDocument, PDFName, PDFString, rgb, StandardFonts } from 'pdf-lib'; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..'); +const CV_PATH = join(ROOT, 'CV.pdf'); +const PITCH_URI = 'https://antoniolede.de/pitch'; +const VISIBLE_TEXT = 'antoniolede.de/pitch'; +const TEXT_X = 59.6; +const TEXT_Y = 215.4; +const FONT_SIZE = 10.5; +const PADDING = 2; + +function asString(value) { + if (!value) { + return ''; + } + + if (typeof value.decodeText === 'function') { + return value.decodeText(); + } + + return String(value); +} + +function annotationUri(annotation) { + const action = annotation.lookup(PDFName.of('A')); + if (!action || typeof action.lookup !== 'function') { + return ''; + } + + const uri = action.lookup(PDFName.of('URI')); + return asString(uri); +} + +function pageHasPitchLink(page) { + const annots = page.node.lookup(PDFName.of('Annots')); + if (!annots || typeof annots.size !== 'function') { + return false; + } + + for (let index = 0; index < annots.size(); index += 1) { + const annotation = annots.lookup(index); + if (annotationUri(annotation) === PITCH_URI) { + return true; + } + } + + return false; +} + +const bytes = readFileSync(CV_PATH); +const pdfDoc = await PDFDocument.load(bytes); +const title = pdfDoc.getTitle(); +const author = pdfDoc.getAuthor(); +const creator = pdfDoc.getCreator(); +const page = pdfDoc.getPage(0); + +if (pageHasPitchLink(page)) { + console.log('Pitch link annotation already present; leaving CV.pdf unchanged.'); + process.exit(0); +} + +const font = await pdfDoc.embedFont(StandardFonts.Helvetica); +const textWidth = font.widthOfTextAtSize(VISIBLE_TEXT, FONT_SIZE); + +page.drawText(VISIBLE_TEXT, { + x: TEXT_X, + y: TEXT_Y, + size: FONT_SIZE, + font, + color: rgb(54 / 255, 125 / 255, 162 / 255), +}); + +const link = pdfDoc.context.register( + pdfDoc.context.obj({ + Type: 'Annot', + Subtype: 'Link', + Rect: [ + TEXT_X - PADDING, + TEXT_Y - PADDING, + TEXT_X + textWidth + PADDING, + TEXT_Y + FONT_SIZE + PADDING, + ], + Border: [0, 0, 0], + A: { + S: 'URI', + URI: PDFString.of(PITCH_URI), + }, + }), +); +page.node.addAnnot(link); + +if (title) { + pdfDoc.setTitle(title); +} +if (author) { + pdfDoc.setAuthor(author); +} +if (creator) { + pdfDoc.setCreator(creator); +} + +const saved = await pdfDoc.save({ useObjectStreams: false }); +writeFileSync(CV_PATH, saved); +console.log('Added visible pitch URL and link annotation to page 1 of CV.pdf.');