private void AppendNewRefToFreeList(PdfIndirectReference reference) { reference.SetOffset(0); if (freeReferencesLinkedList.IsEmpty <int, PdfIndirectReference>()) { System.Diagnostics.Debug.Assert(false); // free references list is not initialized yet return; } PdfIndirectReference lastFreeRef = freeReferencesLinkedList.Get(0); ((PdfIndirectReference)lastFreeRef.SetState(PdfObject.MODIFIED)).SetOffset(reference.GetObjNumber()); freeReferencesLinkedList.Put(reference.GetObjNumber(), lastFreeRef); freeReferencesLinkedList.Put(0, reference); }
/// <summary>Flushes the object.</summary> /// <remarks>Flushes the object. Override this method if you want to define custom behaviour for object flushing. /// </remarks> /// <param name="pdfObject">object to flush.</param> /// <param name="canBeInObjStm">indicates whether object can be placed into object stream.</param> /// <exception cref="System.IO.IOException">on error.</exception> protected internal virtual void FlushObject(PdfObject pdfObject, bool canBeInObjStm) { PdfIndirectReference indirectReference = pdfObject.GetIndirectReference(); if (IsFullCompression() && canBeInObjStm) { PdfObjectStream objectStream = GetObjectStream(); objectStream.AddObject(pdfObject); } else { indirectReference.SetOffset(GetCurrentPos()); WriteToBody(pdfObject); } ((PdfIndirectReference)indirectReference.SetState(PdfObject.FLUSHED)).ClearState(PdfObject.MUST_BE_FLUSHED ); switch (pdfObject.GetObjectType()) { case PdfObject.BOOLEAN: case PdfObject.NAME: case PdfObject.NULL: case PdfObject.NUMBER: case PdfObject.STRING: { ((PdfPrimitiveObject)pdfObject).content = null; break; } case PdfObject.ARRAY: { PdfArray array = ((PdfArray)pdfObject); MarkArrayContentToFlush(array); array.ReleaseContent(); break; } case PdfObject.STREAM: case PdfObject.DICTIONARY: { PdfDictionary dictionary = ((PdfDictionary)pdfObject); MarkDictionaryContentToFlush(dictionary); dictionary.ReleaseContent(); break; } case PdfObject.INDIRECT_REFERENCE: { MarkObjectToFlush(((PdfIndirectReference)pdfObject).GetRefersTo(false)); break; } } }
protected internal virtual void FreeReference(PdfIndirectReference reference) { reference.SetOffset(0); reference.SetState(PdfObject.FREE); if (!reference.CheckState(PdfObject.FLUSHED)) { if (reference.refersTo != null) { reference.refersTo.SetIndirectReference(null).SetState(PdfObject.MUST_BE_INDIRECT); reference.refersTo = null; } if (reference.GetGenNumber() < MAX_GENERATION) { freeReferences.Add(reference.GetObjNumber()); xref[reference.GetObjNumber()] = null; } } }