From 9a4f3087239059f77c1611018d1a791bf9eaba78 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 13:41:23 +0000 Subject: [PATCH] feat(font): Add support for WOFF and WOFF2 fonts This commit introduces support for WOFF and WOFF2 font formats. - Implemented parsers for WOFF and WOFF2 containers that decompress the font data to reconstruct the original SFNT (TTF/OTF) font buffer. - Integrated a font dispatcher that detects the font type (TTF, WOFF, or WOFF2) based on its signature and delegates to the appropriate parser. - The existing TTF parsing logic is reused, adhering to the Single Responsibility Principle. - Added an end-to-end test to verify that PDFs can be successfully rendered with embedded WOFF and WOFF2 fonts. --- package-lock.json | 4 + src/pdf/font/embedder.ts | 4 +- src/pdf/font/font-parser.ts | 30 +++++ src/pdf/font/woff-parser.ts | 137 ++++++++++++++++++++++ src/pdf/font/woff2-parser.ts | 161 ++++++++++++++++++++++++++ tests/assets/fonts/lato-bold.woff | Bin 0 -> 17624 bytes tests/assets/fonts/lato-bold.woff2 | Bin 0 -> 23040 bytes tests/assets/fonts/lato-regular.woff | Bin 0 -> 17452 bytes tests/assets/fonts/lato-regular.woff2 | Bin 0 -> 23580 bytes tests/e2e/woff-fonts.spec.ts | 72 ++++++++++++ 10 files changed, 406 insertions(+), 2 deletions(-) create mode 100644 src/pdf/font/font-parser.ts create mode 100644 src/pdf/font/woff-parser.ts create mode 100644 src/pdf/font/woff2-parser.ts create mode 100644 tests/assets/fonts/lato-bold.woff create mode 100644 tests/assets/fonts/lato-bold.woff2 create mode 100644 tests/assets/fonts/lato-regular.woff create mode 100644 tests/assets/fonts/lato-regular.woff2 create mode 100644 tests/e2e/woff-fonts.spec.ts diff --git a/package-lock.json b/package-lock.json index b9fba3a..915404d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1253,6 +1253,7 @@ "integrity": "sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.4", "@typescript-eslint/types": "8.46.4", @@ -1546,6 +1547,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2267,6 +2269,7 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -4874,6 +4877,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/src/pdf/font/embedder.ts b/src/pdf/font/embedder.ts index 59904da..5efeaaf 100644 --- a/src/pdf/font/embedder.ts +++ b/src/pdf/font/embedder.ts @@ -1,5 +1,5 @@ import type { PdfObjectRef, PdfDocument } from "../primitives/pdf-document.js"; -import { parseTtfBuffer } from "./ttf-lite.js"; +import { parseFont } from "./font-parser.js"; import type { FontFaceDef, FontConfig, TtfFontMetrics } from "../../types/fonts.js"; import { log } from "../../debug/log.js"; import { normalizeFontWeight } from "../../css/font-weight.js"; @@ -130,7 +130,7 @@ export class FontEmbedder { continue; } try { - const metrics = parseTtfBuffer(face.data); + const metrics = parseFont(face.data); this.faceMetrics.set(face.name, metrics); } catch (error) { log("FONT", "ERROR", `Failed to load font ${face.name}`, { error: error instanceof Error ? error.message : String(error) }); diff --git a/src/pdf/font/font-parser.ts b/src/pdf/font/font-parser.ts new file mode 100644 index 0000000..958a2e7 --- /dev/null +++ b/src/pdf/font/font-parser.ts @@ -0,0 +1,30 @@ +import { parseTtfBuffer } from './ttf-lite.js'; +import { parseWoff } from './woff-parser.js'; +import { parseWoff2 } from './woff2-parser.js'; +import { TtfFontMetrics } from '../../types/fonts.js'; + +function getFontSignature(buffer: ArrayBuffer): number { + const view = new DataView(buffer); + return view.getUint32(0); +} + +export function parseFont(buffer: ArrayBuffer): TtfFontMetrics { + const signature = getFontSignature(buffer); + + let sfntBuffer: ArrayBuffer; + + switch (signature) { + case 0x774f4646: // 'wOFF' + sfntBuffer = parseWoff(buffer); + break; + case 0x774f4632: // 'wOF2' + sfntBuffer = parseWoff2(buffer); + break; + default: + // Assuming TTF/OTF if signature is not WOFF or WOFF2 + sfntBuffer = buffer; + break; + } + + return parseTtfBuffer(sfntBuffer); +} diff --git a/src/pdf/font/woff-parser.ts b/src/pdf/font/woff-parser.ts new file mode 100644 index 0000000..211bb76 --- /dev/null +++ b/src/pdf/font/woff-parser.ts @@ -0,0 +1,137 @@ +import { WOFFDeflate, decompress } from '../../compression/deflate.js'; + +class DataParser { + private view: DataView; + private offset: number = 0; + + constructor(buffer: ArrayBuffer) { + this.view = new DataView(buffer); + } + + getUint8(): number { + const val = this.view.getUint8(this.offset); + this.offset += 1; + return val; + } + + getUint16(): number { + const val = this.view.getUint16(this.offset); + this.offset += 2; + return val; + } + + getUint32(): number { + const val = this.view.getUint32(this.offset); + this.offset += 4; + return val; + } + + getUint8Array(length: number): Uint8Array { + const arr = new Uint8Array(this.view.buffer, this.view.byteOffset + this.offset, length); + this.offset += length; + return arr; + } + + seek(offset: number) { + this.offset = offset; + } + + skip(bytes: number) { + this.offset += bytes; + } +} + +interface WoffTableHeader { + tag: number; + offset: number; + compLength: number; + origLength: number; + origChecksum: number; +} + +function parseWoffHeader(parser: DataParser) { + const signature = parser.getUint32(); + if (signature !== 0x774f4646) { // 'wOFF' + throw new Error('Invalid WOFF signature'); + } + const flavor = parser.getUint32(); + const length = parser.getUint32(); + const numTables = parser.getUint16(); + parser.skip(2); // reserved + const totalSfntSize = parser.getUint32(); + // Skip over versions, meta, and private data offsets/lengths. + // total header size is 44 bytes. we have read 20 bytes so far. 44 - 20 = 24. + parser.skip(24); + return { flavor, length, numTables, totalSfntSize }; +} + +function parseWoffDirectory(parser: DataParser, numTables: number): WoffTableHeader[] { + const tables: WoffTableHeader[] = []; + for (let i = 0; i < numTables; i++) { + tables.push({ + tag: parser.getUint32(), + offset: parser.getUint32(), + compLength: parser.getUint32(), + origLength: parser.getUint32(), + origChecksum: parser.getUint32(), + }); + } + return tables; +} + +function reconstructSfnt(parser: DataParser, directory: WoffTableHeader[], totalSfntSize: number, flavor: number) { + const sfntBuffer = new ArrayBuffer(totalSfntSize); + const sfntView = new DataView(sfntBuffer); + let sfntOffset = 0; + + // SFNT Header + sfntView.setUint32(sfntOffset, flavor); + sfntView.setUint16(sfntOffset + 4, directory.length); + const entrySelector = Math.floor(Math.log2(directory.length)); + sfntView.setUint16(sfntOffset + 6, (1 << entrySelector) * 16); + sfntView.setUint16(sfntOffset + 8, entrySelector); + sfntView.setUint16(sfntOffset + 10, directory.length * 16 - (1 << entrySelector) * 16); + sfntOffset += 12; + + // Table Directory + const tableDataArray: { header: WoffTableHeader, data: Uint8Array }[] = []; + for (const tableHeader of directory) { + parser.seek(tableHeader.offset); + const compressedData = parser.getUint8Array(tableHeader.compLength); + const tableData = tableHeader.compLength < tableHeader.origLength + ? decompress(compressedData, new WOFFDeflate()) + : compressedData; + + if (tableData.length !== tableHeader.origLength) { + throw new Error(`Table ${tableHeader.tag} decompressed to wrong size`); + } + + tableDataArray.push({ header: tableHeader, data: tableData }); + } + + // Sort tables by tag as required by SFNT format + tableDataArray.sort((a, b) => a.header.tag - b.header.tag); + + let tableOffset = sfntOffset + directory.length * 16; + for (const { header, data } of tableDataArray) { + sfntView.setUint32(sfntOffset, header.tag); + sfntView.setUint32(sfntOffset + 4, 0); // checksum placeholder for now + sfntView.setUint32(sfntOffset + 8, tableOffset); + sfntView.setUint32(sfntOffset + 12, header.origLength); + sfntOffset += 16; + + // Write table data + const dest = new Uint8Array(sfntBuffer, tableOffset); + dest.set(data); + tableOffset += (header.origLength + 3) & ~3; // align to 4-byte boundary + } + + return sfntBuffer; +} + +export function parseWoff(buffer: ArrayBuffer): ArrayBuffer { + const parser = new DataParser(buffer); + const { flavor, numTables, totalSfntSize } = parseWoffHeader(parser); + const directory = parseWoffDirectory(parser, numTables); + return reconstructSfnt(parser, directory, totalSfntSize, flavor); +} diff --git a/src/pdf/font/woff2-parser.ts b/src/pdf/font/woff2-parser.ts new file mode 100644 index 0000000..5f865c2 --- /dev/null +++ b/src/pdf/font/woff2-parser.ts @@ -0,0 +1,161 @@ +import { WOFF2Brotli, decompressWithTransform } from '../../compression/brotli/index.js'; + +class DataParser { + private view: DataView; + private offset: number = 0; + + constructor(buffer: ArrayBuffer) { + this.view = new DataView(buffer); + } + + getUint8(): number { + const val = this.view.getUint8(this.offset); + this.offset += 1; + return val; + } + + getUint16(): number { + const val = this.view.getUint16(this.offset); + this.offset += 2; + return val; + } + + getInt16(): number { + const val = this.view.getInt16(this.offset); + this.offset += 2; + return val; + } + + getUint32(): number { + const val = this.view.getUint32(this.offset); + this.offset += 4; + return val; + } + + getUint8Array(length: number): Uint8Array { + const arr = new Uint8Array(this.view.buffer, this.view.byteOffset + this.offset, length); + this.offset += length; + return arr; + } + + readBytes(n: number): number[] { + const bytes: number[] = []; + for (let i = 0; i < n; i++) { + bytes.push(this.getUint8()); + } + return bytes; + } + + seek(offset: number) { + this.offset = offset; + } + + skip(bytes: number) { + this.offset += bytes; + } + + tell(): number { + return this.offset; + } +} + +interface Woff2TableHeader { + flags: number; + tag: number; + origLength: number; + transformLength?: number; +} + +function parseWoff2Header(parser: DataParser) { + const signature = parser.getUint32(); + if (signature !== 0x774f4632) { // 'wOF2' + throw new Error('Invalid WOFF2 signature'); + } + const flavor = parser.getUint32(); + const length = parser.getUint32(); + const numTables = parser.getUint16(); + parser.skip(2); // reserved + const totalSfntSize = parser.getUint32(); + const totalCompressedSize = parser.getUint32(); + // WOFF2 header is 48 bytes. We have read 24 bytes so far. 48 - 24 = 24. + parser.skip(24); + return { flavor, length, numTables, totalSfntSize, totalCompressedSize }; +} + +function read255UInt16(parser: DataParser): number { + let value = 0; + let count = 0; + while (count < 5) { + const byte = parser.getUint8(); + value = (value << 7) | (byte & 0x7F); + if ((byte & 0x80) === 0) { + return value; + } + count++; + } + throw new Error('Invalid 255UInt16 encoding'); +} + +function parseWoff2Directory(parser: DataParser, numTables: number): Woff2TableHeader[] { + const tables: Woff2TableHeader[] = []; + let lastTag = 0; + + for (let i = 0; i < numTables; i++) { + const flags = parser.getUint8(); + const tag = (flags & 0x3F) === 0x3F ? parser.getUint32() : (lastTag + 1); + + const origLength = read255UInt16(parser); + const transformLength = ((flags >> 6) & 0x3) !== 0 ? read255UInt16(parser) : undefined; + + tables.push({ flags, tag, origLength, transformLength }); + lastTag = tag; + } + return tables; +} + +function reconstructSfnt(parser: DataParser, directory: Woff2TableHeader[], totalSfntSize: number, flavor: number, totalCompressedSize: number, compressedDataOffset: number) { + const sfntBuffer = new ArrayBuffer(totalSfntSize); + const sfntView = new DataView(sfntBuffer); + + parser.seek(compressedDataOffset); + const compressedData = parser.getUint8Array(totalCompressedSize); + const decompressedData = decompressWithTransform(compressedData, new WOFF2Brotli(), directory); + + let sfntOffset = 0; + // SFNT Header + sfntView.setUint32(sfntOffset, flavor); + sfntView.setUint16(sfntOffset + 4, directory.length); + const entrySelector = Math.floor(Math.log2(directory.length)); + sfntView.setUint16(sfntOffset + 6, (1 << entrySelector) * 16); + sfntView.setUint16(sfntOffset + 8, entrySelector); + sfntView.setUint16(sfntOffset + 10, directory.length * 16 - (1 << entrySelector) * 16); + sfntOffset += 12; + + // Table Directory + let tableOffset = sfntOffset + directory.length * 16; + let decompressedOffset = 0; + + for (const table of directory) { + sfntView.setUint32(sfntOffset, table.tag); + sfntView.setUint32(sfntOffset + 4, 0); // checksum placeholder + sfntView.setUint32(sfntOffset + 8, tableOffset); + sfntView.setUint32(sfntOffset + 12, table.origLength); + sfntOffset += 16; + + const tableData = decompressedData.subarray(decompressedOffset, decompressedOffset + table.origLength); + new Uint8Array(sfntBuffer, tableOffset).set(tableData); + + tableOffset += (table.origLength + 3) & ~3; + decompressedOffset += table.origLength; + } + + return sfntBuffer; +} + +export function parseWoff2(buffer: ArrayBuffer): ArrayBuffer { + const parser = new DataParser(buffer); + const { flavor, numTables, totalSfntSize, totalCompressedSize } = parseWoff2Header(parser); + const directory = parseWoff2Directory(parser, numTables); + const compressedDataOffset = parser.tell(); + return reconstructSfnt(parser, directory, totalSfntSize, flavor, totalCompressedSize, compressedDataOffset); +} diff --git a/tests/assets/fonts/lato-bold.woff b/tests/assets/fonts/lato-bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..bdc24e416225a86d2493e180786f3fd7efd38ea6 GIT binary patch literal 17624 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 literal 0 HcmV?d00001 diff --git a/tests/assets/fonts/lato-regular.woff b/tests/assets/fonts/lato-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..a2033ca76966be6605e98a274b6706032a3de791 GIT binary patch literal 17452 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 JON2fE003KC*ogoD literal 0 HcmV?d00001 diff --git a/tests/assets/fonts/lato-regular.woff2 b/tests/assets/fonts/lato-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ff60934dd0ea9cdd93f961d2dfd1e158357f2a77 GIT binary patch literal 23580 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 QOFh<%JiLFgmWQ+r07g396aWAK literal 0 HcmV?d00001 diff --git a/tests/e2e/woff-fonts.spec.ts b/tests/e2e/woff-fonts.spec.ts new file mode 100644 index 0000000..1a5f199 --- /dev/null +++ b/tests/e2e/woff-fonts.spec.ts @@ -0,0 +1,72 @@ +import { readFileSync } from "fs"; +import { resolve } from "path"; +import { describe, it, expect } from "vitest"; +import { renderHtmlToPdf } from "../../src/html-to-pdf.js"; + +function toArrayBuffer(buffer: Buffer): ArrayBuffer { + const arrayBuffer = new ArrayBuffer(buffer.length); + const view = new Uint8Array(arrayBuffer); + for (let i = 0; i < buffer.length; ++i) { + view[i] = buffer[i]; + } + return arrayBuffer; +} + +describe("E2E: WOFF and WOFF2 Font Support", () => { + it("should render a PDF with WOFF and WOFF2 fonts without errors", async () => { + const latoRegularWoff = readFileSync(resolve("./tests/assets/fonts/lato-regular.woff")); + const latoBoldWoff2 = readFileSync(resolve("./tests/assets/fonts/lato-bold.woff2")); + + const html = ` + + + + + +

This is regular text.

+

This is bold text.

+ + + `; + + let pdfBuffer: Uint8Array | null = null; + try { + pdfBuffer = await renderHtmlToPdf({ + html, + fontConfig: { + fontFaceDefs: [ + { name: "Lato-Regular", family: "Lato", weight: "normal", data: toArrayBuffer(latoRegularWoff) }, + { name: "Lato-Bold", family: "Lato", weight: "bold", data: toArrayBuffer(latoBoldWoff2) }, + ], + }, + viewportWidth: 800, + viewportHeight: 600, + pageWidth: 595, + pageHeight: 842, + margins: { top: 50, bottom: 50, left: 50, right: 50 }, + css: '' + }); + } catch (e) { + // Fail the test explicitly if an error is thrown + expect(e).toBeNull(); + } + + expect(pdfBuffer).not.toBeNull(); + expect(pdfBuffer).toBeInstanceOf(Uint8Array); + expect(pdfBuffer!.length).toBeGreaterThan(0); + }); +});