public PDField getField(String fullyQualifiedName)
    {
        // get the field from the cache if there is one.
        if (fieldCache != null)
        {
            return fieldCache.get(fullyQualifiedName);
        }

        // get the field from the field tree
        for (PDField field : getFieldTree())
        {
            if (field.getFullyQualifiedName().equals(fullyQualifiedName))
            {
                return field;
            }
        }

        return null;
    }
@Test
    void testPDFBox3347() throws IOException, URISyntaxException
    {
        String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12968302/KYF%20211%20Best%C3%A4llning%202014.pdf";

        try (PDDocument doc = Loader.loadPDF(
                RandomAccessReadBuffer.createBufferFromStream(new URI(sourceUrl).toURL().openStream())))
        {
            PDField field = doc.getDocumentCatalog().getAcroForm().getField("Krematorier");
            List<PDAnnotationWidget> widgets = field.getWidgets();
            Set<String> set = new TreeSet<>();
            for (PDAnnotationWidget annot : widgets)
            {
                PDAppearanceDictionary ap = annot.getAppearance();
                PDAppearanceEntry normalAppearance = ap.getNormalAppearance();
                Set<COSName> nameSet = normalAppearance.getSubDictionary().keySet();
                assertTrue(nameSet.contains(COSName.Off));
                for (COSName name : nameSet)
                {
                    if (!name.equals(COSName.Off))
                    {
                        set.add(name.getName());
                    }
                }
            }
            assertEquals("[Nynäshamn, Råcksta, Silverdal, Skogskrem, St Botvid, Storkällan]",
                    set.toString());
        }
    }