setMetadata method

Future<void> setMetadata(
  1. UDocMetadata metadata
)

Implementation

Future<void> setMetadata(UDocMetadata metadata) async {
  final Object? infoRef = document.xref.trailer?["Info"];
  final int number = infoRef is UPdfRef ? infoRef.number : allocate();
  final Object? existing = infoRef is UPdfRef ? await current(infoRef) : null;
  final UPdfDict info = existing is UPdfDict ? existing.copy() : UPdfDict(<String, Object?>{});
  void assign(String key, String? value) {
    if (value == null) return;
    if (value.isEmpty) {
      info.entries.remove(key);
      return;
    }
    info[key] = _text(value);
  }

  assign("Title", metadata.title);
  assign("Author", metadata.author);
  assign("Subject", metadata.subject);
  assign("Keywords", metadata.keywords);
  assign("Creator", metadata.creator);
  assign("Producer", metadata.producer ?? "u_doc");
  info["ModDate"] = _dateString(DateTime.now());
  put(number, info);
  if (infoRef is! UPdfRef) {
    final UPdfDict trailer = document.xref.trailer ?? UPdfDict(<String, Object?>{});
    trailer["Info"] = UPdfRef(number, 0);
    document.xref.trailer = trailer;
  }
}