* Serialize value to PDF format
(val: PDFValue)
| 88 | * Serialize value to PDF format |
| 89 | */ |
| 90 | function serialize(val: PDFValue): string { |
| 91 | if (val === null || val === undefined) return 'null' |
| 92 | if (typeof val === 'boolean') return val ? 'true' : 'false' |
| 93 | if (typeof val === 'number') return Number.isInteger(val) ? String(val) : val.toFixed(4).replace(/\.?0+$/, '') |
| 94 | if (typeof val === 'string') { |
| 95 | if (val.startsWith('/')) return val // name |
| 96 | if (val.startsWith('(')) return val // already escaped string |
| 97 | return pdfString(val) |
| 98 | } |
| 99 | if (Array.isArray(val)) return '[' + val.map(serialize).join(' ') + ']' |
| 100 | if (val instanceof Ref) return `${val.id} 0 R` |
| 101 | if (typeof val === 'object') { |
| 102 | const pairs = Object.entries(val) |
| 103 | .filter(([_, v]) => v !== undefined) |
| 104 | .map(([k, v]) => `/${k} ${serialize(v as PDFValue)}`) |
| 105 | return '<<\n' + pairs.join('\n') + '\n>>' |
| 106 | } |
| 107 | return String(val) |
| 108 | } |
| 109 | |
| 110 | /** PDF object reference */ |
| 111 | class Ref { |