code: def extract_images(pike, root, log, options, extract_fn):
      
  
      include_xrefs = set()
      exclude_xrefs = set()
      pageno_for_xref = {}
      errors = 0
      for pageno, page in enumerate(pike.pages):
          try:
              xobjs = page.Resources.XObject
          except AttributeError:
              continue
          for _imname, image in dict(xobjs).items():
              if image.objgen[1] != 0:
                  continue  # Ignore images in an incremental PDF
              xref = image.objgen[0]
              if hasattr(image, 'SMask'):
                  # Ignore soft masks
                  smask_xref = image.SMask.objgen[0]
                  exclude_xrefs.add(smask_xref)
              include_xrefs.add(xref)
              if xref not in pageno_for_xref:
                  pageno_for_xref[xref] = pageno
  
      working_xrefs = include_xrefs - exclude_xrefs
      for xref in working_xrefs:
          image = pike.get_object((xref, 0))
          try:
              result = extract_fn(
                  pike=pike, root=root, log=log, image=image, xref=xref, options=options
              )
          except Exception as e:
              log.debug("Image xref %s, error %s", xref, repr(e))
              errors += 1
          else:
              if result:
                  _, ext = result
                  yield pageno_for_xref[xref], xref, ext
docs: Extract image using extract_fn
  
      Enumerate images on each page, lookup their xref/ID number in the PDF.
      Exclude images that are soft masks (i.e. alpha transparency related).
      Record the page number on which an image is first used, since images may be
      used on multiple pages (or multiple times on the same page).
  
      Current we do not check Form XObjects or other objects that may contain
      images, and we don't evaluate alternate images or thumbnails.
  
      extract_fn must decide if wants to extract the image in this context. If
      it does a tuple should be returned: (xref, ext) where .ext is the file
      extension. extract_fn must also extract the file it finds interesting.