Your code is incomplete as it only understands very primitive EmbeddedFiles structures. Your sample file has a slightly more complex EmbeddedFiles structure. You need to improve your code to also understand such more complex structures.
The details
The EmbeddedFiles dictionary is specified to contain a name tree:
EmbeddedFiles name tree (Optional; PDF 1.4) A name tree mapping name strings to file specifications for embedded file streams (see 7.11.4, "Embedded File Streams").
(ISO 32000-1 Table 31 – Entries in the name dictionary)
A name tree shall be constructed of nodes, each of which shall be a dictionary object. Table 36 shows the entries in a node dictionary. The nodes shall be of three kinds, depending on the specific entries they contain. The tree shall always have exactly one root node, which shall contain a single entry: either Kids or Names but not both. If the root node has a Names entry, it shall be the only node in the tree. If it has a Kids entry, each of the remaining nodes shall be either an intermediate node, that shall contain a Limits entry and a Kids entry, or a leaf node, that shall contain a Limits entry and a Names entry.
(ISO 32000-1 Section 7.9.6 - Name Trees)
Your code only understands the variety in which the root node has a Names entry and, therefore, is the only node in the tree:
...
PdfDictionary embedded = names.getAsDict(PdfName.EMBEDDEDFILES);
PdfArray filespecs = embedded.getAsArray(PdfName.NAMES);
...
In your sample PDF file on the other hand the EmbeddedFiles dictionary has a Kids entry and, therefore, is not understood by your code: