docs: def __get_boxes(self):
          """
          Get all the word boxes of this page.
          """
          if self.__boxes is not None:
              return self.__boxes
  
          # Check first if there is an OCR file available
          boxfile = self.__get_box_path()
          if self.fs.exists(boxfile):
              box_builder = pyocr.builders.LineBoxBuilder()
  
              try:
                  with self.fs.open(boxfile, 'r') as file_desc:
                      self.__boxes = box_builder.read_file(file_desc)
                  return self.__boxes
              except IOError as exc:
                  logger.error("Unable to get boxes for '%s': %s"
                               % (self.doc.docid, exc))
                  # will fall back on pdf boxes
  
          # fall back on what libpoppler tells us
  
          txt = self.pdf_page.get_text()
          self.__boxes = []
  
          layout = self.pdf_page.get_text_layout()
          if not layout[0]:
              layout = []
              return self.__boxes
          layout = layout[1]
  
          for (line, line_rects) in custom_split(
              txt, layout, lambda x: x == "\n"
          ):
              words = []
              for (word, word_rects) in custom_split(
                  line, line_rects, lambda x: x.isspace()
              ):
                  word_box = PdfWordBox(word, word_rects)
                  words.append(word_box)
              line_box = PdfLineBox(words, line_rects)
              self.__boxes.append(line_box)
          return self.__boxes