Example #1
0
        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);
        }
Example #2
0
        /// <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;
            }
            }
        }
Example #3
0
 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;
         }
     }
 }