private static void RecourseFonts(PdfDictionary page, IntHashtable hits, List<object[]> fonts, int level, HashSet2<PdfDictionary> visitedResources) { ++level; if (level > 50) // in case we have an endless loop return; if (page == null) return; PdfDictionary resources = page.GetAsDict(PdfName.RESOURCES); if (resources == null) return; PdfDictionary font = resources.GetAsDict(PdfName.FONT); if (font != null) { foreach (PdfName key in font.Keys) { PdfObject ft = font.Get(key); if (ft == null || !ft.IsIndirect()) continue; int hit = ((PRIndirectReference)ft).Number; if (hits.ContainsKey(hit)) continue; AddFont((PRIndirectReference)ft, hits, fonts); } } PdfDictionary xobj = resources.GetAsDict(PdfName.XOBJECT); if(xobj != null){ if (visitedResources.AddAndCheck(xobj)){ foreach (PdfName key in xobj.Keys) { PdfObject po = xobj.GetDirectObject(key); if (po is PdfDictionary) RecourseFonts((PdfDictionary)po, hits, fonts, level, visitedResources); } visitedResources.Remove(xobj); } else throw new InvalidPdfException(MessageLocalization.GetComposedMessage("illegal.resources.tree")); } }