void TransitiveClosureImplementation(Dictionary <PdfItem, object> objects, PdfObject pdfObject /*, ref int depth*/) { try { _nestingLevel++; if (_nestingLevel >= 1000) { if (!_overflow.ContainsKey(pdfObject)) { _overflow.Add(pdfObject, null); } return; } #if DEBUG_ //enterCount++; if (enterCount == 5400) { GetType(); } //if (!Object.ReferenceEquals(pdfObject.Owner, _document)) // GetType(); //////Debug.Assert(Object.ReferenceEquals(pdfObject27.Document, _document)); // if (item is PdfObject && ((PdfObject)item).ObjectID.ObjectNumber == 5) // Debug.WriteLine("items: " + ((PdfObject)item).ObjectID.ToString()); //if (pdfObject.ObjectNumber == 5) // GetType(); #endif IEnumerable enumerable = null; //(IEnumerator)pdfObject; PdfDictionary dict; PdfArray array; if ((dict = pdfObject as PdfDictionary) != null) { enumerable = dict.Elements.Values; } else if ((array = pdfObject as PdfArray) != null) { enumerable = array.Elements; } else { Debug.Assert(false, "Should not come here."); } if (enumerable != null) { foreach (PdfItem item in enumerable) { PdfReference iref = item as PdfReference; if (iref != null) { // Is this an indirect reference to an object that does not exist? //if (iref.Document == null) //{ // Debug.WriteLine("Dead object detected: " + iref.ObjectID.ToString()); // PdfReference dead = DeadObject; // iref.ObjectID = dead.ObjectID; // iref.Document = _document; // iref.SetObject(dead.Value); // PdfDictionary dict = (PdfDictionary)dead.Value; // dict.Elements["/DeadObjectCount"] = // new PdfInteger(dict.Elements.GetInteger("/DeadObjectCount") + 1); // iref = dead; //} if (!ReferenceEquals(iref.Document, _document)) { GetType(); Debug.WriteLine(String.Format("Bad iref: {0}", iref.ObjectID.ToString())); } Debug.Assert(ReferenceEquals(iref.Document, _document) || iref.Document == null, "External object detected!"); #if DEBUG_ if (iref.ObjectID.ObjectNumber == 23) { GetType(); } #endif if (!objects.ContainsKey(iref)) { PdfObject value = iref.Value; // Ignore unreachable objets. if (iref.Document != null) { // ... from trailer hack if (value == null) { iref = ObjectTable[iref.ObjectID]; Debug.Assert(iref.Value != null); value = iref.Value; } Debug.Assert(ReferenceEquals(iref.Document, _document)); objects.Add(iref, null); //Debug.WriteLine(String.Format("objects.Add('{0}', null);", iref.ObjectID.ToString())); if (value is PdfArray || value is PdfDictionary) { TransitiveClosureImplementation(objects, value /*, ref depth*/); } } //else //{ // objects2.Add(this[iref.ObjectID], null); //} } } else { PdfObject pdfObject28 = item as PdfObject; //if (pdfObject28 != null) // Debug.Assert(Object.ReferenceEquals(pdfObject28.Document, _document)); if (pdfObject28 != null && (pdfObject28 is PdfDictionary || pdfObject28 is PdfArray)) { TransitiveClosureImplementation(objects, pdfObject28 /*, ref depth*/); } } } } } finally { _nestingLevel--; } }
public void Remove(PdfReference iref) { ObjectTable.Remove(iref.ObjectID); }