code: def search_url(obj, url_data, pageno, seen_objs):
      
      if isinstance(obj, PDFObjRef):
          if obj.objid in seen_objs:
              # prevent recursive loops
              return
          seen_objs.add(obj.objid)
          obj = obj.resolve()
      if isinstance(obj, dict):
          for key, value in obj.items():
              if key == 'URI' and isinstance(value, basestring):
                  # URIs should be 7bit ASCII encoded, but be safe and encode
                  # to unicode
                  # XXX this does not use an optional specified base URL
                  url = strformat.unicode_safe(value)
                  url_data.add_url(url, page=pageno)
              else:
                  search_url(value, url_data, pageno, seen_objs)
      elif isinstance(obj, list):
          for elem in obj:
              search_url(elem, url_data, pageno, seen_objs)
      elif isinstance(obj, PDFStream):
          search_url(obj.attrs, url_data, pageno, seen_objs)
docs: Recurse through a PDF object, searching for URLs.