31 lines
1.2 KiB
TypeScript
31 lines
1.2 KiB
TypeScript
export function createMinimalPdf(
|
|
text = "Visual diff fixture",
|
|
pageWidth = 595,
|
|
pageHeight = 842,
|
|
): Uint8Array {
|
|
const escapedText = text.replaceAll("\\", "\\\\").replaceAll("(", "\\(").replaceAll(")", "\\)");
|
|
const content = `BT /F1 18 Tf 72 ${pageHeight - 72} Td (${escapedText}) Tj ET`;
|
|
const objects = [
|
|
"<< /Type /Catalog /Pages 2 0 R >>",
|
|
"<< /Type /Pages /Kids [3 0 R] /Count 1 >>",
|
|
`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${pageWidth} ${pageHeight}] /Resources << /Font << /F1 4 0 R >> >> /Contents 5 0 R >>`,
|
|
"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>",
|
|
`<< /Length ${content.length} >>\nstream\n${content}\nendstream`,
|
|
];
|
|
let pdf = "%PDF-1.4\n";
|
|
const offsets = [0];
|
|
for (const [index, object] of objects.entries()) {
|
|
offsets.push(pdf.length);
|
|
pdf += `${index + 1} 0 obj\n${object}\nendobj\n`;
|
|
}
|
|
const xrefOffset = pdf.length;
|
|
pdf += `xref\n0 ${objects.length + 1}\n`;
|
|
pdf += "0000000000 65535 f \n";
|
|
for (const offset of offsets.slice(1)) {
|
|
pdf += `${String(offset).padStart(10, "0")} 00000 n \n`;
|
|
}
|
|
pdf += `trailer\n<< /Size ${objects.length + 1} /Root 1 0 R >>\n`;
|
|
pdf += `startxref\n${xrefOffset}\n%%EOF\n`;
|
|
return new TextEncoder().encode(pdf);
|
|
}
|