chore(pdf-server): switch pdf-lib to maintained @cantoo/pdf-lib fork (#651)

The original pdf-lib package has been unmaintained since Nov 2021.
@cantoo/pdf-lib is an actively maintained, API-compatible fork with
ongoing releases and accumulated bugfixes.

Also updates test assertions from the deprecated PDFNumber.value() to
PDFNumber.asNumber() per the fork's API guidance.
This commit is contained in:
Olivier Chafik 2026-05-08 13:01:54 +01:00 • committed by GitHub
commit 3cf5b588a1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 94 additions and 37 deletions

View file

@ -25,11 +25,11 @@
"build:mcpb": "npm run build && node build-mcpb.mjs"
},
"dependencies": {
"@cantoo/pdf-lib": "^2.6.5",
"@modelcontextprotocol/ext-apps": "^1.0.0",
"@modelcontextprotocol/sdk": "^1.29.0",
"cors": "^2.8.5",
"express": "^5.1.0",
"pdf-lib": "^1.17.1",
"pdfjs-dist": "^5.0.0",
"zod": "^4.1.13"
},

View file

@ -5,7 +5,7 @@ import path from "node:path";
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
import { getDocument } from "pdfjs-dist/legacy/build/pdf.mjs";
import { PDFDocument } from "pdf-lib";
import { PDFDocument } from "@cantoo/pdf-lib";
import { makeRandomJpeg } from "../../tests/helpers/range-counting-server";
import {
createPdfCache,

View file

@ -18,7 +18,13 @@ import {
type PdfAnnotationDef,
type AnnotationDiff,
} from "./pdf-annotations";
import { PDFDocument, PDFDict, PDFName, PDFArray, PDFNumber } from "pdf-lib";
import {
PDFDocument,
PDFDict,
PDFName,
PDFArray,
PDFNumber,
} from "@cantoo/pdf-lib";
// =============================================================================
// Diff Model
@ -1074,16 +1080,16 @@ describe("buildAnnotatedPdfBytes", () => {
// Check /C (stroke color) = [1, 0, 0] for #ff0000
const cArr = annotDict.get(PDFName.of("C")) as PDFArray;
expect(cArr).toBeDefined();
expect((cArr.get(0) as PDFNumber).value()).toBe(1); // r
expect((cArr.get(1) as PDFNumber).value()).toBe(0); // g
expect((cArr.get(2) as PDFNumber).value()).toBe(0); // b
expect((cArr.get(0) as PDFNumber).asNumber()).toBe(1); // r
expect((cArr.get(1) as PDFNumber).asNumber()).toBe(0); // g
expect((cArr.get(2) as PDFNumber).asNumber()).toBe(0); // b
// Check /IC (fill color) = [0, 1, 0] for #00ff00
const icArr = annotDict.get(PDFName.of("IC")) as PDFArray;
expect(icArr).toBeDefined();
expect((icArr.get(0) as PDFNumber).value()).toBe(0); // r
expect((icArr.get(1) as PDFNumber).value()).toBe(1); // g
expect((icArr.get(2) as PDFNumber).value()).toBe(0); // b
expect((icArr.get(0) as PDFNumber).asNumber()).toBe(0); // r
expect((icArr.get(1) as PDFNumber).asNumber()).toBe(1); // g
expect((icArr.get(2) as PDFNumber).asNumber()).toBe(0); // b
});
it("adds freetext annotation to PDF", async () => {
@ -1159,9 +1165,9 @@ describe("buildAnnotatedPdfBytes", () => {
// Check /C color
const cArr = annotDict.get(PDFName.of("C")) as PDFArray;
expect(cArr).toBeDefined();
expect((cArr.get(0) as PDFNumber).value()).toBe(0);
expect((cArr.get(1) as PDFNumber).value()).toBe(1);
expect((cArr.get(2) as PDFNumber).value()).toBe(0);
expect((cArr.get(0) as PDFNumber).asNumber()).toBe(0);
expect((cArr.get(1) as PDFNumber).asNumber()).toBe(1);
expect((cArr.get(2) as PDFNumber).asNumber()).toBe(0);
// Check appearance stream exists and contains the color
const ap = annotDict.get(PDFName.of("AP")) as PDFDict;

View file

@ -24,7 +24,7 @@ import {
PDFOptionList,
PDFRadioGroup,
type PDFForm,
} from "pdf-lib";
} from "@cantoo/pdf-lib";
// =============================================================================
// Types