build method
Implementation
Uint8List build({UDocMetadata? metadata}) {
final int pagesNumber = allocate();
final int catalogNumber = allocate();
for (final int page in _pages) {
final Object? dict = _objects[page];
if (dict is UPdfDict) dict["Parent"] = UPdfRef(pagesNumber, 0);
}
_objects[pagesNumber] = UPdfDict(<String, Object?>{
"Type": const UPdfName("Pages"),
"Kids": _pages.map((int number) => UPdfRef(number, 0)).toList(),
"Count": _pages.length,
});
_objects[catalogNumber] = UPdfDict(<String, Object?>{"Type": const UPdfName("Catalog"), "Pages": UPdfRef(pagesNumber, 0)});
int? infoNumber;
if (metadata != null) {
infoNumber = allocate();
final Map<String, Object?> info = <String, Object?>{"Producer": UPdfEdit.textString("u_doc"), "ModDate": UPdfEdit.dateString(DateTime.now())};
if (metadata.title != null && metadata.title!.isNotEmpty) info["Title"] = UPdfEdit.textString(metadata.title!);
if (metadata.author != null && metadata.author!.isNotEmpty) info["Author"] = UPdfEdit.textString(metadata.author!);
if (metadata.subject != null && metadata.subject!.isNotEmpty) info["Subject"] = UPdfEdit.textString(metadata.subject!);
if (metadata.keywords != null && metadata.keywords!.isNotEmpty) info["Keywords"] = UPdfEdit.textString(metadata.keywords!);
_objects[infoNumber] = UPdfDict(info);
}
final BytesBuilder out = BytesBuilder(copy: false);
out.add("%PDF-1.7\n%âãÏÓ\n".codeUnits);
final Map<int, int> offsets = <int, int>{};
final List<int> numbers = _objects.keys.toList()..sort();
for (final int number in numbers) {
offsets[number] = out.length;
out.add("$number 0 obj\n".codeUnits);
UPdfSerializer.write(out, _objects[number]);
out.add("\nendobj\n".codeUnits);
}
final int xrefOffset = out.length;
final int size = numbers.isEmpty ? 1 : numbers.last + 1;
out.add("xref\n0 $size\n".codeUnits);
out.add("0000000000 65535 f \n".codeUnits);
for (int number = 1; number < size; number++) {
final int? offset = offsets[number];
if (offset == null) {
out.add("0000000000 65535 f \n".codeUnits);
} else {
out.add("${offset.toString().padLeft(10, "0")} 00000 n \n".codeUnits);
}
}
out.add("trailer\n".codeUnits);
UPdfSerializer.write(
out,
UPdfDict(<String, Object?>{
"Size": size,
"Root": UPdfRef(catalogNumber, 0),
if (infoNumber != null) "Info": UPdfRef(infoNumber, 0),
}),
);
out.add("\nstartxref\n$xrefOffset\n%%EOF\n".codeUnits);
return out.takeBytes();
}