buildMultiPagePdf function
Builds a pageCount-page PDF; page N shows the text "Page N".
Implementation
Uint8List buildMultiPagePdf(int pageCount) {
final objects = <String>[];
final kids = [
for (var i = 0; i < pageCount; i++) '${3 + i * 2} 0 R',
].join(' ');
final fontNumber = 3 + pageCount * 2;
objects.add('<< /Type /Catalog /Pages 2 0 R >>');
objects.add('<< /Type /Pages /Kids [$kids] /Count $pageCount >>');
for (var i = 0; i < pageCount; i++) {
final content = 'BT /F1 24 Tf 72 720 Td (Page ${i + 1}) Tj ET';
objects.add('<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] '
'/Contents ${4 + i * 2} 0 R '
'/Resources << /Font << /F1 $fontNumber 0 R >> >> >>');
objects.add('<< /Length ${content.length} >>\nstream\n$content\nendstream');
}
objects.add('<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>');
final buffer = StringBuffer('%PDF-1.4\n');
final offsets = <int>[];
for (var i = 0; i < objects.length; i++) {
offsets.add(buffer.length);
buffer.write('${i + 1} 0 obj\n${objects[i]}\nendobj\n');
}
final xrefOffset = buffer.length;
buffer
..write('xref\n0 ${objects.length + 1}\n')
..write('0000000000 65535 f \n');
for (final offset in offsets) {
buffer.write('${offset.toString().padLeft(10, '0')} 00000 n \n');
}
buffer
..write('trailer\n<< /Size ${objects.length + 1} /Root 1 0 R >>\n')
..write('startxref\n$xrefOffset\n%%EOF\n');
return ascii(buffer.toString());
}