@pdfme/schemas 6.2.6-dev.9 → 6.2.7-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"dynamicTemplate-CkX3dzIQ.js","names":[],"sources":["../src/graphics/imagehelper.ts","../src/graphics/orientation.ts","../src/tables/constants.ts","../src/tables/types.ts","../src/tables/imageCell.ts","../src/tables/classes.ts","../src/tables/tableHelper.ts","../src/constants.ts","../src/tables/helper.ts","../src/tables/dynamicTemplate.ts"],"sourcesContent":["// ref: https://github.com/image-size/image-size ----------------------------\n// The following code is adapted from the image-size code. Unnecessary formats and dependencies on Node have been removed.\nimport { Buffer } from 'buffer';\n\ntype IImage = {\n validate: (input: Uint8Array) => boolean;\n calculate: (input: Uint8Array) => { width: number; height: number } | undefined;\n};\n\nconst decoder = new TextDecoder();\nconst toUTF8String = (input: Uint8Array, start = 0, end = input.length) =>\n decoder.decode(input.slice(start, end));\n\nconst toHexString = (input: Uint8Array, start = 0, end = input.length) =>\n input.slice(start, end).reduce((memo, i) => memo + ('0' + i.toString(16)).slice(-2), '');\n\nconst readUInt16BE = (input: Uint8Array, offset = 0) => input[offset] * 2 ** 8 + input[offset + 1];\n\nconst readUInt32BE = (input: Uint8Array, offset = 0) =>\n input[offset] * 2 ** 24 +\n input[offset + 1] * 2 ** 16 +\n input[offset + 2] * 2 ** 8 +\n input[offset + 3];\n\nconst extractSize = (input: Uint8Array, index: number) => {\n return {\n height: readUInt16BE(input, index),\n width: readUInt16BE(input, index + 2),\n };\n};\n\nconst validateInput = (input: Uint8Array, index: number): void => {\n // index should be within buffer limits\n if (index > input.length) {\n throw new TypeError('Corrupt JPG, exceeded buffer limits');\n }\n // Every JPEG block must begin with a 0xFF\n if (input[index] !== 0xff) {\n throw new TypeError('Invalid JPG, marker table corrupted');\n }\n};\n\nconst JPG: IImage = {\n validate: (input) => toHexString(input, 0, 2) === 'ffd8',\n\n calculate(input) {\n // Skip 4 chars, they are for signature\n input = input.slice(4);\n\n let next: number;\n while (input.length) {\n // read length of the next block\n const i = readUInt16BE(input, 0);\n\n // ensure correct format\n validateInput(input, i);\n\n // 0xFFC0 is baseline standard(SOF)\n // 0xFFC1 is baseline optimized(SOF)\n // 0xFFC2 is progressive(SOF2)\n next = input[i + 1];\n if (next === 0xc0 || next === 0xc1 || next === 0xc2) {\n const size = extractSize(input, i + 5);\n\n return size;\n }\n\n // move to the next block\n input = input.slice(i + 2);\n }\n\n throw new TypeError('Invalid JPG, no size found');\n },\n};\n\nconst pngSignature = 'PNG\\r\\n\\x1a\\n';\nconst pngImageHeaderChunkName = 'IHDR';\n\n// Used to detect \"fried\" png's: http://www.jongware.com/pngdefry.html\nconst pngFriedChunkName = 'CgBI';\n\nconst PNG: IImage = {\n validate(input) {\n if (pngSignature === toUTF8String(input, 1, 8)) {\n let chunkName = toUTF8String(input, 12, 16);\n if (chunkName === pngFriedChunkName) {\n chunkName = toUTF8String(input, 28, 32);\n }\n if (chunkName !== pngImageHeaderChunkName) {\n throw new TypeError('Invalid PNG');\n }\n return true;\n }\n return false;\n },\n\n calculate(input) {\n if (toUTF8String(input, 12, 16) === pngFriedChunkName) {\n return {\n height: readUInt32BE(input, 36),\n width: readUInt32BE(input, 32),\n };\n }\n return {\n height: readUInt32BE(input, 20),\n width: readUInt32BE(input, 16),\n };\n },\n};\n\nconst typeHandlers = {\n jpg: JPG,\n png: PNG,\n};\n\ntype ImageKind = keyof typeof typeHandlers;\n\nfunction detector(input: Uint8Array): ImageKind | undefined {\n const firstBytes: { [byte: number]: ImageKind } = {\n 0x89: 'png',\n 0xff: 'jpg',\n };\n const byte = input[0];\n if (byte in firstBytes) {\n const type = firstBytes[byte];\n if (type && typeHandlers[type].validate(input)) {\n return type;\n }\n }\n\n const keys = Object.keys(typeHandlers) as ImageKind[];\n return keys.find((key: ImageKind) => typeHandlers[key].validate(input));\n}\n\n/**\n * FNV-1a 32-bit fingerprint of an image data URL.\n * Image embed cache keys are `${type}:${length}:${hash}` and must keep this hash.\n */\nexport const hashImageDataUrl = (value: string): string => {\n let hash = 0x811c9dc5;\n for (let i = 0; i < value.length; i++) {\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n};\n\nexport const getImageDimension = (\n value: string | Uint8Array,\n): { height: number; width: number } => {\n if (typeof value !== 'string') {\n return imageSize(Buffer.from(value));\n }\n const dataUriPrefix = ';base64,';\n const idx = value.indexOf(dataUriPrefix);\n const imgBase64 = value.substring(idx + dataUriPrefix.length, value.length);\n return imageSize(Buffer.from(imgBase64, 'base64'));\n};\n\nconst imageSize = (imgBuffer: Buffer): { height: number; width: number } => {\n const type = detector(imgBuffer);\n\n if (typeof type !== 'undefined' && type in typeHandlers) {\n const size = typeHandlers[type].calculate(imgBuffer);\n if (size !== undefined) {\n return size;\n }\n }\n\n throw new TypeError(\n '[@pdfme/schemas/images] Unsupported file type: ' + (type === undefined ? 'undefined' : type),\n );\n};\n// ----------------------------\n","import jpegJsModule from 'jpeg-js';\nimport UPNGModule from '@pdf-lib/upng';\n\nexport type ImageFormat = 'jpeg' | 'png' | 'other';\n\ntype JpegJsApi = {\n decode: (\n data: Uint8Array,\n opts?: {\n useTArray?: boolean;\n formatAsRGBA?: boolean;\n maxMemoryUsageInMB?: number;\n },\n ) => { data: Uint8Array; width: number; height: number };\n encode: (\n img: { data: Uint8Array; width: number; height: number },\n quality: number,\n ) => { data: Uint8Array };\n};\n\ntype DecodedPng = { width: number; height: number };\n\ntype UPNGApi = {\n decode: (input: ArrayBuffer) => DecodedPng;\n toRGBA8: (decoded: DecodedPng) => ArrayBuffer[];\n encode: (\n bufs: ArrayBuffer[],\n width: number,\n height: number,\n cnum: number,\n ) => ArrayBuffer | Uint8Array;\n};\n\nconst isJpegJsApi = (value: unknown): value is JpegJsApi =>\n !!value &&\n typeof value === 'object' &&\n typeof (value as JpegJsApi).decode === 'function' &&\n typeof (value as JpegJsApi).encode === 'function';\n\nconst isUPNGApi = (value: unknown): value is UPNGApi =>\n !!value &&\n typeof value === 'object' &&\n typeof (value as UPNGApi).decode === 'function' &&\n typeof (value as UPNGApi).toRGBA8 === 'function' &&\n typeof (value as UPNGApi).encode === 'function';\n\nconst resolveExport = <T>(\n value: unknown,\n guard: (candidate: unknown) => candidate is T,\n label: string,\n): T => {\n let current: unknown = value;\n while (current && typeof current === 'object') {\n if (guard(current)) return current;\n current = (current as { default?: unknown }).default;\n }\n throw new TypeError(`Failed to resolve ${label} exports`);\n};\n\nconst jpegJs = resolveExport(jpegJsModule, isJpegJsApi, 'jpeg-js');\nconst UPNG = resolveExport(UPNGModule, isUPNGApi, '@pdf-lib/upng');\n\nconst JPEG_ENCODE_QUALITY = 90;\nconst JPEG_MAX_MEMORY_MB = 512;\n\nconst JPEG_SOI_0 = 0xff;\nconst JPEG_SOI_1 = 0xd8;\nconst PNG_SIGNATURE = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n\nconst toArrayBuffer = (bytes: Uint8Array): ArrayBuffer => {\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer;\n};\n\nconst isPngSignature = (bytes: Uint8Array): boolean => {\n if (bytes.length < PNG_SIGNATURE.length) return false;\n for (let i = 0; i < PNG_SIGNATURE.length; i++) {\n if (bytes[i] !== PNG_SIGNATURE[i]) return false;\n }\n return true;\n};\n\nexport const detectImageFormat = (bytes: Uint8Array): ImageFormat => {\n if (bytes.length >= 2 && bytes[0] === JPEG_SOI_0 && bytes[1] === JPEG_SOI_1) {\n return 'jpeg';\n }\n if (isPngSignature(bytes)) {\n return 'png';\n }\n return 'other';\n};\n\n/** TIFF/IFD0: returns 1..8 or undefined. Never throws. */\nexport const parseTiffOrientation = (tiff: Uint8Array): number | undefined => {\n try {\n if (tiff.length < 8) return undefined;\n const le = tiff[0] === 0x49 && tiff[1] === 0x49; // 'II'\n if (!le && !(tiff[0] === 0x4d && tiff[1] === 0x4d)) return undefined; // 'MM'\n const view = new DataView(tiff.buffer, tiff.byteOffset, tiff.byteLength);\n if (view.getUint16(2, le) !== 42) return undefined;\n const ifd = view.getUint32(4, le);\n if (ifd + 2 > tiff.length) return undefined;\n const n = view.getUint16(ifd, le);\n for (let i = 0; i < n; i++) {\n const entry = ifd + 2 + i * 12;\n if (entry + 12 > tiff.length) return undefined;\n if (view.getUint16(entry, le) !== 0x0112) continue;\n if (view.getUint16(entry + 2, le) !== 3) return undefined; // SHORT\n if (view.getUint32(entry + 4, le) !== 1) return undefined;\n const val = view.getUint16(entry + 8, le);\n return val >= 1 && val <= 8 ? val : undefined;\n }\n return undefined;\n } catch {\n return undefined;\n }\n};\n\nconst isExifApp1Payload = (segment: Uint8Array): boolean =>\n segment.length >= 6 &&\n segment[0] === 0x45 &&\n segment[1] === 0x78 &&\n segment[2] === 0x69 &&\n segment[3] === 0x66 &&\n segment[4] === 0 &&\n segment[5] === 0;\n\n/** Standalone JPEG markers have no length field (TEM, RST0–7, SOI). */\nconst isStandaloneJpegMarker = (marker: number): boolean =>\n marker === 0x01 || (marker >= 0xd0 && marker <= 0xd8);\n\n/**\n * JPEG: scan APP1 'Exif\\0\\0' segments; stop at SOS/EOI.\n * Skips 0xFF fill/padding and standalone markers. If an Exif APP1 has no\n * valid Orientation, keep scanning for a later one.\n */\nexport const getJpegOrientation = (bytes: Uint8Array): number | undefined => {\n if (bytes.length < 2 || bytes[0] !== JPEG_SOI_0 || bytes[1] !== JPEG_SOI_1) return undefined;\n let pos = 2;\n while (pos < bytes.length) {\n if (bytes[pos] !== 0xff) return undefined;\n while (pos < bytes.length && bytes[pos] === 0xff) pos++;\n if (pos >= bytes.length) return undefined;\n const marker = bytes[pos++];\n if (isStandaloneJpegMarker(marker)) continue;\n if (marker === 0xda || marker === 0xd9) return undefined; // SOS/EOI\n if (pos + 2 > bytes.length) return undefined;\n const size = (bytes[pos] << 8) | bytes[pos + 1];\n if (size < 2 || pos + size > bytes.length) return undefined;\n if (marker === 0xe1 && size >= 8) {\n const segment = bytes.subarray(pos + 2, pos + size);\n if (isExifApp1Payload(segment)) {\n const orientation = parseTiffOrientation(segment.subarray(6));\n if (orientation !== undefined) return orientation;\n }\n }\n pos += size;\n }\n return undefined;\n};\n\n/**\n * PNG: scan chunks for eXIf (raw TIFF payload). Skip IDAT and other\n * ancillary chunks; eXIf may appear after image data. Stop at IEND.\n */\nexport const getPngOrientation = (bytes: Uint8Array): number | undefined => {\n if (!isPngSignature(bytes)) return undefined;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n let pos = 8;\n while (pos + 12 <= bytes.length) {\n const length = view.getUint32(pos);\n if (pos + 12 + length > bytes.length) return undefined;\n const type = String.fromCharCode(\n bytes[pos + 4],\n bytes[pos + 5],\n bytes[pos + 6],\n bytes[pos + 7],\n );\n if (type === 'eXIf') {\n return parseTiffOrientation(bytes.subarray(pos + 8, pos + 8 + length));\n }\n if (type === 'IEND') return undefined;\n pos += 12 + length;\n }\n return undefined;\n};\n\nexport const orientationSwapsDimensions = (orientation: number) => orientation >= 5;\n\n/**\n * Map source (x, y) into destination (dx, dy) for EXIF orientations 2–8.\n * Orientations 5–8 swap width and height.\n */\nexport const transformRgba = (\n src: Uint8Array,\n width: number,\n height: number,\n orientation: number,\n): { data: Uint8Array; width: number; height: number } => {\n const swap = orientationSwapsDimensions(orientation);\n const destWidth = swap ? height : width;\n const destHeight = swap ? width : height;\n const dest = new Uint8Array(destWidth * destHeight * 4);\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n let dx = x;\n let dy = y;\n switch (orientation) {\n case 2:\n dx = width - 1 - x;\n dy = y;\n break;\n case 3:\n dx = width - 1 - x;\n dy = height - 1 - y;\n break;\n case 4:\n dx = x;\n dy = height - 1 - y;\n break;\n case 5:\n dx = y;\n dy = x;\n break;\n case 6:\n dx = height - 1 - y;\n dy = x;\n break;\n case 7:\n dx = height - 1 - y;\n dy = width - 1 - x;\n break;\n case 8:\n dx = y;\n dy = width - 1 - x;\n break;\n default:\n break;\n }\n const srcIndex = (y * width + x) * 4;\n const destIndex = (dy * destWidth + dx) * 4;\n dest[destIndex] = src[srcIndex];\n dest[destIndex + 1] = src[srcIndex + 1];\n dest[destIndex + 2] = src[srcIndex + 2];\n dest[destIndex + 3] = src[srcIndex + 3];\n }\n }\n\n return { data: dest, width: destWidth, height: destHeight };\n};\n\nconst bakeJpegOrientation = (bytes: Uint8Array): Uint8Array => {\n const orientation = getJpegOrientation(bytes);\n if (!orientation || orientation === 1) return bytes;\n const raw = jpegJs.decode(bytes, {\n useTArray: true,\n formatAsRGBA: true,\n maxMemoryUsageInMB: JPEG_MAX_MEMORY_MB,\n });\n const transformed = transformRgba(raw.data, raw.width, raw.height, orientation);\n return new Uint8Array(\n jpegJs.encode(\n { data: transformed.data, width: transformed.width, height: transformed.height },\n JPEG_ENCODE_QUALITY,\n ).data,\n );\n};\n\nconst bakePngOrientation = (bytes: Uint8Array): Uint8Array => {\n const orientation = getPngOrientation(bytes);\n if (!orientation || orientation === 1) return bytes;\n const img = UPNG.decode(toArrayBuffer(bytes));\n const rgba = new Uint8Array(UPNG.toRGBA8(img)[0]);\n const transformed = transformRgba(rgba, img.width, img.height, orientation);\n return new Uint8Array(\n UPNG.encode([toArrayBuffer(transformed.data)], transformed.width, transformed.height, 0),\n );\n};\n\n/**\n * One normalize path for JPEG and PNG. Tag absent/1 is a byte-identical\n * passthrough. Tag 2–8 decodes, transforms pixels, and re-encodes without\n * an orientation tag. May throw on decode/encode failure — callers fall back.\n */\nexport const normalizeImageOrientation = (bytes: Uint8Array): Uint8Array => {\n const kind = detectImageFormat(bytes);\n if (kind === 'jpeg') return bakeJpegOrientation(bytes);\n if (kind === 'png') return bakePngOrientation(bytes);\n return bytes;\n};\n","import type { TableImageHeightMode } from './types.js';\n\nexport const DEFAULT_TABLE_IMAGE_HEIGHT = 20;\nexport const DEFAULT_TABLE_IMAGE_HEIGHT_MODE: TableImageHeightMode = 'fixed';\n// PNG and JPEG data URLs only. gif/webp/svg/http and bare strings are not images.\nexport const TABLE_IMAGE_DATA_URL_PATTERN = /^data:image\\/(png|jpe?g);base64,/i;\n// Page breaks keep 0.5mm of slack. The auto cap is larger so a row at the limit\n// is not flush with that check, where float error reads an exact fit as overflow.\nexport const TABLE_IMAGE_AUTO_SAFETY_MARGIN = 1;\n","import type { ALIGNMENT, VERTICAL_ALIGNMENT } from '../text/types.js';\nimport type { BoxDimension } from '../box.js';\nimport type { Schema } from '@pdfme/common';\n\nexport const TABLE_CELL_TYPES = ['text', 'image'] as const;\nexport type TableCellType = (typeof TABLE_CELL_TYPES)[number];\nexport const TABLE_IMAGE_HEIGHT_MODES = ['fixed', 'auto'] as const;\nexport type TableImageHeightMode = (typeof TABLE_IMAGE_HEIGHT_MODES)[number];\n\nexport type Spacing = BoxDimension;\ntype BorderInsets = Spacing;\ntype BoxDimensions = Spacing;\n\nexport interface CellStyle {\n fontName?: string;\n alignment: ALIGNMENT;\n verticalAlignment: VERTICAL_ALIGNMENT;\n fontSize: number;\n lineHeight: number;\n characterSpacing: number;\n fontColor: string;\n backgroundColor: string;\n borderColor: string;\n borderWidth: BoxDimensions;\n padding: BoxDimensions;\n}\n\nexport type CellSchema = Schema &\n CellStyle & {\n cellType?: TableCellType;\n imageHeightMode?: TableImageHeightMode;\n imageHeight?: number;\n columnIndex?: number;\n rowIndex?: number;\n // Render-only identity of the table being painted. Not stored on the template.\n pickerSchemaKey?: string;\n };\n\nexport type TableSchema = Schema & {\n showHead: boolean;\n head: string[];\n headWidthPercentages: number[];\n repeatHead?: boolean;\n\n tableStyles: {\n borderColor: string;\n borderWidth: number;\n };\n headStyles: CellStyle;\n bodyStyles: CellStyle & { alternateBackgroundColor: string };\n columnStyles: {\n alignment?: { [colIndex: number]: ALIGNMENT };\n verticalAlignment?: { [colIndex: number]: VERTICAL_ALIGNMENT };\n cellType?: { [colIndex: number]: TableCellType };\n imageHeightMode?: { [colIndex: number]: TableImageHeightMode };\n imageHeight?: { [colIndex: number]: number };\n };\n};\n\nexport interface Styles {\n fontName: string | undefined;\n backgroundColor: string;\n textColor: string;\n lineHeight: number;\n characterSpacing: number;\n alignment: 'left' | 'center' | 'right' | 'justify';\n verticalAlignment: 'top' | 'middle' | 'bottom';\n fontSize: number;\n cellPadding: Spacing;\n lineColor: string;\n lineWidth: BorderInsets;\n cellWidth: number;\n minCellHeight: number;\n minCellWidth: number;\n cellType?: TableCellType;\n imageHeightMode?: TableImageHeightMode;\n imageHeight?: number;\n}\n\nexport interface TableInput {\n settings: Settings;\n styles: StylesProps;\n content: ContentInput;\n}\n\ninterface ContentInput {\n body: string[][];\n head: string[][];\n columns: number[];\n}\n\nexport interface Settings {\n startY: number;\n margin: Spacing;\n tableWidth: number;\n showHead: boolean;\n // Template showHead before a split segment hides the header. Auto image limits\n // use this so planning and drawing stay on the same row height.\n templateShowHead: boolean;\n tableLineWidth: number;\n tableLineColor: string;\n}\n\nexport interface StylesProps {\n styles: Partial<Styles>;\n headStyles: Partial<Styles>;\n bodyStyles: Partial<Styles>;\n alternateRowStyles: Partial<Styles>;\n columnStyles: { [key: string]: Partial<Styles> };\n}\n\nexport type Section = 'head' | 'body';\n","import { Buffer } from 'buffer';\nimport { hashImageDataUrl, getImageDimension } from '../graphics/imagehelper.js';\nimport {\n detectImageFormat,\n getJpegOrientation,\n getPngOrientation,\n orientationSwapsDimensions,\n} from '../graphics/orientation.js';\nimport type { ImageObjectPosition } from '../graphics/image.js';\nimport type { ALIGNMENT, VERTICAL_ALIGNMENT } from '../text/types.js';\nimport {\n DEFAULT_TABLE_IMAGE_HEIGHT,\n DEFAULT_TABLE_IMAGE_HEIGHT_MODE,\n TABLE_IMAGE_DATA_URL_PATTERN,\n} from './constants.js';\nimport { TABLE_CELL_TYPES, type TableCellType, type TableImageHeightMode } from './types.js';\n\nexport type TableImageDimension = { width: number; height: number };\n\nconst DIMENSION_CACHE_PREFIX = 'tableImageDim:';\nconst WARN_CACHE_PREFIX = 'tableImageWarned:';\nconst FAILED_DIMENSION = null;\n\nconst isTableCellType = (value: unknown): value is TableCellType =>\n typeof value === 'string' && TABLE_CELL_TYPES.some((cellType) => cellType === value);\n\nconst isDimension = (value: unknown): value is TableImageDimension => {\n if (!value || typeof value !== 'object') return false;\n const record = value as Record<string, unknown>;\n return typeof record.width === 'number' && typeof record.height === 'number';\n};\n\nconst dataUrlToBytes = (value: string): Uint8Array => {\n const marker = ';base64,';\n const index = value.indexOf(marker);\n const base64 = index >= 0 ? value.slice(index + marker.length) : value;\n return new Uint8Array(Buffer.from(base64, 'base64'));\n};\n\nconst applyOrientation = (\n dimension: TableImageDimension,\n bytes: Uint8Array,\n): TableImageDimension => {\n const format = detectImageFormat(bytes);\n const orientation =\n format === 'jpeg'\n ? getJpegOrientation(bytes)\n : format === 'png'\n ? getPngOrientation(bytes)\n : undefined;\n // image.pdf bakes EXIF into the embedded pixels, so measurement has to swap too.\n if (orientation !== undefined && orientationSwapsDimensions(orientation)) {\n return { width: dimension.height, height: dimension.width };\n }\n return dimension;\n};\n\nexport const isTableImageDataUrl = (value: string): boolean =>\n TABLE_IMAGE_DATA_URL_PATTERN.test(value);\n\nconst imageCacheSuffix = (value: string) => `${value.length}:${hashImageDataUrl(value)}`;\n\nexport const resolveImageDimension = (\n value: string,\n cache: Map<string | number, unknown>,\n): TableImageDimension | undefined => {\n if (!isTableImageDataUrl(value)) return undefined;\n const key = `${DIMENSION_CACHE_PREFIX}${imageCacheSuffix(value)}`;\n const cached = cache.get(key);\n if (cached === FAILED_DIMENSION) return undefined;\n if (isDimension(cached)) return cached;\n try {\n const bytes = dataUrlToBytes(value);\n const dimension = applyOrientation(getImageDimension(bytes), bytes);\n cache.set(key, dimension);\n return dimension;\n } catch {\n cache.set(key, FAILED_DIMENSION);\n return undefined;\n }\n};\n\nexport const warnInvalidTableImageOnce = (\n value: string | null | undefined,\n columnIndex: number,\n cache: Map<string | number, unknown>,\n) => {\n if (value == null || value === '') return;\n const key = `${WARN_CACHE_PREFIX}${imageCacheSuffix(value)}`;\n if (cache.has(key)) return;\n cache.set(key, true);\n console.warn(\n `[@pdfme/schemas/table] unsupported image in column ${columnIndex}; only PNG/JPEG data URL is supported`,\n );\n};\n\nexport const normalizeTableCellType = (\n value: unknown,\n columnIndex: number,\n cache: Map<string | number, unknown>,\n): TableCellType | undefined => {\n // null is unsupported and stays text, without a warning.\n if (value == null) return undefined;\n if (isTableCellType(value)) return value;\n const warnKey = `tableCellTypeWarned:${String(value)}`;\n if (!cache.has(warnKey)) {\n cache.set(warnKey, true);\n console.warn(\n `[@pdfme/schemas/table] unsupported cell type \"${String(value)}\" in column ${columnIndex}; treating as text`,\n );\n }\n return 'text';\n};\n\nexport const normalizeTableImageHeightMode = (value: unknown): TableImageHeightMode | undefined =>\n value === 'fixed' || value === 'auto' ? value : undefined;\n\nexport const normalizeTableImageHeight = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n\nexport const getTableImageObjectPosition = (\n alignment: ALIGNMENT | undefined,\n verticalAlignment: VERTICAL_ALIGNMENT | undefined,\n): ImageObjectPosition => {\n const horizontal = alignment === 'center' || alignment === 'right' ? alignment : 'left';\n const vertical =\n verticalAlignment === 'top' ? 'top' : verticalAlignment === 'bottom' ? 'bottom' : 'center';\n return `${horizontal} ${vertical}`;\n};\n\nexport const resolveFixedTableImageHeight = (imageHeight: number | undefined): number =>\n typeof imageHeight === 'number' && Number.isFinite(imageHeight) && imageHeight > 0\n ? imageHeight\n : DEFAULT_TABLE_IMAGE_HEIGHT;\n\n/**\n * Fixed height is kept for empty and invalid values so rows in the column stay aligned.\n * Auto height is 0 unless a PNG/JPEG data URL resolves.\n */\nexport const resolveTableImageContentHeight = (arg: {\n value: string;\n mode: TableImageHeightMode | undefined;\n imageHeight: number | undefined;\n contentWidth: number;\n columnIndex: number;\n cache: Map<string | number, unknown>;\n}): number => {\n const mode = arg.mode ?? DEFAULT_TABLE_IMAGE_HEIGHT_MODE;\n if (!arg.value) {\n return mode === 'auto' ? 0 : resolveFixedTableImageHeight(arg.imageHeight);\n }\n const dimension = resolveImageDimension(arg.value, arg.cache);\n if (!dimension || dimension.width <= 0) {\n warnInvalidTableImageOnce(arg.value, arg.columnIndex, arg.cache);\n return mode === 'auto' ? 0 : resolveFixedTableImageHeight(arg.imageHeight);\n }\n if (mode === 'auto') {\n return (arg.contentWidth * dimension.height) / dimension.width;\n }\n return resolveFixedTableImageHeight(arg.imageHeight);\n};\n","import { Font, isBlankPdf, mm2pt, pt2mm, type BasePdf } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { getBoxContentArea, getBoxVerticalInset, type BoxStyleSchema } from '../box.js';\nimport { splitTextToSize, getFontKitFont, widthOfTextAtSize } from '../text/helper.js';\nimport { DEFAULT_TABLE_IMAGE_HEIGHT_MODE, TABLE_IMAGE_AUTO_SAFETY_MARGIN } from './constants.js';\nimport { resolveTableImageContentHeight } from './imageCell.js';\nimport type { Styles, TableInput, Settings, Section, StylesProps } from './types.js';\n\ntype ContentSettings = { body: Row[]; head: Row[]; columns: Column[] };\n\nexport class Cell {\n raw: string;\n text: string[];\n styles: Styles;\n section: Section;\n contentHeight = 0;\n contentWidth = 0;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n imageContentHeight = 0;\n\n width = 0;\n height = 0;\n x = 0;\n y = 0;\n\n constructor(raw: string, styles: Styles, section: Section) {\n this.styles = styles;\n this.section = section;\n this.raw = raw;\n const splitRegex = /\\r\\n|\\r|\\n/g;\n this.text = raw.split(splitRegex);\n }\n\n isImage() {\n return this.section !== 'head' && this.styles.cellType === 'image';\n }\n\n getContentHeight() {\n const verticalInset = getBoxVerticalInset(getCellBoxStyle(this));\n if (this.isImage()) {\n return Math.max(this.imageContentHeight + verticalInset, this.styles.minCellHeight);\n }\n const lineCount = Array.isArray(this.text) ? this.text.length : 1;\n const lineHeight = pt2mm(this.styles.fontSize) * this.styles.lineHeight;\n const height = lineCount * lineHeight + verticalInset;\n return Math.max(height, this.styles.minCellHeight);\n }\n\n padding(name: 'top' | 'bottom' | 'left' | 'right') {\n return this.styles.cellPadding[name];\n }\n}\n\nconst getCellBoxStyle = (cell: Cell): BoxStyleSchema => ({\n padding: cell.styles.cellPadding,\n borderWidth: cell.styles.lineWidth,\n});\n\nexport class Column {\n index: number;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n width = 0;\n\n constructor(index: number) {\n this.index = index;\n }\n\n getMaxCustomCellWidth(table: Table) {\n let max = 0;\n for (const row of table.allRows()) {\n const cell: Cell = row.cells[this.index];\n max = Math.max(max, cell.styles.cellWidth);\n }\n return max;\n }\n}\n\nexport class Row {\n readonly raw: string[];\n readonly index: number;\n readonly section: Section;\n readonly cells: { [key: string]: Cell };\n\n height = 0;\n\n constructor(raw: string[], index: number, section: Section, cells: { [key: string]: Cell }) {\n this.raw = raw;\n this.index = index;\n this.section = section;\n this.cells = cells;\n }\n\n getMaxCellHeight(columns: Column[]) {\n return columns.reduce((acc, column) => Math.max(acc, this.cells[column.index]?.height || 0), 0);\n }\n\n getMinimumRowHeight(columns: Column[]) {\n return columns.reduce((acc: number, column: Column) => {\n const cell = this.cells[column.index];\n if (!cell) return 0;\n const vPadding = cell.padding('top') + cell.padding('bottom');\n const oneRowHeight = vPadding + cell.styles.lineHeight;\n return oneRowHeight > acc ? oneRowHeight : acc;\n }, 0);\n }\n}\n\nexport class Table {\n readonly settings: Settings;\n readonly styles: StylesProps;\n\n readonly columns: Column[];\n readonly head: Row[];\n readonly body: Row[];\n\n constructor(input: TableInput, content: ContentSettings) {\n this.settings = input.settings;\n this.styles = input.styles;\n\n this.columns = content.columns;\n this.head = content.head;\n this.body = content.body;\n }\n\n static async create(arg: {\n input: TableInput;\n content: ContentSettings;\n font: Font;\n basePdf: BasePdf;\n _cache: Map<string | number, unknown>;\n }) {\n const { input, content, font, basePdf, _cache } = arg;\n const table = new Table(input, content);\n\n await calculateWidths({ table, font, basePdf, _cache });\n\n return table;\n }\n\n getHeadHeight() {\n return this.head.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n getBodyHeight() {\n return this.body.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n allRows() {\n return this.head.concat(this.body);\n }\n\n getWidth() {\n return this.settings.tableWidth;\n }\n\n getHeight() {\n return (this.settings.showHead ? this.getHeadHeight() : 0) + this.getBodyHeight();\n }\n}\n\nasync function calculateWidths(arg: {\n table: Table;\n font: Font;\n basePdf: BasePdf;\n _cache: Map<string | number, unknown>;\n}) {\n const { table, font, basePdf, _cache } = arg;\n\n const getFontKitFontByFontName = (fontName: string | undefined) =>\n getFontKitFont(fontName, font, _cache as Map<string | number, FontKitFont>);\n\n await calculate(table, getFontKitFontByFontName);\n\n const resizableColumns: Column[] = [];\n let initialTableWidth = 0;\n\n table.columns.forEach((column) => {\n const customWidth = column.getMaxCustomCellWidth(table);\n if (customWidth) {\n // final column width\n column.width = customWidth;\n } else {\n // initial column width (will be resized)\n column.width = column.wrappedWidth;\n resizableColumns.push(column);\n }\n initialTableWidth += column.width;\n });\n\n // width difference that needs to be distributed\n let resizeWidth = table.getWidth() - initialTableWidth;\n\n // first resize attempt: with respect to minReadableWidth and minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) =>\n Math.max(column.minReadableWidth, column.minWidth),\n );\n }\n\n // second resize attempt: ignore minReadableWidth but respect minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) => column.minWidth);\n }\n\n resizeWidth = Math.abs(resizeWidth);\n\n applyColSpans(table);\n await fitContent(table, getFontKitFontByFontName, basePdf, _cache);\n applyRowSpans(table);\n}\n\nfunction applyRowSpans(table: Table) {\n const rowSpanCells: {\n [key: string]: { cell: Cell; left: number; row: Row };\n } = {};\n let colRowSpansLeft = 1;\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n for (const column of table.columns) {\n const data = rowSpanCells[column.index];\n if (colRowSpansLeft > 1) {\n colRowSpansLeft--;\n delete row.cells[column.index];\n } else if (data) {\n data.cell.height += row.height;\n colRowSpansLeft = 1;\n delete row.cells[column.index];\n data.left--;\n if (data.left <= 1) {\n delete rowSpanCells[column.index];\n }\n } else {\n const cell = row.cells[column.index];\n if (!cell) {\n continue;\n }\n cell.height = row.height;\n }\n }\n }\n}\n\nfunction applyColSpans(table: Table) {\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n\n let colSpanCell = null;\n let combinedColSpanWidth = 0;\n let colSpansLeft = 0;\n for (let columnIndex = 0; columnIndex < table.columns.length; columnIndex++) {\n const column = table.columns[columnIndex];\n\n // Width and colspan\n colSpansLeft -= 1;\n if (colSpansLeft > 1 && table.columns[columnIndex + 1]) {\n combinedColSpanWidth += column.width;\n delete row.cells[column.index];\n } else if (colSpanCell) {\n const cell: Cell = colSpanCell;\n delete row.cells[column.index];\n colSpanCell = null;\n cell.width = column.width + combinedColSpanWidth;\n } else {\n const cell = row.cells[column.index];\n if (!cell) continue;\n colSpansLeft = 1;\n combinedColSpanWidth = 0;\n cell.width = column.width + combinedColSpanWidth;\n }\n }\n }\n}\n\nconst autoImageHeightLimit = (table: Table, cell: Cell, basePdf: BasePdf): number | undefined => {\n // Custom base PDFs are not reflowed, so an auto image may be taller than one page.\n if (!isBlankPdf(basePdf)) return undefined;\n const [paddingTop, , paddingBottom] = basePdf.padding;\n const pageContentHeight = basePdf.height - paddingTop - paddingBottom;\n // cell.height is assigned after fit, so the in-progress head size is the row height.\n // Split segments may hide the header; the cap still follows the template showHead.\n const headHeight = table.settings.templateShowHead\n ? table.head.reduce((sum, row) => sum + row.height, 0)\n : 0;\n const verticalInset = getBoxVerticalInset(getCellBoxStyle(cell));\n return pageContentHeight - headHeight - verticalInset - TABLE_IMAGE_AUTO_SAFETY_MARGIN;\n};\n\nasync function fitContent(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n basePdf: BasePdf,\n cache: Map<string | number, unknown>,\n) {\n const rowSpanHeight = { count: 0, height: 0 };\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell: Cell = row.cells[column.index];\n if (!cell) continue;\n\n const contentArea = getBoxContentArea({\n position: { x: 0, y: 0 },\n width: cell.width,\n height: cell.height,\n ...getCellBoxStyle(cell),\n });\n if (cell.isImage()) {\n cell.text = [];\n let imageContentHeight = resolveTableImageContentHeight({\n value: cell.raw,\n mode: cell.styles.imageHeightMode,\n imageHeight: cell.styles.imageHeight,\n contentWidth: contentArea.width,\n columnIndex: column.index,\n cache,\n });\n if ((cell.styles.imageHeightMode ?? DEFAULT_TABLE_IMAGE_HEIGHT_MODE) === 'auto') {\n const limit = autoImageHeightLimit(table, cell, basePdf);\n if (limit !== undefined) {\n imageContentHeight = Math.min(imageContentHeight, Math.max(0, limit));\n }\n }\n cell.imageContentHeight = imageContentHeight;\n } else {\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n cell.text = splitTextToSize({\n value: cell.raw,\n characterSpacing: cell.styles.characterSpacing,\n boxWidthInPt: mm2pt(contentArea.width),\n fontSize: cell.styles.fontSize,\n fontKitFont,\n });\n }\n\n cell.contentHeight = cell.getContentHeight();\n\n let realContentHeight = cell.contentHeight;\n if (rowSpanHeight && rowSpanHeight.count > 0) {\n if (rowSpanHeight.height > realContentHeight) {\n realContentHeight = rowSpanHeight.height;\n }\n }\n if (realContentHeight > row.height) {\n row.height = realContentHeight;\n }\n }\n rowSpanHeight.count--;\n }\n}\n\nfunction resizeColumns(\n columns: Column[],\n resizeWidth: number,\n getMinWidth: (column: Column) => number,\n) {\n const initialResizeWidth = resizeWidth;\n const sumWrappedWidth = columns.reduce((acc, column) => acc + column.wrappedWidth, 0);\n\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n\n const ratio = column.wrappedWidth / sumWrappedWidth;\n const suggestedChange = initialResizeWidth * ratio;\n const suggestedWidth = column.width + suggestedChange;\n\n const minWidth = getMinWidth(column);\n const newWidth = suggestedWidth < minWidth ? minWidth : suggestedWidth;\n\n resizeWidth -= newWidth - column.width;\n column.width = newWidth;\n }\n\n resizeWidth = Math.round(resizeWidth * 1e10) / 1e10;\n\n // Run the resizer again if there's remaining width needs\n // to be distributed and there're columns that can be resized\n if (resizeWidth) {\n const resizableColumns = columns.filter((column) => {\n return resizeWidth < 0\n ? column.width > getMinWidth(column) // check if column can shrink\n : true; // check if column can grow\n });\n\n if (resizableColumns.length) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, getMinWidth);\n }\n }\n\n return resizeWidth;\n}\n\nasync function calculate(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n) {\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n if (!cell) continue;\n\n const hPadding = cell.padding('right') + cell.padding('left');\n // A data URL must not widen the column the way a long string would.\n if (cell.isImage()) {\n cell.contentWidth = hPadding;\n cell.minReadableWidth = hPadding;\n cell.minWidth = cell.styles.cellWidth;\n cell.wrappedWidth = cell.styles.cellWidth;\n continue;\n }\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n\n cell.contentWidth = getStringWidth(cell, fontKitFont) + hPadding;\n\n const longestWordWidth = getStringWidth(\n Object.assign(cell, { text: cell.text.join(' ').split(/\\s+/) }),\n fontKitFont,\n );\n cell.minReadableWidth = longestWordWidth + hPadding;\n\n cell.minWidth = cell.styles.cellWidth;\n cell.wrappedWidth = cell.styles.cellWidth;\n }\n }\n\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n\n // For now we ignore the minWidth and wrappedWidth of colspan cells when calculating colspan widths.\n // Could probably be improved upon however.\n if (cell) {\n column.wrappedWidth = Math.max(column.wrappedWidth, cell.wrappedWidth);\n column.minWidth = Math.max(column.minWidth, cell.minWidth);\n column.minReadableWidth = Math.max(column.minReadableWidth, cell.minReadableWidth);\n } else {\n // Respect cellWidth set in columnStyles even if there is no cells for this column\n // or if the column only have colspan cells. Since the width of colspan cells\n // does not affect the width of columns, setting columnStyles cellWidth enables the\n // user to at least do it manually.\n\n // Note that this is not perfect for now since for example row and table styles are\n // not accounted for\n const columnStyles = table.styles.columnStyles[column.index] || {};\n const cellWidth = columnStyles.cellWidth || columnStyles.minCellWidth;\n if (cellWidth) {\n column.minWidth = cellWidth;\n column.wrappedWidth = cellWidth;\n }\n }\n }\n }\n}\n\nfunction getStringWidth(cell: Cell, fontKitFont: FontKitFont) {\n const text = cell.text;\n const textArr: string[] = Array.isArray(text) ? text : [text];\n const fontSize = cell.styles.fontSize;\n const characterSpacing = cell.styles.characterSpacing;\n const widestLineWidth = textArr\n .map((text) => widthOfTextAtSize(text, fontKitFont, fontSize, characterSpacing))\n .reduce((a, b) => Math.max(a, b), 0);\n\n return widestLineWidth;\n}\n","import {\n Schema,\n isBlankPdf,\n BasePdf,\n CommonOptions,\n getDefaultFont,\n getFallbackFontName,\n cloneDeep,\n} from '@pdfme/common';\nimport {\n normalizeTableCellType,\n normalizeTableImageHeight,\n normalizeTableImageHeightMode,\n} from './imageCell.js';\nimport type {\n TableSchema,\n CellStyle,\n Styles,\n Spacing,\n TableInput,\n StylesProps,\n Section,\n} from './types.js';\nimport { Cell, Column, Row, Table } from './classes.js';\nimport { createBoxDimension } from '../box.js';\nimport { getTableBodyRange } from '../splitRange.js';\n\ntype StyleProp = 'styles' | 'headStyles' | 'bodyStyles' | 'alternateRowStyles' | 'columnStyles';\n\ninterface CreateTableArgs {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n}\n\ninterface UserOptions {\n startY: number;\n tableWidth: number;\n margin: Spacing;\n showHead: boolean;\n tableLineWidth?: number;\n tableLineColor?: string;\n head?: string[][];\n body?: string[][];\n\n styles?: Partial<Styles>;\n bodyStyles?: Partial<Styles>;\n headStyles?: Partial<Styles>;\n alternateRowStyles?: Partial<Styles>;\n columnStyles?: {\n [key: string]: Partial<Styles>;\n };\n}\n\nfunction parseSection(\n sectionName: Section,\n sectionRows: string[][],\n columns: Column[],\n styleProps: StylesProps,\n fallbackFontName: string,\n): Row[] {\n const rowSpansLeftForColumn: { [key: string]: { left: number; times: number } } = {};\n const result = sectionRows.map((rawRow, rowIndex) => {\n let skippedRowForRowSpans = 0;\n const cells: { [key: string]: Cell } = {};\n\n let colSpansAdded = 0;\n let columnSpansLeft = 0;\n for (const column of columns) {\n if (\n rowSpansLeftForColumn[column.index] == null ||\n rowSpansLeftForColumn[column.index].left === 0\n ) {\n if (columnSpansLeft === 0) {\n let rawCell;\n if (Array.isArray(rawRow)) {\n rawCell = rawRow[column.index - colSpansAdded - skippedRowForRowSpans];\n } else {\n rawCell = rawRow[column.index];\n }\n const styles = cellStyles(sectionName, column, rowIndex, styleProps, fallbackFontName);\n const cell = new Cell(rawCell, styles, sectionName);\n cells[column.index] = cell;\n\n columnSpansLeft = 0;\n rowSpansLeftForColumn[column.index] = {\n left: 0,\n times: columnSpansLeft,\n };\n } else {\n columnSpansLeft--;\n colSpansAdded++;\n }\n } else {\n rowSpansLeftForColumn[column.index].left--;\n columnSpansLeft = rowSpansLeftForColumn[column.index].times;\n skippedRowForRowSpans++;\n }\n }\n return new Row(rawRow, rowIndex, sectionName, cells);\n });\n return result;\n}\n\nfunction parseContent4Table(input: TableInput, fallbackFontName: string) {\n const content = input.content;\n const columns = content.columns.map((index) => new Column(index));\n const styles = input.styles;\n return {\n columns,\n head: parseSection('head', content.head, columns, styles, fallbackFontName),\n body: parseSection('body', content.body, columns, styles, fallbackFontName),\n };\n}\n\nfunction cellStyles(\n sectionName: Section,\n column: Column,\n rowIndex: number,\n styles: StylesProps,\n fallbackFontName: string,\n) {\n let sectionStyles;\n if (sectionName === 'head') {\n sectionStyles = styles.headStyles;\n } else if (sectionName === 'body') {\n sectionStyles = styles.bodyStyles;\n }\n const otherStyles = Object.assign({}, styles.styles, sectionStyles);\n\n const colStyles = styles.columnStyles[column.index] || {};\n\n const rowStyles =\n sectionName === 'body' && rowIndex % 2 === 0\n ? Object.assign({}, styles.alternateRowStyles)\n : {};\n\n const defaultStyle = {\n fontName: fallbackFontName,\n backgroundColor: '',\n textColor: '#000000',\n lineHeight: 1,\n characterSpacing: 0,\n alignment: 'left',\n verticalAlignment: 'middle',\n fontSize: 10,\n cellPadding: createBoxDimension(5),\n lineColor: '#000000',\n lineWidth: createBoxDimension(0),\n minCellHeight: 0,\n minCellWidth: 0,\n };\n return Object.assign(defaultStyle, otherStyles, rowStyles, colStyles) as Styles;\n}\n\nfunction mapCellStyle(style: CellStyle): Partial<Styles> {\n const mapping: Partial<Styles> = {\n fontName: style.fontName,\n alignment: style.alignment,\n verticalAlignment: style.verticalAlignment,\n fontSize: style.fontSize,\n lineHeight: style.lineHeight,\n characterSpacing: style.characterSpacing,\n backgroundColor: style.backgroundColor,\n // ---\n textColor: style.fontColor,\n lineColor: style.borderColor,\n lineWidth: style.borderWidth,\n cellPadding: style.padding,\n };\n return Object.fromEntries(\n Object.entries(mapping).filter(([, value]) => value !== undefined),\n ) as Partial<Styles>;\n}\n\nfunction getTableOptions(\n schema: TableSchema,\n body: string[][],\n cache: Map<string | number, unknown>,\n): UserOptions {\n const columnStylesWidth = schema.headWidthPercentages.reduce(\n (acc, cur, i) => ({ ...acc, [i]: { cellWidth: schema.width * (cur / 100) } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const alignmentMap = schema.columnStyles.alignment || {};\n const verticalAlignmentMap = schema.columnStyles.verticalAlignment || {};\n const cellTypeMap = schema.columnStyles.cellType || {};\n const imageHeightModeMap = schema.columnStyles.imageHeightMode || {};\n const imageHeightMap = schema.columnStyles.imageHeight || {};\n const columnStylesAlignment = Object.entries(alignmentMap).reduce(\n (acc, [key, value]) => ({ ...acc, [key]: { alignment: value } }),\n {} as Record<number, Partial<Styles>>,\n );\n const columnStylesVerticalAlignment = Object.entries(verticalAlignmentMap).reduce(\n (acc, [key, value]) => ({ ...acc, [key]: { verticalAlignment: value } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const allKeys = new Set([\n ...Object.keys(columnStylesWidth).map(Number),\n ...Object.keys(columnStylesAlignment).map(Number),\n ...Object.keys(columnStylesVerticalAlignment).map(Number),\n ...Object.keys(cellTypeMap).map(Number),\n ...Object.keys(imageHeightModeMap).map(Number),\n ...Object.keys(imageHeightMap).map(Number),\n ]);\n const columnStyles = Array.from(allKeys).reduce(\n (acc, key) => {\n const widthStyle = columnStylesWidth[key] || {};\n const alignmentStyle = columnStylesAlignment[key] || {};\n const verticalAlignmentStyle = columnStylesVerticalAlignment[key] || {};\n const cellType = normalizeTableCellType(cellTypeMap[key], key, cache);\n const imageHeightMode = normalizeTableImageHeightMode(imageHeightModeMap[key]);\n const imageHeight = normalizeTableImageHeight(imageHeightMap[key]);\n const imageStyle: Partial<Styles> = {\n ...(cellType ? { cellType } : {}),\n ...(imageHeightMode ? { imageHeightMode } : {}),\n ...(imageHeight !== undefined ? { imageHeight } : {}),\n };\n return {\n ...acc,\n [key]: { ...widthStyle, ...alignmentStyle, ...verticalAlignmentStyle, ...imageStyle },\n };\n },\n {} as Record<number, Partial<Styles>>,\n );\n\n return {\n head: [schema.head],\n body,\n showHead: schema.showHead,\n startY: schema.position.y,\n tableWidth: schema.width,\n tableLineColor: schema.tableStyles.borderColor,\n tableLineWidth: schema.tableStyles.borderWidth,\n headStyles: mapCellStyle(schema.headStyles),\n bodyStyles: mapCellStyle(schema.bodyStyles),\n alternateRowStyles: { backgroundColor: schema.bodyStyles.alternateBackgroundColor },\n columnStyles,\n margin: { top: 0, right: 0, left: schema.position.x, bottom: 0 },\n };\n}\n\nfunction parseStyles(cInput: UserOptions) {\n const styleOptions: StylesProps = {\n styles: {},\n headStyles: {},\n bodyStyles: {},\n alternateRowStyles: {},\n columnStyles: {},\n };\n for (const prop of Object.keys(styleOptions) as StyleProp[]) {\n if (prop === 'columnStyles') {\n const current = cInput[prop];\n styleOptions.columnStyles = Object.assign({}, current);\n } else {\n const allOptions = [cInput];\n const styles = allOptions.map((opts) => opts[prop] || {});\n styleOptions[prop] = Object.assign({}, styles[0], styles[1], styles[2]);\n }\n }\n return styleOptions;\n}\n\nfunction parseContent4Input(options: UserOptions) {\n const head = options.head || [];\n const body = options.body || [];\n const columns = (head[0] || body[0] || []).map((_, index) => index);\n return { columns, head, body };\n}\n\nfunction parseInput(\n schema: TableSchema,\n body: string[][],\n cache: Map<string | number, unknown>,\n templateShowHead: boolean,\n): TableInput {\n const options = getTableOptions(schema, body, cache);\n const styles = parseStyles(options);\n const settings = {\n startY: options.startY,\n margin: options.margin,\n tableWidth: options.tableWidth,\n showHead: options.showHead,\n templateShowHead,\n tableLineWidth: options.tableLineWidth ?? 0,\n tableLineColor: options.tableLineColor ?? '',\n };\n\n const content = parseContent4Input(options);\n\n return { content, styles, settings };\n}\n\nexport function createSingleTable(body: string[][], args: CreateTableArgs) {\n const { options, _cache, basePdf } = args;\n if (!isBlankPdf(basePdf)) {\n console.warn(\n '[@pdfme/schema/table]' +\n 'When specifying a custom PDF for basePdf, ' +\n 'you cannot use features such as page breaks or re-layout of other elements.' +\n 'To utilize these features, please define basePdf as follows:\\n' +\n '{ width: number; height: number; padding: [number, number, number, number]; }',\n );\n }\n\n const schema = cloneDeep(args.schema) as TableSchema;\n const { start } = getTableBodyRange(schema) || { start: 0 };\n if (start % 2 === 1) {\n const alternateBackgroundColor = schema.bodyStyles.alternateBackgroundColor;\n schema.bodyStyles.alternateBackgroundColor = schema.bodyStyles.backgroundColor;\n schema.bodyStyles.backgroundColor = alternateBackgroundColor;\n }\n // Captured before split segments hide the header. Auto limits must not follow that override.\n const templateShowHead = schema.showHead !== false;\n schema.showHead =\n schema.showHead === false ? false : !schema.__isSplit || schema.repeatHead === true;\n\n const input = parseInput(schema, body, _cache, templateShowHead);\n\n const font = options.font || getDefaultFont();\n\n const fallbackFontName = getFallbackFontName(font);\n\n const content = parseContent4Table(input, fallbackFontName);\n\n return Table.create({\n input,\n content,\n font,\n basePdf,\n _cache,\n });\n}\n","export const DEFAULT_OPACITY = 1;\n// Matches isHexValid in @pdfme/common: 3/4/6/8-digit hex, where 4/8-digit carry alpha.\nexport const HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{3,4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$';\n// Barcode bar/text colors are handed to bwip-js, which has no alpha support (it reads\n// 8-digit hex as CMYK and throws on 4-digit hex), so those fields stay 6-digit only.\nexport const OPAQUE_HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{6})$';\n","import {\n DEFAULT_ALIGNMENT,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n ALIGN_RIGHT,\n ALIGN_CENTER,\n ALIGN_LEFT,\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n} from '../text/constants.js';\nimport { HEX_COLOR_PATTERN } from '../constants.js';\nimport type { TableSchema } from './types.js';\nimport { getTableBodyRange } from '../splitRange.js';\nimport type { DynamicLayoutRange } from '@pdfme/common';\nimport { createBoxDimension, getBoxDimensionPropPanelSchema } from '../box.js';\n\nexport const getDefaultCellStyles = () => ({\n fontName: undefined,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: VERTICAL_ALIGN_MIDDLE,\n fontSize: DEFAULT_FONT_SIZE,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n fontColor: DEFAULT_FONT_COLOR,\n backgroundColor: '',\n borderColor: '#888888',\n borderWidth: createBoxDimension(0.1),\n padding: createBoxDimension(5),\n});\n\nexport const getCellPropPanelSchema = (arg: {\n i18n: (key: string) => string;\n fallbackFontName: string;\n fontNames: string[];\n isBody?: boolean;\n}) => {\n const { i18n, fallbackFontName, fontNames, isBody } = arg;\n\n return {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n alignment: {\n title: i18n('schemas.text.textAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.left'), value: ALIGN_LEFT },\n { label: i18n('schemas.center'), value: ALIGN_CENTER },\n { label: i18n('schemas.right'), value: ALIGN_RIGHT },\n ],\n },\n span: 8,\n },\n verticalAlignment: {\n title: i18n('schemas.text.verticalAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.top'), value: VERTICAL_ALIGN_TOP },\n { label: i18n('schemas.middle'), value: VERTICAL_ALIGN_MIDDLE },\n { label: i18n('schemas.bottom'), value: VERTICAL_ALIGN_BOTTOM },\n ],\n },\n span: 8,\n },\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n borderColor: {\n title: i18n('schemas.borderColor'),\n type: 'string',\n widget: 'color',\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n backgroundColor: {\n title: i18n('schemas.backgroundColor'),\n type: 'string',\n widget: 'color',\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n ...(isBody\n ? {\n alternateBackgroundColor: {\n title: i18n('schemas.table.alternateBackgroundColor'),\n type: 'string',\n widget: 'color',\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n }\n : {}),\n '-': { type: 'void', widget: 'Divider' },\n borderWidth: {\n title: i18n('schemas.borderWidth'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(0.1),\n },\n '--': { type: 'void', widget: 'Divider' },\n padding: {\n title: i18n('schemas.padding'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(),\n },\n };\n};\n\nexport const getBody = (value: string | string[][]): string[][] => {\n if (typeof value === 'string') {\n return JSON.parse(value || '[]') as string[][];\n }\n return value || [];\n};\n\nexport const getBodyWithRange = (value: string | string[][], range?: DynamicLayoutRange) => {\n const body = getBody(value);\n if (!range) return body;\n return body.slice(range.start, range.end);\n};\n\nexport const getBodyWithSchemaRange = (\n value: string | string[][],\n schema: TableSchema,\n range = getTableBodyRange(schema),\n) => getBodyWithRange(value, range);\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\n// Column indexes are canonical decimal keys (\"0\", \"1\", \"10\"), not \"01\" or \"1.5\".\nconst columnIndexFromKey = (key: string): number | undefined => {\n if (!/^(0|[1-9]\\d*)$/.test(key)) return undefined;\n const index = Number(key);\n return Number.isSafeInteger(index) ? index : undefined;\n};\n\n// Treat a value as a per-column map only when every key is a column index.\n// A map that mixes in any non-numeric key is left unchanged.\nconst isColumnIndexMap = (value: unknown): value is Record<string, unknown> => {\n if (!isPlainObject(value)) return false;\n return Object.keys(value).every((key) => columnIndexFromKey(key) !== undefined);\n};\n\nconst remapColumnIndexMap = (\n columnMap: Record<string, unknown>,\n removedIndex: number,\n): Record<string, unknown> => {\n const remapped: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(columnMap)) {\n const columnIndex = columnIndexFromKey(key);\n if (columnIndex === undefined || columnIndex === removedIndex) continue;\n const nextIndex = columnIndex > removedIndex ? columnIndex - 1 : columnIndex;\n remapped[nextIndex] = value;\n }\n return remapped;\n};\n\n// Per-column style maps are keyed by column index. Every map on columnStyles\n// — including keys this version does not define, such as fontName or image\n// cell settings — must drop the removed column and close the gap. Values that\n// are not column-index maps are preserved unchanged.\nexport const remapColumnStylesOnRemove = (\n columnStyles: TableSchema['columnStyles'] | null | undefined,\n removedIndex: number,\n): TableSchema['columnStyles'] => {\n if (columnStyles == null) return {};\n const source = columnStyles as Record<string, unknown>;\n const next: Record<string, unknown> = {};\n for (const [styleKey, styleValue] of Object.entries(source)) {\n next[styleKey] = isColumnIndexMap(styleValue)\n ? remapColumnIndexMap(styleValue, removedIndex)\n : styleValue;\n }\n return next as TableSchema['columnStyles'];\n};\n","import {\n Schema,\n BasePdf,\n BlankPdf,\n CommonOptions,\n DynamicLayoutArgs,\n DynamicLayoutResult,\n isBlankPdf,\n} from '@pdfme/common';\nimport { createSingleTable } from './tableHelper.js';\nimport { getBodyWithRange, getBody } from './helper.js';\nimport { TableSchema } from './types.js';\nimport { createTableBodySplitRange, getTableBodyRange } from '../splitRange.js';\n\nexport const getDynamicHeightsForTable = async (\n value: string,\n args: {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n },\n): Promise<number[]> => {\n if (args.schema.type !== 'table') return Promise.resolve([args.schema.height]);\n const schema = args.schema as TableSchema;\n const bodyRange = getTableBodyRange(schema);\n const body = bodyRange?.start === 0 ? getBody(value) : getBodyWithRange(value, bodyRange);\n const table = await createSingleTable(body, args);\n\n const baseHeights = schema.showHead\n ? table.allRows().map((row) => row.height)\n : [0].concat(table.body.map((row) => row.height));\n\n const headerHeight = schema.showHead ? table.getHeadHeight() : 0;\n const shouldRepeatHeader = schema.repeatHead && isBlankPdf(args.basePdf) && headerHeight > 0;\n\n if (!shouldRepeatHeader) {\n return baseHeights;\n }\n\n const basePdf = args.basePdf as BlankPdf;\n const [paddingTop, , paddingBottom] = basePdf.padding;\n const pageContentHeight = basePdf.height - paddingTop - paddingBottom;\n const getPageStartY = (pageIndex: number) => pageIndex * pageContentHeight + paddingTop;\n\n const initialPageIndex = Math.max(\n 0,\n Math.floor((schema.position.y - paddingTop) / pageContentHeight),\n );\n const headRowCount = schema.showHead ? table.head.length : 0;\n const SAFETY_MARGIN = 0.5;\n // Same tolerance as placeUnitsOnPages in @pdfme/common.\n const EPSILON = 0.01;\n\n let currentPageIndex = initialPageIndex;\n let currentPageY = schema.position.y;\n let rowsOnCurrentPage = 0;\n // avoidFirstUnitOnly moves the header unit with the first body row. That row\n // must not also include a repeated header, or the fresh page cannot fit it.\n let headerTravelsWithBody = false;\n\n const result: number[] = [];\n\n for (let i = 0; i < baseHeights.length; i++) {\n const isBodyRow = i >= headRowCount;\n const rowHeight = baseHeights[i];\n\n while (true) {\n const currentPageStartY = getPageStartY(currentPageIndex);\n const remainingHeight = currentPageStartY + pageContentHeight - currentPageY;\n const needsHeader =\n isBodyRow &&\n rowsOnCurrentPage === 0 &&\n currentPageIndex > initialPageIndex &&\n !headerTravelsWithBody;\n const totalRowHeight = rowHeight + (needsHeader ? headerHeight : 0);\n\n if (totalRowHeight > remainingHeight - SAFETY_MARGIN + EPSILON) {\n if (rowsOnCurrentPage === 0 && Math.abs(currentPageY - currentPageStartY) < SAFETY_MARGIN) {\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n headerTravelsWithBody = false;\n break;\n }\n const headerWouldBeAlone =\n !headerTravelsWithBody &&\n currentPageIndex === initialPageIndex &&\n isBodyRow &&\n headRowCount > 0 &&\n result.length === headRowCount &&\n rowsOnCurrentPage === headRowCount;\n currentPageIndex++;\n if (headerWouldBeAlone) {\n headerTravelsWithBody = true;\n currentPageY = getPageStartY(currentPageIndex) + headerHeight;\n rowsOnCurrentPage = headRowCount;\n } else {\n headerTravelsWithBody = false;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n }\n continue;\n }\n\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n if (isBodyRow) headerTravelsWithBody = false;\n\n if (currentPageY >= currentPageStartY + pageContentHeight - SAFETY_MARGIN) {\n currentPageIndex++;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n headerTravelsWithBody = false;\n }\n break;\n }\n }\n\n return result;\n};\n\nexport const getDynamicLayoutForTable = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n const heights = await getDynamicHeightsForTable(value, args);\n\n return {\n heights,\n avoidFirstUnitOnly: true,\n patchSplitSchema: ({ start, end, isSplit }) => {\n const range = {\n start: start === 0 ? 0 : start - 1,\n end: end - 1,\n };\n return {\n __splitRange: createTableBodySplitRange(range.start, range.end),\n __isSplit: isSplit,\n };\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"dynamicTemplate-DbxdkEGp.js","names":[],"sources":["../src/graphics/imagehelper.ts","../src/graphics/orientation.ts","../src/tables/constants.ts","../src/tables/types.ts","../src/tables/imageCell.ts","../src/tables/classes.ts","../src/tables/tableHelper.ts","../src/constants.ts","../src/tables/helper.ts","../src/tables/dynamicTemplate.ts"],"sourcesContent":["// ref: https://github.com/image-size/image-size ----------------------------\n// The following code is adapted from the image-size code. Unnecessary formats and dependencies on Node have been removed.\nimport { Buffer } from 'buffer';\n\ntype IImage = {\n validate: (input: Uint8Array) => boolean;\n calculate: (input: Uint8Array) => { width: number; height: number } | undefined;\n};\n\nconst decoder = new TextDecoder();\nconst toUTF8String = (input: Uint8Array, start = 0, end = input.length) =>\n decoder.decode(input.slice(start, end));\n\nconst toHexString = (input: Uint8Array, start = 0, end = input.length) =>\n input.slice(start, end).reduce((memo, i) => memo + ('0' + i.toString(16)).slice(-2), '');\n\nconst readUInt16BE = (input: Uint8Array, offset = 0) => input[offset] * 2 ** 8 + input[offset + 1];\n\nconst readUInt32BE = (input: Uint8Array, offset = 0) =>\n input[offset] * 2 ** 24 +\n input[offset + 1] * 2 ** 16 +\n input[offset + 2] * 2 ** 8 +\n input[offset + 3];\n\nconst extractSize = (input: Uint8Array, index: number) => {\n return {\n height: readUInt16BE(input, index),\n width: readUInt16BE(input, index + 2),\n };\n};\n\nconst validateInput = (input: Uint8Array, index: number): void => {\n // index should be within buffer limits\n if (index > input.length) {\n throw new TypeError('Corrupt JPG, exceeded buffer limits');\n }\n // Every JPEG block must begin with a 0xFF\n if (input[index] !== 0xff) {\n throw new TypeError('Invalid JPG, marker table corrupted');\n }\n};\n\nconst JPG: IImage = {\n validate: (input) => toHexString(input, 0, 2) === 'ffd8',\n\n calculate(input) {\n // Skip 4 chars, they are for signature\n input = input.slice(4);\n\n let next: number;\n while (input.length) {\n // read length of the next block\n const i = readUInt16BE(input, 0);\n\n // ensure correct format\n validateInput(input, i);\n\n // 0xFFC0 is baseline standard(SOF)\n // 0xFFC1 is baseline optimized(SOF)\n // 0xFFC2 is progressive(SOF2)\n next = input[i + 1];\n if (next === 0xc0 || next === 0xc1 || next === 0xc2) {\n const size = extractSize(input, i + 5);\n\n return size;\n }\n\n // move to the next block\n input = input.slice(i + 2);\n }\n\n throw new TypeError('Invalid JPG, no size found');\n },\n};\n\nconst pngSignature = 'PNG\\r\\n\\x1a\\n';\nconst pngImageHeaderChunkName = 'IHDR';\n\n// Used to detect \"fried\" png's: http://www.jongware.com/pngdefry.html\nconst pngFriedChunkName = 'CgBI';\n\nconst PNG: IImage = {\n validate(input) {\n if (pngSignature === toUTF8String(input, 1, 8)) {\n let chunkName = toUTF8String(input, 12, 16);\n if (chunkName === pngFriedChunkName) {\n chunkName = toUTF8String(input, 28, 32);\n }\n if (chunkName !== pngImageHeaderChunkName) {\n throw new TypeError('Invalid PNG');\n }\n return true;\n }\n return false;\n },\n\n calculate(input) {\n if (toUTF8String(input, 12, 16) === pngFriedChunkName) {\n return {\n height: readUInt32BE(input, 36),\n width: readUInt32BE(input, 32),\n };\n }\n return {\n height: readUInt32BE(input, 20),\n width: readUInt32BE(input, 16),\n };\n },\n};\n\nconst typeHandlers = {\n jpg: JPG,\n png: PNG,\n};\n\ntype ImageKind = keyof typeof typeHandlers;\n\nfunction detector(input: Uint8Array): ImageKind | undefined {\n const firstBytes: { [byte: number]: ImageKind } = {\n 0x89: 'png',\n 0xff: 'jpg',\n };\n const byte = input[0];\n if (byte in firstBytes) {\n const type = firstBytes[byte];\n if (type && typeHandlers[type].validate(input)) {\n return type;\n }\n }\n\n const keys = Object.keys(typeHandlers) as ImageKind[];\n return keys.find((key: ImageKind) => typeHandlers[key].validate(input));\n}\n\n/**\n * FNV-1a 32-bit fingerprint of an image data URL.\n * Image embed cache keys are `${type}:${length}:${hash}` and must keep this hash.\n */\nexport const hashImageDataUrl = (value: string): string => {\n let hash = 0x811c9dc5;\n for (let i = 0; i < value.length; i++) {\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n};\n\nexport const getImageDimension = (\n value: string | Uint8Array,\n): { height: number; width: number } => {\n if (typeof value !== 'string') {\n return imageSize(Buffer.from(value));\n }\n const dataUriPrefix = ';base64,';\n const idx = value.indexOf(dataUriPrefix);\n const imgBase64 = value.substring(idx + dataUriPrefix.length, value.length);\n return imageSize(Buffer.from(imgBase64, 'base64'));\n};\n\nconst imageSize = (imgBuffer: Buffer): { height: number; width: number } => {\n const type = detector(imgBuffer);\n\n if (typeof type !== 'undefined' && type in typeHandlers) {\n const size = typeHandlers[type].calculate(imgBuffer);\n if (size !== undefined) {\n return size;\n }\n }\n\n throw new TypeError(\n '[@pdfme/schemas/images] Unsupported file type: ' + (type === undefined ? 'undefined' : type),\n );\n};\n// ----------------------------\n","import jpegJsModule from 'jpeg-js';\nimport UPNGModule from '@pdf-lib/upng';\n\nexport type ImageFormat = 'jpeg' | 'png' | 'other';\n\ntype JpegJsApi = {\n decode: (\n data: Uint8Array,\n opts?: {\n useTArray?: boolean;\n formatAsRGBA?: boolean;\n maxMemoryUsageInMB?: number;\n },\n ) => { data: Uint8Array; width: number; height: number };\n encode: (\n img: { data: Uint8Array; width: number; height: number },\n quality: number,\n ) => { data: Uint8Array };\n};\n\ntype DecodedPng = { width: number; height: number };\n\ntype UPNGApi = {\n decode: (input: ArrayBuffer) => DecodedPng;\n toRGBA8: (decoded: DecodedPng) => ArrayBuffer[];\n encode: (\n bufs: ArrayBuffer[],\n width: number,\n height: number,\n cnum: number,\n ) => ArrayBuffer | Uint8Array;\n};\n\nconst isJpegJsApi = (value: unknown): value is JpegJsApi =>\n !!value &&\n typeof value === 'object' &&\n typeof (value as JpegJsApi).decode === 'function' &&\n typeof (value as JpegJsApi).encode === 'function';\n\nconst isUPNGApi = (value: unknown): value is UPNGApi =>\n !!value &&\n typeof value === 'object' &&\n typeof (value as UPNGApi).decode === 'function' &&\n typeof (value as UPNGApi).toRGBA8 === 'function' &&\n typeof (value as UPNGApi).encode === 'function';\n\nconst resolveExport = <T>(\n value: unknown,\n guard: (candidate: unknown) => candidate is T,\n label: string,\n): T => {\n let current: unknown = value;\n while (current && typeof current === 'object') {\n if (guard(current)) return current;\n current = (current as { default?: unknown }).default;\n }\n throw new TypeError(`Failed to resolve ${label} exports`);\n};\n\nconst jpegJs = resolveExport(jpegJsModule, isJpegJsApi, 'jpeg-js');\nconst UPNG = resolveExport(UPNGModule, isUPNGApi, '@pdf-lib/upng');\n\nconst JPEG_ENCODE_QUALITY = 90;\nconst JPEG_MAX_MEMORY_MB = 512;\n\nconst JPEG_SOI_0 = 0xff;\nconst JPEG_SOI_1 = 0xd8;\nconst PNG_SIGNATURE = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n\nconst toArrayBuffer = (bytes: Uint8Array): ArrayBuffer => {\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer;\n};\n\nconst isPngSignature = (bytes: Uint8Array): boolean => {\n if (bytes.length < PNG_SIGNATURE.length) return false;\n for (let i = 0; i < PNG_SIGNATURE.length; i++) {\n if (bytes[i] !== PNG_SIGNATURE[i]) return false;\n }\n return true;\n};\n\nexport const detectImageFormat = (bytes: Uint8Array): ImageFormat => {\n if (bytes.length >= 2 && bytes[0] === JPEG_SOI_0 && bytes[1] === JPEG_SOI_1) {\n return 'jpeg';\n }\n if (isPngSignature(bytes)) {\n return 'png';\n }\n return 'other';\n};\n\n/** TIFF/IFD0: returns 1..8 or undefined. Never throws. */\nexport const parseTiffOrientation = (tiff: Uint8Array): number | undefined => {\n try {\n if (tiff.length < 8) return undefined;\n const le = tiff[0] === 0x49 && tiff[1] === 0x49; // 'II'\n if (!le && !(tiff[0] === 0x4d && tiff[1] === 0x4d)) return undefined; // 'MM'\n const view = new DataView(tiff.buffer, tiff.byteOffset, tiff.byteLength);\n if (view.getUint16(2, le) !== 42) return undefined;\n const ifd = view.getUint32(4, le);\n if (ifd + 2 > tiff.length) return undefined;\n const n = view.getUint16(ifd, le);\n for (let i = 0; i < n; i++) {\n const entry = ifd + 2 + i * 12;\n if (entry + 12 > tiff.length) return undefined;\n if (view.getUint16(entry, le) !== 0x0112) continue;\n if (view.getUint16(entry + 2, le) !== 3) return undefined; // SHORT\n if (view.getUint32(entry + 4, le) !== 1) return undefined;\n const val = view.getUint16(entry + 8, le);\n return val >= 1 && val <= 8 ? val : undefined;\n }\n return undefined;\n } catch {\n return undefined;\n }\n};\n\nconst isExifApp1Payload = (segment: Uint8Array): boolean =>\n segment.length >= 6 &&\n segment[0] === 0x45 &&\n segment[1] === 0x78 &&\n segment[2] === 0x69 &&\n segment[3] === 0x66 &&\n segment[4] === 0 &&\n segment[5] === 0;\n\n/** Standalone JPEG markers have no length field (TEM, RST0–7, SOI). */\nconst isStandaloneJpegMarker = (marker: number): boolean =>\n marker === 0x01 || (marker >= 0xd0 && marker <= 0xd8);\n\n/**\n * JPEG: scan APP1 'Exif\\0\\0' segments; stop at SOS/EOI.\n * Skips 0xFF fill/padding and standalone markers. If an Exif APP1 has no\n * valid Orientation, keep scanning for a later one.\n */\nexport const getJpegOrientation = (bytes: Uint8Array): number | undefined => {\n if (bytes.length < 2 || bytes[0] !== JPEG_SOI_0 || bytes[1] !== JPEG_SOI_1) return undefined;\n let pos = 2;\n while (pos < bytes.length) {\n if (bytes[pos] !== 0xff) return undefined;\n while (pos < bytes.length && bytes[pos] === 0xff) pos++;\n if (pos >= bytes.length) return undefined;\n const marker = bytes[pos++];\n if (isStandaloneJpegMarker(marker)) continue;\n if (marker === 0xda || marker === 0xd9) return undefined; // SOS/EOI\n if (pos + 2 > bytes.length) return undefined;\n const size = (bytes[pos] << 8) | bytes[pos + 1];\n if (size < 2 || pos + size > bytes.length) return undefined;\n if (marker === 0xe1 && size >= 8) {\n const segment = bytes.subarray(pos + 2, pos + size);\n if (isExifApp1Payload(segment)) {\n const orientation = parseTiffOrientation(segment.subarray(6));\n if (orientation !== undefined) return orientation;\n }\n }\n pos += size;\n }\n return undefined;\n};\n\n/**\n * PNG: scan chunks for eXIf (raw TIFF payload). Skip IDAT and other\n * ancillary chunks; eXIf may appear after image data. Stop at IEND.\n */\nexport const getPngOrientation = (bytes: Uint8Array): number | undefined => {\n if (!isPngSignature(bytes)) return undefined;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n let pos = 8;\n while (pos + 12 <= bytes.length) {\n const length = view.getUint32(pos);\n if (pos + 12 + length > bytes.length) return undefined;\n const type = String.fromCharCode(\n bytes[pos + 4],\n bytes[pos + 5],\n bytes[pos + 6],\n bytes[pos + 7],\n );\n if (type === 'eXIf') {\n return parseTiffOrientation(bytes.subarray(pos + 8, pos + 8 + length));\n }\n if (type === 'IEND') return undefined;\n pos += 12 + length;\n }\n return undefined;\n};\n\nexport const orientationSwapsDimensions = (orientation: number) => orientation >= 5;\n\n/**\n * Map source (x, y) into destination (dx, dy) for EXIF orientations 2–8.\n * Orientations 5–8 swap width and height.\n */\nexport const transformRgba = (\n src: Uint8Array,\n width: number,\n height: number,\n orientation: number,\n): { data: Uint8Array; width: number; height: number } => {\n const swap = orientationSwapsDimensions(orientation);\n const destWidth = swap ? height : width;\n const destHeight = swap ? width : height;\n const dest = new Uint8Array(destWidth * destHeight * 4);\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n let dx = x;\n let dy = y;\n switch (orientation) {\n case 2:\n dx = width - 1 - x;\n dy = y;\n break;\n case 3:\n dx = width - 1 - x;\n dy = height - 1 - y;\n break;\n case 4:\n dx = x;\n dy = height - 1 - y;\n break;\n case 5:\n dx = y;\n dy = x;\n break;\n case 6:\n dx = height - 1 - y;\n dy = x;\n break;\n case 7:\n dx = height - 1 - y;\n dy = width - 1 - x;\n break;\n case 8:\n dx = y;\n dy = width - 1 - x;\n break;\n default:\n break;\n }\n const srcIndex = (y * width + x) * 4;\n const destIndex = (dy * destWidth + dx) * 4;\n dest[destIndex] = src[srcIndex];\n dest[destIndex + 1] = src[srcIndex + 1];\n dest[destIndex + 2] = src[srcIndex + 2];\n dest[destIndex + 3] = src[srcIndex + 3];\n }\n }\n\n return { data: dest, width: destWidth, height: destHeight };\n};\n\nconst bakeJpegOrientation = (bytes: Uint8Array): Uint8Array => {\n const orientation = getJpegOrientation(bytes);\n if (!orientation || orientation === 1) return bytes;\n const raw = jpegJs.decode(bytes, {\n useTArray: true,\n formatAsRGBA: true,\n maxMemoryUsageInMB: JPEG_MAX_MEMORY_MB,\n });\n const transformed = transformRgba(raw.data, raw.width, raw.height, orientation);\n return new Uint8Array(\n jpegJs.encode(\n { data: transformed.data, width: transformed.width, height: transformed.height },\n JPEG_ENCODE_QUALITY,\n ).data,\n );\n};\n\nconst bakePngOrientation = (bytes: Uint8Array): Uint8Array => {\n const orientation = getPngOrientation(bytes);\n if (!orientation || orientation === 1) return bytes;\n const img = UPNG.decode(toArrayBuffer(bytes));\n const rgba = new Uint8Array(UPNG.toRGBA8(img)[0]);\n const transformed = transformRgba(rgba, img.width, img.height, orientation);\n return new Uint8Array(\n UPNG.encode([toArrayBuffer(transformed.data)], transformed.width, transformed.height, 0),\n );\n};\n\n/**\n * One normalize path for JPEG and PNG. Tag absent/1 is a byte-identical\n * passthrough. Tag 2–8 decodes, transforms pixels, and re-encodes without\n * an orientation tag. May throw on decode/encode failure — callers fall back.\n */\nexport const normalizeImageOrientation = (bytes: Uint8Array): Uint8Array => {\n const kind = detectImageFormat(bytes);\n if (kind === 'jpeg') return bakeJpegOrientation(bytes);\n if (kind === 'png') return bakePngOrientation(bytes);\n return bytes;\n};\n","import type { TableImageHeightMode } from './types.js';\n\nexport const DEFAULT_TABLE_IMAGE_HEIGHT = 20;\nexport const DEFAULT_TABLE_IMAGE_HEIGHT_MODE: TableImageHeightMode = 'fixed';\n// PNG and JPEG data URLs only. gif/webp/svg/http and bare strings are not images.\nexport const TABLE_IMAGE_DATA_URL_PATTERN = /^data:image\\/(png|jpe?g);base64,/i;\n// Page breaks keep 0.5mm of slack. The auto cap is larger so a row at the limit\n// is not flush with that check, where float error reads an exact fit as overflow.\nexport const TABLE_IMAGE_AUTO_SAFETY_MARGIN = 1;\n","import type { ALIGNMENT, VERTICAL_ALIGNMENT } from '../text/types.js';\nimport type { BoxDimension } from '../box.js';\nimport type { Schema } from '@pdfme/common';\n\nexport const TABLE_CELL_TYPES = ['text', 'image'] as const;\nexport type TableCellType = (typeof TABLE_CELL_TYPES)[number];\nexport const TABLE_IMAGE_HEIGHT_MODES = ['fixed', 'auto'] as const;\nexport type TableImageHeightMode = (typeof TABLE_IMAGE_HEIGHT_MODES)[number];\n\nexport type Spacing = BoxDimension;\ntype BorderInsets = Spacing;\ntype BoxDimensions = Spacing;\n\nexport interface CellStyle {\n fontName?: string;\n alignment: ALIGNMENT;\n verticalAlignment: VERTICAL_ALIGNMENT;\n fontSize: number;\n lineHeight: number;\n characterSpacing: number;\n fontColor: string;\n backgroundColor: string;\n borderColor: string;\n borderWidth: BoxDimensions;\n padding: BoxDimensions;\n}\n\nexport type CellSchema = Schema &\n CellStyle & {\n cellType?: TableCellType;\n imageHeightMode?: TableImageHeightMode;\n imageHeight?: number;\n columnIndex?: number;\n rowIndex?: number;\n // Render-only identity of the table being painted. Not stored on the template.\n pickerSchemaKey?: string;\n };\n\nexport type TableSchema = Schema & {\n showHead: boolean;\n head: string[];\n headWidthPercentages: number[];\n repeatHead?: boolean;\n\n tableStyles: {\n borderColor: string;\n borderWidth: number;\n };\n headStyles: CellStyle;\n bodyStyles: CellStyle & { alternateBackgroundColor: string };\n columnStyles: {\n alignment?: { [colIndex: number]: ALIGNMENT };\n verticalAlignment?: { [colIndex: number]: VERTICAL_ALIGNMENT };\n cellType?: { [colIndex: number]: TableCellType };\n imageHeightMode?: { [colIndex: number]: TableImageHeightMode };\n imageHeight?: { [colIndex: number]: number };\n };\n};\n\nexport interface Styles {\n fontName: string | undefined;\n backgroundColor: string;\n textColor: string;\n lineHeight: number;\n characterSpacing: number;\n alignment: 'left' | 'center' | 'right' | 'justify';\n verticalAlignment: 'top' | 'middle' | 'bottom';\n fontSize: number;\n cellPadding: Spacing;\n lineColor: string;\n lineWidth: BorderInsets;\n cellWidth: number;\n minCellHeight: number;\n minCellWidth: number;\n cellType?: TableCellType;\n imageHeightMode?: TableImageHeightMode;\n imageHeight?: number;\n}\n\nexport interface TableInput {\n settings: Settings;\n styles: StylesProps;\n content: ContentInput;\n}\n\ninterface ContentInput {\n body: string[][];\n head: string[][];\n columns: number[];\n}\n\nexport interface Settings {\n startY: number;\n margin: Spacing;\n tableWidth: number;\n showHead: boolean;\n // Template showHead before a split segment hides the header. Auto image limits\n // use this so planning and drawing stay on the same row height.\n templateShowHead: boolean;\n tableLineWidth: number;\n tableLineColor: string;\n}\n\nexport interface StylesProps {\n styles: Partial<Styles>;\n headStyles: Partial<Styles>;\n bodyStyles: Partial<Styles>;\n alternateRowStyles: Partial<Styles>;\n columnStyles: { [key: string]: Partial<Styles> };\n}\n\nexport type Section = 'head' | 'body';\n","import { Buffer } from 'buffer';\nimport { hashImageDataUrl, getImageDimension } from '../graphics/imagehelper.js';\nimport {\n detectImageFormat,\n getJpegOrientation,\n getPngOrientation,\n orientationSwapsDimensions,\n} from '../graphics/orientation.js';\nimport type { ImageObjectPosition } from '../graphics/image.js';\nimport type { ALIGNMENT, VERTICAL_ALIGNMENT } from '../text/types.js';\nimport {\n DEFAULT_TABLE_IMAGE_HEIGHT,\n DEFAULT_TABLE_IMAGE_HEIGHT_MODE,\n TABLE_IMAGE_DATA_URL_PATTERN,\n} from './constants.js';\nimport { TABLE_CELL_TYPES, type TableCellType, type TableImageHeightMode } from './types.js';\n\nexport type TableImageDimension = { width: number; height: number };\n\nconst DIMENSION_CACHE_PREFIX = 'tableImageDim:';\nconst WARN_CACHE_PREFIX = 'tableImageWarned:';\nconst FAILED_DIMENSION = null;\n\nconst isTableCellType = (value: unknown): value is TableCellType =>\n typeof value === 'string' && TABLE_CELL_TYPES.some((cellType) => cellType === value);\n\nconst isDimension = (value: unknown): value is TableImageDimension => {\n if (!value || typeof value !== 'object') return false;\n const record = value as Record<string, unknown>;\n return typeof record.width === 'number' && typeof record.height === 'number';\n};\n\nconst dataUrlToBytes = (value: string): Uint8Array => {\n const marker = ';base64,';\n const index = value.indexOf(marker);\n const base64 = index >= 0 ? value.slice(index + marker.length) : value;\n return new Uint8Array(Buffer.from(base64, 'base64'));\n};\n\nconst applyOrientation = (\n dimension: TableImageDimension,\n bytes: Uint8Array,\n): TableImageDimension => {\n const format = detectImageFormat(bytes);\n const orientation =\n format === 'jpeg'\n ? getJpegOrientation(bytes)\n : format === 'png'\n ? getPngOrientation(bytes)\n : undefined;\n // image.pdf bakes EXIF into the embedded pixels, so measurement has to swap too.\n if (orientation !== undefined && orientationSwapsDimensions(orientation)) {\n return { width: dimension.height, height: dimension.width };\n }\n return dimension;\n};\n\nexport const isTableImageDataUrl = (value: string): boolean =>\n TABLE_IMAGE_DATA_URL_PATTERN.test(value);\n\nconst imageCacheSuffix = (value: string) => `${value.length}:${hashImageDataUrl(value)}`;\n\nexport const resolveImageDimension = (\n value: string,\n cache: Map<string | number, unknown>,\n): TableImageDimension | undefined => {\n if (!isTableImageDataUrl(value)) return undefined;\n const key = `${DIMENSION_CACHE_PREFIX}${imageCacheSuffix(value)}`;\n const cached = cache.get(key);\n if (cached === FAILED_DIMENSION) return undefined;\n if (isDimension(cached)) return cached;\n try {\n const bytes = dataUrlToBytes(value);\n const dimension = applyOrientation(getImageDimension(bytes), bytes);\n cache.set(key, dimension);\n return dimension;\n } catch {\n cache.set(key, FAILED_DIMENSION);\n return undefined;\n }\n};\n\nexport const warnInvalidTableImageOnce = (\n value: string | null | undefined,\n columnIndex: number,\n cache: Map<string | number, unknown>,\n) => {\n if (value == null || value === '') return;\n const key = `${WARN_CACHE_PREFIX}${imageCacheSuffix(value)}`;\n if (cache.has(key)) return;\n cache.set(key, true);\n console.warn(\n `[@pdfme/schemas/table] unsupported image in column ${columnIndex}; only PNG/JPEG data URL is supported`,\n );\n};\n\nexport const normalizeTableCellType = (\n value: unknown,\n columnIndex: number,\n cache: Map<string | number, unknown>,\n): TableCellType | undefined => {\n // null is unsupported and stays text, without a warning.\n if (value == null) return undefined;\n if (isTableCellType(value)) return value;\n const warnKey = `tableCellTypeWarned:${String(value)}`;\n if (!cache.has(warnKey)) {\n cache.set(warnKey, true);\n console.warn(\n `[@pdfme/schemas/table] unsupported cell type \"${String(value)}\" in column ${columnIndex}; treating as text`,\n );\n }\n return 'text';\n};\n\nexport const normalizeTableImageHeightMode = (value: unknown): TableImageHeightMode | undefined =>\n value === 'fixed' || value === 'auto' ? value : undefined;\n\nexport const normalizeTableImageHeight = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n\nexport const getTableImageObjectPosition = (\n alignment: ALIGNMENT | undefined,\n verticalAlignment: VERTICAL_ALIGNMENT | undefined,\n): ImageObjectPosition => {\n const horizontal = alignment === 'center' || alignment === 'right' ? alignment : 'left';\n const vertical =\n verticalAlignment === 'top' ? 'top' : verticalAlignment === 'bottom' ? 'bottom' : 'center';\n return `${horizontal} ${vertical}`;\n};\n\nexport const resolveFixedTableImageHeight = (imageHeight: number | undefined): number =>\n typeof imageHeight === 'number' && Number.isFinite(imageHeight) && imageHeight > 0\n ? imageHeight\n : DEFAULT_TABLE_IMAGE_HEIGHT;\n\n/**\n * Fixed height is kept for empty and invalid values so rows in the column stay aligned.\n * Auto height is 0 unless a PNG/JPEG data URL resolves.\n */\nexport const resolveTableImageContentHeight = (arg: {\n value: string;\n mode: TableImageHeightMode | undefined;\n imageHeight: number | undefined;\n contentWidth: number;\n columnIndex: number;\n cache: Map<string | number, unknown>;\n}): number => {\n const mode = arg.mode ?? DEFAULT_TABLE_IMAGE_HEIGHT_MODE;\n if (!arg.value) {\n return mode === 'auto' ? 0 : resolveFixedTableImageHeight(arg.imageHeight);\n }\n const dimension = resolveImageDimension(arg.value, arg.cache);\n if (!dimension || dimension.width <= 0) {\n warnInvalidTableImageOnce(arg.value, arg.columnIndex, arg.cache);\n return mode === 'auto' ? 0 : resolveFixedTableImageHeight(arg.imageHeight);\n }\n if (mode === 'auto') {\n return (arg.contentWidth * dimension.height) / dimension.width;\n }\n return resolveFixedTableImageHeight(arg.imageHeight);\n};\n","import { Font, isBlankPdf, mm2pt, pt2mm, type BasePdf } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { getBoxContentArea, getBoxVerticalInset, type BoxStyleSchema } from '../box.js';\nimport { splitTextToSize, getFontKitFont, widthOfTextAtSize } from '../text/helper.js';\nimport { DEFAULT_TABLE_IMAGE_HEIGHT_MODE, TABLE_IMAGE_AUTO_SAFETY_MARGIN } from './constants.js';\nimport { resolveTableImageContentHeight } from './imageCell.js';\nimport type { Styles, TableInput, Settings, Section, StylesProps } from './types.js';\n\ntype ContentSettings = { body: Row[]; head: Row[]; columns: Column[] };\n\nexport class Cell {\n raw: string;\n text: string[];\n styles: Styles;\n section: Section;\n contentHeight = 0;\n contentWidth = 0;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n imageContentHeight = 0;\n\n width = 0;\n height = 0;\n x = 0;\n y = 0;\n\n constructor(raw: string, styles: Styles, section: Section) {\n this.styles = styles;\n this.section = section;\n this.raw = raw;\n const splitRegex = /\\r\\n|\\r|\\n/g;\n this.text = raw.split(splitRegex);\n }\n\n isImage() {\n return this.section !== 'head' && this.styles.cellType === 'image';\n }\n\n getContentHeight() {\n const verticalInset = getBoxVerticalInset(getCellBoxStyle(this));\n if (this.isImage()) {\n return Math.max(this.imageContentHeight + verticalInset, this.styles.minCellHeight);\n }\n const lineCount = Array.isArray(this.text) ? this.text.length : 1;\n const lineHeight = pt2mm(this.styles.fontSize) * this.styles.lineHeight;\n const height = lineCount * lineHeight + verticalInset;\n return Math.max(height, this.styles.minCellHeight);\n }\n\n padding(name: 'top' | 'bottom' | 'left' | 'right') {\n return this.styles.cellPadding[name];\n }\n}\n\nconst getCellBoxStyle = (cell: Cell): BoxStyleSchema => ({\n padding: cell.styles.cellPadding,\n borderWidth: cell.styles.lineWidth,\n});\n\nexport class Column {\n index: number;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n width = 0;\n\n constructor(index: number) {\n this.index = index;\n }\n\n getMaxCustomCellWidth(table: Table) {\n let max = 0;\n for (const row of table.allRows()) {\n const cell: Cell = row.cells[this.index];\n max = Math.max(max, cell.styles.cellWidth);\n }\n return max;\n }\n}\n\nexport class Row {\n readonly raw: string[];\n readonly index: number;\n readonly section: Section;\n readonly cells: { [key: string]: Cell };\n\n height = 0;\n\n constructor(raw: string[], index: number, section: Section, cells: { [key: string]: Cell }) {\n this.raw = raw;\n this.index = index;\n this.section = section;\n this.cells = cells;\n }\n\n getMaxCellHeight(columns: Column[]) {\n return columns.reduce((acc, column) => Math.max(acc, this.cells[column.index]?.height || 0), 0);\n }\n\n getMinimumRowHeight(columns: Column[]) {\n return columns.reduce((acc: number, column: Column) => {\n const cell = this.cells[column.index];\n if (!cell) return 0;\n const vPadding = cell.padding('top') + cell.padding('bottom');\n const oneRowHeight = vPadding + cell.styles.lineHeight;\n return oneRowHeight > acc ? oneRowHeight : acc;\n }, 0);\n }\n}\n\nexport class Table {\n readonly settings: Settings;\n readonly styles: StylesProps;\n\n readonly columns: Column[];\n readonly head: Row[];\n readonly body: Row[];\n\n constructor(input: TableInput, content: ContentSettings) {\n this.settings = input.settings;\n this.styles = input.styles;\n\n this.columns = content.columns;\n this.head = content.head;\n this.body = content.body;\n }\n\n static async create(arg: {\n input: TableInput;\n content: ContentSettings;\n font: Font;\n basePdf: BasePdf;\n _cache: Map<string | number, unknown>;\n }) {\n const { input, content, font, basePdf, _cache } = arg;\n const table = new Table(input, content);\n\n await calculateWidths({ table, font, basePdf, _cache });\n\n return table;\n }\n\n getHeadHeight() {\n return this.head.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n getBodyHeight() {\n return this.body.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n allRows() {\n return this.head.concat(this.body);\n }\n\n getWidth() {\n return this.settings.tableWidth;\n }\n\n getHeight() {\n return (this.settings.showHead ? this.getHeadHeight() : 0) + this.getBodyHeight();\n }\n}\n\nasync function calculateWidths(arg: {\n table: Table;\n font: Font;\n basePdf: BasePdf;\n _cache: Map<string | number, unknown>;\n}) {\n const { table, font, basePdf, _cache } = arg;\n\n const getFontKitFontByFontName = (fontName: string | undefined) =>\n getFontKitFont(fontName, font, _cache as Map<string | number, FontKitFont>);\n\n await calculate(table, getFontKitFontByFontName);\n\n const resizableColumns: Column[] = [];\n let initialTableWidth = 0;\n\n table.columns.forEach((column) => {\n const customWidth = column.getMaxCustomCellWidth(table);\n if (customWidth) {\n // final column width\n column.width = customWidth;\n } else {\n // initial column width (will be resized)\n column.width = column.wrappedWidth;\n resizableColumns.push(column);\n }\n initialTableWidth += column.width;\n });\n\n // width difference that needs to be distributed\n let resizeWidth = table.getWidth() - initialTableWidth;\n\n // first resize attempt: with respect to minReadableWidth and minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) =>\n Math.max(column.minReadableWidth, column.minWidth),\n );\n }\n\n // second resize attempt: ignore minReadableWidth but respect minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) => column.minWidth);\n }\n\n resizeWidth = Math.abs(resizeWidth);\n\n applyColSpans(table);\n await fitContent(table, getFontKitFontByFontName, basePdf, _cache);\n applyRowSpans(table);\n}\n\nfunction applyRowSpans(table: Table) {\n const rowSpanCells: {\n [key: string]: { cell: Cell; left: number; row: Row };\n } = {};\n let colRowSpansLeft = 1;\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n for (const column of table.columns) {\n const data = rowSpanCells[column.index];\n if (colRowSpansLeft > 1) {\n colRowSpansLeft--;\n delete row.cells[column.index];\n } else if (data) {\n data.cell.height += row.height;\n colRowSpansLeft = 1;\n delete row.cells[column.index];\n data.left--;\n if (data.left <= 1) {\n delete rowSpanCells[column.index];\n }\n } else {\n const cell = row.cells[column.index];\n if (!cell) {\n continue;\n }\n cell.height = row.height;\n }\n }\n }\n}\n\nfunction applyColSpans(table: Table) {\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n\n let colSpanCell = null;\n let combinedColSpanWidth = 0;\n let colSpansLeft = 0;\n for (let columnIndex = 0; columnIndex < table.columns.length; columnIndex++) {\n const column = table.columns[columnIndex];\n\n // Width and colspan\n colSpansLeft -= 1;\n if (colSpansLeft > 1 && table.columns[columnIndex + 1]) {\n combinedColSpanWidth += column.width;\n delete row.cells[column.index];\n } else if (colSpanCell) {\n const cell: Cell = colSpanCell;\n delete row.cells[column.index];\n colSpanCell = null;\n cell.width = column.width + combinedColSpanWidth;\n } else {\n const cell = row.cells[column.index];\n if (!cell) continue;\n colSpansLeft = 1;\n combinedColSpanWidth = 0;\n cell.width = column.width + combinedColSpanWidth;\n }\n }\n }\n}\n\nconst autoImageHeightLimit = (table: Table, cell: Cell, basePdf: BasePdf): number | undefined => {\n // Custom base PDFs are not reflowed, so an auto image may be taller than one page.\n if (!isBlankPdf(basePdf)) return undefined;\n const [paddingTop, , paddingBottom] = basePdf.padding;\n const pageContentHeight = basePdf.height - paddingTop - paddingBottom;\n // cell.height is assigned after fit, so the in-progress head size is the row height.\n // Split segments may hide the header; the cap still follows the template showHead.\n const headHeight = table.settings.templateShowHead\n ? table.head.reduce((sum, row) => sum + row.height, 0)\n : 0;\n const verticalInset = getBoxVerticalInset(getCellBoxStyle(cell));\n return pageContentHeight - headHeight - verticalInset - TABLE_IMAGE_AUTO_SAFETY_MARGIN;\n};\n\nasync function fitContent(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n basePdf: BasePdf,\n cache: Map<string | number, unknown>,\n) {\n const rowSpanHeight = { count: 0, height: 0 };\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell: Cell = row.cells[column.index];\n if (!cell) continue;\n\n const contentArea = getBoxContentArea({\n position: { x: 0, y: 0 },\n width: cell.width,\n height: cell.height,\n ...getCellBoxStyle(cell),\n });\n if (cell.isImage()) {\n cell.text = [];\n let imageContentHeight = resolveTableImageContentHeight({\n value: cell.raw,\n mode: cell.styles.imageHeightMode,\n imageHeight: cell.styles.imageHeight,\n contentWidth: contentArea.width,\n columnIndex: column.index,\n cache,\n });\n if ((cell.styles.imageHeightMode ?? DEFAULT_TABLE_IMAGE_HEIGHT_MODE) === 'auto') {\n const limit = autoImageHeightLimit(table, cell, basePdf);\n if (limit !== undefined) {\n imageContentHeight = Math.min(imageContentHeight, Math.max(0, limit));\n }\n }\n cell.imageContentHeight = imageContentHeight;\n } else {\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n cell.text = splitTextToSize({\n value: cell.raw,\n characterSpacing: cell.styles.characterSpacing,\n boxWidthInPt: mm2pt(contentArea.width),\n fontSize: cell.styles.fontSize,\n fontKitFont,\n });\n }\n\n cell.contentHeight = cell.getContentHeight();\n\n let realContentHeight = cell.contentHeight;\n if (rowSpanHeight && rowSpanHeight.count > 0) {\n if (rowSpanHeight.height > realContentHeight) {\n realContentHeight = rowSpanHeight.height;\n }\n }\n if (realContentHeight > row.height) {\n row.height = realContentHeight;\n }\n }\n rowSpanHeight.count--;\n }\n}\n\nfunction resizeColumns(\n columns: Column[],\n resizeWidth: number,\n getMinWidth: (column: Column) => number,\n) {\n const initialResizeWidth = resizeWidth;\n const sumWrappedWidth = columns.reduce((acc, column) => acc + column.wrappedWidth, 0);\n\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n\n const ratio = column.wrappedWidth / sumWrappedWidth;\n const suggestedChange = initialResizeWidth * ratio;\n const suggestedWidth = column.width + suggestedChange;\n\n const minWidth = getMinWidth(column);\n const newWidth = suggestedWidth < minWidth ? minWidth : suggestedWidth;\n\n resizeWidth -= newWidth - column.width;\n column.width = newWidth;\n }\n\n resizeWidth = Math.round(resizeWidth * 1e10) / 1e10;\n\n // Run the resizer again if there's remaining width needs\n // to be distributed and there're columns that can be resized\n if (resizeWidth) {\n const resizableColumns = columns.filter((column) => {\n return resizeWidth < 0\n ? column.width > getMinWidth(column) // check if column can shrink\n : true; // check if column can grow\n });\n\n if (resizableColumns.length) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, getMinWidth);\n }\n }\n\n return resizeWidth;\n}\n\nasync function calculate(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n) {\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n if (!cell) continue;\n\n const hPadding = cell.padding('right') + cell.padding('left');\n // A data URL must not widen the column the way a long string would.\n if (cell.isImage()) {\n cell.contentWidth = hPadding;\n cell.minReadableWidth = hPadding;\n cell.minWidth = cell.styles.cellWidth;\n cell.wrappedWidth = cell.styles.cellWidth;\n continue;\n }\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n\n cell.contentWidth = getStringWidth(cell, fontKitFont) + hPadding;\n\n const longestWordWidth = getStringWidth(\n Object.assign(cell, { text: cell.text.join(' ').split(/\\s+/) }),\n fontKitFont,\n );\n cell.minReadableWidth = longestWordWidth + hPadding;\n\n cell.minWidth = cell.styles.cellWidth;\n cell.wrappedWidth = cell.styles.cellWidth;\n }\n }\n\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n\n // For now we ignore the minWidth and wrappedWidth of colspan cells when calculating colspan widths.\n // Could probably be improved upon however.\n if (cell) {\n column.wrappedWidth = Math.max(column.wrappedWidth, cell.wrappedWidth);\n column.minWidth = Math.max(column.minWidth, cell.minWidth);\n column.minReadableWidth = Math.max(column.minReadableWidth, cell.minReadableWidth);\n } else {\n // Respect cellWidth set in columnStyles even if there is no cells for this column\n // or if the column only have colspan cells. Since the width of colspan cells\n // does not affect the width of columns, setting columnStyles cellWidth enables the\n // user to at least do it manually.\n\n // Note that this is not perfect for now since for example row and table styles are\n // not accounted for\n const columnStyles = table.styles.columnStyles[column.index] || {};\n const cellWidth = columnStyles.cellWidth || columnStyles.minCellWidth;\n if (cellWidth) {\n column.minWidth = cellWidth;\n column.wrappedWidth = cellWidth;\n }\n }\n }\n }\n}\n\nfunction getStringWidth(cell: Cell, fontKitFont: FontKitFont) {\n const text = cell.text;\n const textArr: string[] = Array.isArray(text) ? text : [text];\n const fontSize = cell.styles.fontSize;\n const characterSpacing = cell.styles.characterSpacing;\n const widestLineWidth = textArr\n .map((text) => widthOfTextAtSize(text, fontKitFont, fontSize, characterSpacing))\n .reduce((a, b) => Math.max(a, b), 0);\n\n return widestLineWidth;\n}\n","import {\n Schema,\n isBlankPdf,\n BasePdf,\n CommonOptions,\n getDefaultFont,\n getFallbackFontName,\n cloneDeep,\n} from '@pdfme/common';\nimport {\n normalizeTableCellType,\n normalizeTableImageHeight,\n normalizeTableImageHeightMode,\n} from './imageCell.js';\nimport type {\n TableSchema,\n CellStyle,\n Styles,\n Spacing,\n TableInput,\n StylesProps,\n Section,\n} from './types.js';\nimport { Cell, Column, Row, Table } from './classes.js';\nimport { createBoxDimension } from '../box.js';\nimport { getTableBodyRange } from '../splitRange.js';\n\ntype StyleProp = 'styles' | 'headStyles' | 'bodyStyles' | 'alternateRowStyles' | 'columnStyles';\n\ninterface CreateTableArgs {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n}\n\ninterface UserOptions {\n startY: number;\n tableWidth: number;\n margin: Spacing;\n showHead: boolean;\n tableLineWidth?: number;\n tableLineColor?: string;\n head?: string[][];\n body?: string[][];\n\n styles?: Partial<Styles>;\n bodyStyles?: Partial<Styles>;\n headStyles?: Partial<Styles>;\n alternateRowStyles?: Partial<Styles>;\n columnStyles?: {\n [key: string]: Partial<Styles>;\n };\n}\n\nfunction parseSection(\n sectionName: Section,\n sectionRows: string[][],\n columns: Column[],\n styleProps: StylesProps,\n fallbackFontName: string,\n): Row[] {\n const rowSpansLeftForColumn: { [key: string]: { left: number; times: number } } = {};\n const result = sectionRows.map((rawRow, rowIndex) => {\n let skippedRowForRowSpans = 0;\n const cells: { [key: string]: Cell } = {};\n\n let colSpansAdded = 0;\n let columnSpansLeft = 0;\n for (const column of columns) {\n if (\n rowSpansLeftForColumn[column.index] == null ||\n rowSpansLeftForColumn[column.index].left === 0\n ) {\n if (columnSpansLeft === 0) {\n let rawCell;\n if (Array.isArray(rawRow)) {\n rawCell = rawRow[column.index - colSpansAdded - skippedRowForRowSpans];\n } else {\n rawCell = rawRow[column.index];\n }\n const styles = cellStyles(sectionName, column, rowIndex, styleProps, fallbackFontName);\n const cell = new Cell(rawCell, styles, sectionName);\n cells[column.index] = cell;\n\n columnSpansLeft = 0;\n rowSpansLeftForColumn[column.index] = {\n left: 0,\n times: columnSpansLeft,\n };\n } else {\n columnSpansLeft--;\n colSpansAdded++;\n }\n } else {\n rowSpansLeftForColumn[column.index].left--;\n columnSpansLeft = rowSpansLeftForColumn[column.index].times;\n skippedRowForRowSpans++;\n }\n }\n return new Row(rawRow, rowIndex, sectionName, cells);\n });\n return result;\n}\n\nfunction parseContent4Table(input: TableInput, fallbackFontName: string) {\n const content = input.content;\n const columns = content.columns.map((index) => new Column(index));\n const styles = input.styles;\n return {\n columns,\n head: parseSection('head', content.head, columns, styles, fallbackFontName),\n body: parseSection('body', content.body, columns, styles, fallbackFontName),\n };\n}\n\nfunction cellStyles(\n sectionName: Section,\n column: Column,\n rowIndex: number,\n styles: StylesProps,\n fallbackFontName: string,\n) {\n let sectionStyles;\n if (sectionName === 'head') {\n sectionStyles = styles.headStyles;\n } else if (sectionName === 'body') {\n sectionStyles = styles.bodyStyles;\n }\n const otherStyles = Object.assign({}, styles.styles, sectionStyles);\n\n const colStyles = styles.columnStyles[column.index] || {};\n\n const rowStyles =\n sectionName === 'body' && rowIndex % 2 === 0\n ? Object.assign({}, styles.alternateRowStyles)\n : {};\n\n const defaultStyle = {\n fontName: fallbackFontName,\n backgroundColor: '',\n textColor: '#000000',\n lineHeight: 1,\n characterSpacing: 0,\n alignment: 'left',\n verticalAlignment: 'middle',\n fontSize: 10,\n cellPadding: createBoxDimension(5),\n lineColor: '#000000',\n lineWidth: createBoxDimension(0),\n minCellHeight: 0,\n minCellWidth: 0,\n };\n return Object.assign(defaultStyle, otherStyles, rowStyles, colStyles) as Styles;\n}\n\nfunction mapCellStyle(style: CellStyle): Partial<Styles> {\n const mapping: Partial<Styles> = {\n fontName: style.fontName,\n alignment: style.alignment,\n verticalAlignment: style.verticalAlignment,\n fontSize: style.fontSize,\n lineHeight: style.lineHeight,\n characterSpacing: style.characterSpacing,\n backgroundColor: style.backgroundColor,\n // ---\n textColor: style.fontColor,\n lineColor: style.borderColor,\n lineWidth: style.borderWidth,\n cellPadding: style.padding,\n };\n return Object.fromEntries(\n Object.entries(mapping).filter(([, value]) => value !== undefined),\n ) as Partial<Styles>;\n}\n\nfunction getTableOptions(\n schema: TableSchema,\n body: string[][],\n cache: Map<string | number, unknown>,\n): UserOptions {\n const columnStylesWidth = schema.headWidthPercentages.reduce(\n (acc, cur, i) => ({ ...acc, [i]: { cellWidth: schema.width * (cur / 100) } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const alignmentMap = schema.columnStyles.alignment || {};\n const verticalAlignmentMap = schema.columnStyles.verticalAlignment || {};\n const cellTypeMap = schema.columnStyles.cellType || {};\n const imageHeightModeMap = schema.columnStyles.imageHeightMode || {};\n const imageHeightMap = schema.columnStyles.imageHeight || {};\n const columnStylesAlignment = Object.entries(alignmentMap).reduce(\n (acc, [key, value]) => ({ ...acc, [key]: { alignment: value } }),\n {} as Record<number, Partial<Styles>>,\n );\n const columnStylesVerticalAlignment = Object.entries(verticalAlignmentMap).reduce(\n (acc, [key, value]) => ({ ...acc, [key]: { verticalAlignment: value } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const allKeys = new Set([\n ...Object.keys(columnStylesWidth).map(Number),\n ...Object.keys(columnStylesAlignment).map(Number),\n ...Object.keys(columnStylesVerticalAlignment).map(Number),\n ...Object.keys(cellTypeMap).map(Number),\n ...Object.keys(imageHeightModeMap).map(Number),\n ...Object.keys(imageHeightMap).map(Number),\n ]);\n const columnStyles = Array.from(allKeys).reduce(\n (acc, key) => {\n const widthStyle = columnStylesWidth[key] || {};\n const alignmentStyle = columnStylesAlignment[key] || {};\n const verticalAlignmentStyle = columnStylesVerticalAlignment[key] || {};\n const cellType = normalizeTableCellType(cellTypeMap[key], key, cache);\n const imageHeightMode = normalizeTableImageHeightMode(imageHeightModeMap[key]);\n const imageHeight = normalizeTableImageHeight(imageHeightMap[key]);\n const imageStyle: Partial<Styles> = {\n ...(cellType ? { cellType } : {}),\n ...(imageHeightMode ? { imageHeightMode } : {}),\n ...(imageHeight !== undefined ? { imageHeight } : {}),\n };\n return {\n ...acc,\n [key]: { ...widthStyle, ...alignmentStyle, ...verticalAlignmentStyle, ...imageStyle },\n };\n },\n {} as Record<number, Partial<Styles>>,\n );\n\n return {\n head: [schema.head],\n body,\n showHead: schema.showHead,\n startY: schema.position.y,\n tableWidth: schema.width,\n tableLineColor: schema.tableStyles.borderColor,\n tableLineWidth: schema.tableStyles.borderWidth,\n headStyles: mapCellStyle(schema.headStyles),\n bodyStyles: mapCellStyle(schema.bodyStyles),\n alternateRowStyles: { backgroundColor: schema.bodyStyles.alternateBackgroundColor },\n columnStyles,\n margin: { top: 0, right: 0, left: schema.position.x, bottom: 0 },\n };\n}\n\nfunction parseStyles(cInput: UserOptions) {\n const styleOptions: StylesProps = {\n styles: {},\n headStyles: {},\n bodyStyles: {},\n alternateRowStyles: {},\n columnStyles: {},\n };\n for (const prop of Object.keys(styleOptions) as StyleProp[]) {\n if (prop === 'columnStyles') {\n const current = cInput[prop];\n styleOptions.columnStyles = Object.assign({}, current);\n } else {\n const allOptions = [cInput];\n const styles = allOptions.map((opts) => opts[prop] || {});\n styleOptions[prop] = Object.assign({}, styles[0], styles[1], styles[2]);\n }\n }\n return styleOptions;\n}\n\nfunction parseContent4Input(options: UserOptions) {\n const head = options.head || [];\n const body = options.body || [];\n const columns = (head[0] || body[0] || []).map((_, index) => index);\n return { columns, head, body };\n}\n\nfunction parseInput(\n schema: TableSchema,\n body: string[][],\n cache: Map<string | number, unknown>,\n templateShowHead: boolean,\n): TableInput {\n const options = getTableOptions(schema, body, cache);\n const styles = parseStyles(options);\n const settings = {\n startY: options.startY,\n margin: options.margin,\n tableWidth: options.tableWidth,\n showHead: options.showHead,\n templateShowHead,\n tableLineWidth: options.tableLineWidth ?? 0,\n tableLineColor: options.tableLineColor ?? '',\n };\n\n const content = parseContent4Input(options);\n\n return { content, styles, settings };\n}\n\nexport function createSingleTable(body: string[][], args: CreateTableArgs) {\n const { options, _cache, basePdf } = args;\n if (!isBlankPdf(basePdf)) {\n console.warn(\n '[@pdfme/schema/table]' +\n 'When specifying a custom PDF for basePdf, ' +\n 'you cannot use features such as page breaks or re-layout of other elements.' +\n 'To utilize these features, please define basePdf as follows:\\n' +\n '{ width: number; height: number; padding: [number, number, number, number]; }',\n );\n }\n\n const schema = cloneDeep(args.schema) as TableSchema;\n const { start } = getTableBodyRange(schema) || { start: 0 };\n if (start % 2 === 1) {\n const alternateBackgroundColor = schema.bodyStyles.alternateBackgroundColor;\n schema.bodyStyles.alternateBackgroundColor = schema.bodyStyles.backgroundColor;\n schema.bodyStyles.backgroundColor = alternateBackgroundColor;\n }\n // Captured before split segments hide the header. Auto limits must not follow that override.\n const templateShowHead = schema.showHead !== false;\n schema.showHead =\n schema.showHead === false ? false : !schema.__isSplit || schema.repeatHead === true;\n\n const input = parseInput(schema, body, _cache, templateShowHead);\n\n const font = options.font || getDefaultFont();\n\n const fallbackFontName = getFallbackFontName(font);\n\n const content = parseContent4Table(input, fallbackFontName);\n\n return Table.create({\n input,\n content,\n font,\n basePdf,\n _cache,\n });\n}\n","export const DEFAULT_OPACITY = 1;\n// Matches isHexValid in @pdfme/common: 3/4/6/8-digit hex, where 4/8-digit carry alpha.\nexport const HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{3,4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$';\n// Barcode bar/text colors are handed to bwip-js, which has no alpha support (it reads\n// 8-digit hex as CMYK and throws on 4-digit hex), so those fields stay 6-digit only.\nexport const OPAQUE_HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{6})$';\n","import {\n DEFAULT_ALIGNMENT,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n ALIGN_RIGHT,\n ALIGN_CENTER,\n ALIGN_LEFT,\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n} from '../text/constants.js';\nimport { HEX_COLOR_PATTERN } from '../constants.js';\nimport type { TableSchema } from './types.js';\nimport { getTableBodyRange } from '../splitRange.js';\nimport type { DynamicLayoutRange } from '@pdfme/common';\nimport { createBoxDimension, getBoxDimensionPropPanelSchema } from '../box.js';\n\nexport const getDefaultCellStyles = () => ({\n fontName: undefined,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: VERTICAL_ALIGN_MIDDLE,\n fontSize: DEFAULT_FONT_SIZE,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n fontColor: DEFAULT_FONT_COLOR,\n backgroundColor: '',\n borderColor: '#888888',\n borderWidth: createBoxDimension(0.1),\n padding: createBoxDimension(5),\n});\n\nexport const getCellPropPanelSchema = (arg: {\n i18n: (key: string) => string;\n fallbackFontName: string;\n fontNames: string[];\n isBody?: boolean;\n}) => {\n const { i18n, fallbackFontName, fontNames, isBody } = arg;\n\n return {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n alignment: {\n title: i18n('schemas.text.textAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.left'), value: ALIGN_LEFT },\n { label: i18n('schemas.center'), value: ALIGN_CENTER },\n { label: i18n('schemas.right'), value: ALIGN_RIGHT },\n ],\n },\n span: 8,\n },\n verticalAlignment: {\n title: i18n('schemas.text.verticalAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.top'), value: VERTICAL_ALIGN_TOP },\n { label: i18n('schemas.middle'), value: VERTICAL_ALIGN_MIDDLE },\n { label: i18n('schemas.bottom'), value: VERTICAL_ALIGN_BOTTOM },\n ],\n },\n span: 8,\n },\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n borderColor: {\n title: i18n('schemas.borderColor'),\n type: 'string',\n widget: 'color',\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n backgroundColor: {\n title: i18n('schemas.backgroundColor'),\n type: 'string',\n widget: 'color',\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n ...(isBody\n ? {\n alternateBackgroundColor: {\n title: i18n('schemas.table.alternateBackgroundColor'),\n type: 'string',\n widget: 'color',\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n }\n : {}),\n '-': { type: 'void', widget: 'Divider' },\n borderWidth: {\n title: i18n('schemas.borderWidth'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(0.1),\n },\n '--': { type: 'void', widget: 'Divider' },\n padding: {\n title: i18n('schemas.padding'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(),\n },\n };\n};\n\nexport const getBody = (value: string | string[][]): string[][] => {\n if (typeof value === 'string') {\n return JSON.parse(value || '[]') as string[][];\n }\n return value || [];\n};\n\nexport const getBodyWithRange = (value: string | string[][], range?: DynamicLayoutRange) => {\n const body = getBody(value);\n if (!range) return body;\n return body.slice(range.start, range.end);\n};\n\nexport const getBodyWithSchemaRange = (\n value: string | string[][],\n schema: TableSchema,\n range = getTableBodyRange(schema),\n) => getBodyWithRange(value, range);\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\n// Column indexes are canonical decimal keys (\"0\", \"1\", \"10\"), not \"01\" or \"1.5\".\nconst columnIndexFromKey = (key: string): number | undefined => {\n if (!/^(0|[1-9]\\d*)$/.test(key)) return undefined;\n const index = Number(key);\n return Number.isSafeInteger(index) ? index : undefined;\n};\n\n// Treat a value as a per-column map only when every key is a column index.\n// A map that mixes in any non-numeric key is left unchanged.\nconst isColumnIndexMap = (value: unknown): value is Record<string, unknown> => {\n if (!isPlainObject(value)) return false;\n return Object.keys(value).every((key) => columnIndexFromKey(key) !== undefined);\n};\n\nconst remapColumnIndexMap = (\n columnMap: Record<string, unknown>,\n removedIndex: number,\n): Record<string, unknown> => {\n const remapped: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(columnMap)) {\n const columnIndex = columnIndexFromKey(key);\n if (columnIndex === undefined || columnIndex === removedIndex) continue;\n const nextIndex = columnIndex > removedIndex ? columnIndex - 1 : columnIndex;\n remapped[nextIndex] = value;\n }\n return remapped;\n};\n\n// Per-column style maps are keyed by column index. Every map on columnStyles\n// — including keys this version does not define, such as fontName or image\n// cell settings — must drop the removed column and close the gap. Values that\n// are not column-index maps are preserved unchanged.\nexport const remapColumnStylesOnRemove = (\n columnStyles: TableSchema['columnStyles'] | null | undefined,\n removedIndex: number,\n): TableSchema['columnStyles'] => {\n if (columnStyles == null) return {};\n const source = columnStyles as Record<string, unknown>;\n const next: Record<string, unknown> = {};\n for (const [styleKey, styleValue] of Object.entries(source)) {\n next[styleKey] = isColumnIndexMap(styleValue)\n ? remapColumnIndexMap(styleValue, removedIndex)\n : styleValue;\n }\n return next as TableSchema['columnStyles'];\n};\n","import {\n Schema,\n BasePdf,\n BlankPdf,\n CommonOptions,\n DynamicLayoutArgs,\n DynamicLayoutResult,\n isBlankPdf,\n} from '@pdfme/common';\nimport { createSingleTable } from './tableHelper.js';\nimport { getBodyWithRange, getBody } from './helper.js';\nimport { TableSchema } from './types.js';\nimport { createTableBodySplitRange, getTableBodyRange } from '../splitRange.js';\n\nexport const getDynamicHeightsForTable = async (\n value: string,\n args: {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n },\n): Promise<number[]> => {\n if (args.schema.type !== 'table') return Promise.resolve([args.schema.height]);\n const schema = args.schema as TableSchema;\n const bodyRange = getTableBodyRange(schema);\n const body = bodyRange?.start === 0 ? getBody(value) : getBodyWithRange(value, bodyRange);\n const table = await createSingleTable(body, args);\n\n const baseHeights = schema.showHead\n ? table.allRows().map((row) => row.height)\n : [0].concat(table.body.map((row) => row.height));\n\n const headerHeight = schema.showHead ? table.getHeadHeight() : 0;\n const shouldRepeatHeader = schema.repeatHead && isBlankPdf(args.basePdf) && headerHeight > 0;\n\n if (!shouldRepeatHeader) {\n return baseHeights;\n }\n\n const basePdf = args.basePdf as BlankPdf;\n const [paddingTop, , paddingBottom] = basePdf.padding;\n const pageContentHeight = basePdf.height - paddingTop - paddingBottom;\n const getPageStartY = (pageIndex: number) => pageIndex * pageContentHeight + paddingTop;\n\n const initialPageIndex = Math.max(\n 0,\n Math.floor((schema.position.y - paddingTop) / pageContentHeight),\n );\n const headRowCount = schema.showHead ? table.head.length : 0;\n const SAFETY_MARGIN = 0.5;\n // Same tolerance as placeUnitsOnPages in @pdfme/common.\n const EPSILON = 0.01;\n\n let currentPageIndex = initialPageIndex;\n let currentPageY = schema.position.y;\n let rowsOnCurrentPage = 0;\n // avoidFirstUnitOnly moves the header unit with the first body row. That row\n // must not also include a repeated header, or the fresh page cannot fit it.\n let headerTravelsWithBody = false;\n\n const result: number[] = [];\n\n for (let i = 0; i < baseHeights.length; i++) {\n const isBodyRow = i >= headRowCount;\n const rowHeight = baseHeights[i];\n\n while (true) {\n const currentPageStartY = getPageStartY(currentPageIndex);\n const remainingHeight = currentPageStartY + pageContentHeight - currentPageY;\n const needsHeader =\n isBodyRow &&\n rowsOnCurrentPage === 0 &&\n currentPageIndex > initialPageIndex &&\n !headerTravelsWithBody;\n const totalRowHeight = rowHeight + (needsHeader ? headerHeight : 0);\n\n if (totalRowHeight > remainingHeight - SAFETY_MARGIN + EPSILON) {\n if (rowsOnCurrentPage === 0 && Math.abs(currentPageY - currentPageStartY) < SAFETY_MARGIN) {\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n headerTravelsWithBody = false;\n break;\n }\n const headerWouldBeAlone =\n !headerTravelsWithBody &&\n currentPageIndex === initialPageIndex &&\n isBodyRow &&\n headRowCount > 0 &&\n result.length === headRowCount &&\n rowsOnCurrentPage === headRowCount;\n currentPageIndex++;\n if (headerWouldBeAlone) {\n headerTravelsWithBody = true;\n currentPageY = getPageStartY(currentPageIndex) + headerHeight;\n rowsOnCurrentPage = headRowCount;\n } else {\n headerTravelsWithBody = false;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n }\n continue;\n }\n\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n if (isBodyRow) headerTravelsWithBody = false;\n\n if (currentPageY >= currentPageStartY + pageContentHeight - SAFETY_MARGIN) {\n currentPageIndex++;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n headerTravelsWithBody = false;\n }\n break;\n }\n }\n\n return result;\n};\n\nexport const getDynamicLayoutForTable = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n const heights = await getDynamicHeightsForTable(value, args);\n\n return {\n heights,\n avoidFirstUnitOnly: true,\n patchSplitSchema: ({ start, end, isSplit }) => {\n const range = {\n start: start === 0 ? 0 : start - 1,\n end: end - 1,\n };\n return {\n __splitRange: createTableBodySplitRange(range.start, range.end),\n __isSplit: isSplit,\n };\n },\n };\n};\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { D as getBoxContentArea, E as createBoxDimension, L as CODE_BACKGROUND_COLOR, V as DEFAULT_FONT_COLOR, X as PLACEHOLDER_FONT_COLOR, Z as SYNTHETIC_BOLD_CSS_TEXT_SHADOW, a as createListItemSplitRange, c as getListItemRange, g as getFontKitFont, i as TEXT_LINE_SPLIT_UNIT, it as VERTICAL_ALIGN_MIDDLE, l as getTableBodyRange, n as LIST_ITEM_SPLIT_UNIT, o as createTableBodySplitRange, r as TABLE_BODY_SPLIT_UNIT, s as createTextLineSplitRange, t as BUILT_IN_DYNAMIC_LAYOUT_SPLIT_UNITS, u as getTextLineRange, z as DEFAULT_ALIGNMENT } from "./splitRange-BkQuwzIU.js";
2
2
  import { a as measureTextLines, f as resolveFontVariant, h as parseInlineMarkdown, u as isInlineMarkdownTextSchema } from "./measure-BzuDatEc.js";
3
- import { _ as embedAndGetFont, a as mapVerticalAlignToFlex, c as Formatter, d as TextAlignLeftIcon, f as TextAlignRightIcon, g as pdfRender$4, h as TextVerticalAlignTopIcon, i as makeElementPlainTextContentEditable, l as getExtraFormatterSchema, m as TextVerticalAlignMiddleIcon, n as textSchema, o as uiRender$4, p as TextVerticalAlignBottomIcon, r as buildStyledTextContainer, s as propPanel$3, t as builtInPlugins, u as TextAlignCenterIcon } from "./builtins-BW_NgJf9.js";
4
- import { C as hashImageDataUrl, S as normalizeImageOrientation, _ as TABLE_CELL_TYPES, a as getCellPropPanelSchema, b as TABLE_IMAGE_DATA_URL_PATTERN, c as HEX_COLOR_PATTERN, d as getTableImageObjectPosition, f as normalizeTableCellType, g as warnInvalidTableImageOnce, h as resolveImageDimension, i as getBodyWithSchemaRange, l as OPAQUE_HEX_COLOR_PATTERN, m as resolveFixedTableImageHeight, n as getDynamicLayoutForTable, o as getDefaultCellStyles, p as normalizeTableImageHeightMode, r as getBody, s as remapColumnStylesOnRemove, t as getDynamicHeightsForTable, u as createSingleTable, v as TABLE_IMAGE_HEIGHT_MODES, x as detectImageFormat, y as DEFAULT_TABLE_IMAGE_HEIGHT_MODE } from "./dynamicTemplate-CkX3dzIQ.js";
5
- import { a as createSvgStr, d as rgbColorToCmykColor, f as rotatePoint, g as visitVariables, h as getVariableNames, i as createErrorElm, l as isEditable, m as countUniqueVariableNames, n as applyAlphaToOpacity, p as splitHexAlpha, r as convertForPdfLayoutProps, s as hex2PrintingColor, t as addAlphaToHex, u as readFile } from "./utils-C361jF7a.js";
3
+ import { _ as embedAndGetFont, a as mapVerticalAlignToFlex, c as Formatter, d as TextAlignLeftIcon, f as TextAlignRightIcon, g as pdfRender$4, h as TextVerticalAlignTopIcon, i as makeElementPlainTextContentEditable, l as getExtraFormatterSchema, m as TextVerticalAlignMiddleIcon, n as textSchema, o as uiRender$4, p as TextVerticalAlignBottomIcon, r as buildStyledTextContainer, s as propPanel$3, t as builtInPlugins, u as TextAlignCenterIcon } from "./builtins-BU9zSggO.js";
4
+ import { C as hashImageDataUrl, S as normalizeImageOrientation, _ as TABLE_CELL_TYPES, a as getCellPropPanelSchema, b as TABLE_IMAGE_DATA_URL_PATTERN, c as HEX_COLOR_PATTERN, d as getTableImageObjectPosition, f as normalizeTableCellType, g as warnInvalidTableImageOnce, h as resolveImageDimension, i as getBodyWithSchemaRange, l as OPAQUE_HEX_COLOR_PATTERN, m as resolveFixedTableImageHeight, n as getDynamicLayoutForTable, o as getDefaultCellStyles, p as normalizeTableImageHeightMode, r as getBody, s as remapColumnStylesOnRemove, t as getDynamicHeightsForTable, u as createSingleTable, v as TABLE_IMAGE_HEIGHT_MODES, x as detectImageFormat, y as DEFAULT_TABLE_IMAGE_HEIGHT_MODE } from "./dynamicTemplate-DbxdkEGp.js";
5
+ import { a as createSvgStr, d as rgbColorToCmykColor, f as rotatePoint, g as visitVariables, h as getVariableNames, i as createErrorElm, l as isEditable, m as countUniqueVariableNames, n as applyAlphaToOpacity, p as splitHexAlpha, r as convertForPdfLayoutProps, s as hex2PrintingColor, t as addAlphaToHex, u as readFile } from "./utils-CbHtVsNs.js";
6
6
  import { a as normalizeListItems, c as LIST_STYLE_BULLET, i as normalizeListItemEntries, l as LIST_STYLE_ORDERED, n as calculateListLayout, o as serializeListItems, s as DEFAULT_LIST_STYLE, t as getDynamicLayoutForList } from "./dynamicTemplate-CFTFLfQg.js";
7
7
  import { i as validateVariables, n as substituteVariables, r as substituteVariablesAsInlineMarkdownLiterals, t as resolveReadOnlyMultiVariableText } from "./helper-C57xgwUE.js";
8
8
  import "./tables.js";
@@ -23,7 +23,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
23
23
  var __getOwnPropNames = Object.getOwnPropertyNames;
24
24
  var __getProtoOf = Object.getPrototypeOf;
25
25
  var __hasOwnProp = Object.prototype.hasOwnProperty;
26
- var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
26
+ var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod, mod.exports), cb = null), mod.exports);
27
27
  var __copyProps = (to, from, except, desc) => {
28
28
  if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
29
29
  key = keys[i];