///|
fn PdfDocument::pdf_metadata_box_text(
  self : PdfDocument,
  box : @syntax.PdfObject,
  unit : @geometry.PdfUnit,
) -> String {
  match self.direct(box) {
    PdfArray(values) if values.length() == 4 => {
      let a = self.get_number(values[0]) catch { _ => return "" }
      let b = self.get_number(values[1]) catch { _ => return "" }
      let c = self.get_number(values[2]) catch { _ => return "" }
      let d = self.get_number(values[3]) catch { _ => return "" }
      pdf_position_fixed_six(pdf_metadata_unit_number(a, unit)) +
      " " +
      pdf_position_fixed_six(pdf_metadata_unit_number(b, unit)) +
      " " +
      pdf_position_fixed_six(pdf_metadata_unit_number(c, unit)) +
      " " +
      pdf_position_fixed_six(pdf_metadata_unit_number(d, unit))
    }
    _ => ""
  }
}

///|
fn PdfDocument::pdf_metadata_info_box_text(
  self : PdfDocument,
  boxes : ArrayView[@syntax.PdfObject?],
  unit : @geometry.PdfUnit,
) -> String {
  if boxes.length() == 0 {
    return ""
  }
  let first = boxes[0]
  for index in 1.. self.pdf_metadata_box_text(box, unit)
    None => ""
  }
}

///|
fn PdfDocument::pdf_metadata_info_json_boxes(
  self : PdfDocument,
  pages : ArrayView[@page.PdfPage],
  unit : @geometry.PdfUnit,
  output : Map[String, Json],
) -> Unit {
  let mediaboxes : Array[@syntax.PdfObject?] = []
  let cropboxes : Array[@syntax.PdfObject?] = []
  let bleedboxes : Array[@syntax.PdfObject?] = []
  let trimboxes : Array[@syntax.PdfObject?] = []
  let artboxes : Array[@syntax.PdfObject?] = []
  for page in pages {
    mediaboxes.push(Some(page.mediabox))
    cropboxes.push(self.lookup_direct(pdf_metadata_cropbox(), page.rest))
    bleedboxes.push(self.lookup_direct(pdf_metadata_bleedbox(), page.rest))
    trimboxes.push(self.lookup_direct(pdf_metadata_trimbox(), page.rest))
    artboxes.push(self.lookup_direct(pdf_metadata_artbox(), page.rest))
  }
  output.set("MediaBox", self.pdf_metadata_page_box_json(mediaboxes, unit))
  output.set("CropBox", self.pdf_metadata_page_box_json(cropboxes, unit))
  output.set("BleedBox", self.pdf_metadata_page_box_json(bleedboxes, unit))
  output.set("TrimBox", self.pdf_metadata_page_box_json(trimboxes, unit))
  output.set("ArtBox", self.pdf_metadata_page_box_json(artboxes, unit))
}