build method

Uint8List build({
  1. UDocMetadata? metadata,
})

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();
}