docs: def _fromfile(self):
          """Read TIFF IFD structure and its tags from file.
  
          File cursor must be at storage position of IFD offset and is left at
          offset to next IFD.
  
          Raises StopIteration if offset (first bytes read) is 0.
  
          """
          fd = self.parent._fd
          byte_order = self.parent.byte_order
          offset_size = self.parent.offset_size
  
          fmt = {4: 'I', 8: 'Q'}[offset_size]
          offset = struct.unpack(byte_order + fmt, fd.read(offset_size))[0]
          if not offset:
              raise StopIteration()
  
          # read standard tags
          tags = self.tags
          fd.seek(offset)
          fmt, size = {4: ('H', 2), 8: ('Q', 8)}[offset_size]
          try:
              numtags = struct.unpack(byte_order + fmt, fd.read(size))[0]
          except Exception:
              warnings.warn("corrupted page list")
              raise StopIteration()
  
          for _ in range(numtags):
              tag = TIFFtag(self.parent)
              tags[tag.name] = tag
  
          # read LSM info subrecords
          if self.is_lsm:
              pos = fd.tell()
              for name, reader in CZ_LSM_INFO_READERS.items():
                  try:
                      offset = self.cz_lsm_info["offset_"+name]
                  except KeyError:
                      continue
                  if not offset:
                      continue
                  fd.seek(offset)
                  try:
                      setattr(self, "cz_lsm_"+name, reader(fd, byte_order))
                  except ValueError:
                      pass
              fd.seek(pos)