Call to undefined function wp_generate_attachment_metadata()

Despite you already solved it (the “undefined” issue), it should be noted that wp_generate_attachment_metadata() is defined in wp-admin/includes/image.php, so you need to manually load that file if you’re using the function on the front-end, i.e. public side of the site or non admin/wp-admin pages (e.g. single attachment pages).

And in fact, the function reference says that:

If this function is undefined in the environment where it is to be
used, such as within a Shortcode, use the include function:

if ( ! function_exists( 'wp_crop_image' ) ) {
  include( ABSPATH . 'wp-admin/includes/image.php' );
}

(You may use wp_generate_attachment_metadata instead of that wp_crop_image)

Secondly, you’re not properly using the function:

wp_generate_attachment_metadata( $the_ID, wp_upload_dir() );

Because the second parameter for wp_generate_attachment_metadata() should be the attachment file path, and not an array (wp_upload_dir() returns an array) or anything else. So for example:

$file="/full/path/to/the/attachment/file.pdf";
wp_generate_attachment_metadata( $the_ID, $file );

And make sure the file path is valid and that the $the_ID has the correct attachment post ID.