示例#1
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;
         }
     }
 }
示例#2
0
        /// <summary>Adds indirect reference to list of indirect objects.</summary>
        /// <param name="reference">indirect reference to add.</param>
        public virtual PdfIndirectReference Add(PdfIndirectReference reference)
        {
            if (reference == null)
            {
                return(null);
            }
            int objNr = reference.GetObjNumber();

            this.count = Math.Max(this.count, objNr);
            EnsureCount(objNr);
            xref[objNr] = reference;
            return(reference);
        }
示例#3
0
 private void Write(PdfIndirectReference indirectReference)
 {
     if (document != null && !indirectReference.GetDocument().Equals(document))
     {
         throw new PdfException(PdfException.PdfInderectObjectBelongToOtherPdfDocument);
     }
     if (indirectReference.GetRefersTo() == null)
     {
         Write(PdfNull.PDF_NULL);
     }
     else
     {
         if (indirectReference.GetGenNumber() == 0)
         {
             WriteInteger(indirectReference.GetObjNumber()).WriteBytes(endIndirectWithZeroGenNr);
         }
         else
         {
             WriteInteger(indirectReference.GetObjNumber()).WriteSpace().WriteInteger(indirectReference.GetGenNumber())
             .WriteBytes(endIndirect);
         }
     }
 }
示例#4
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);
        }
示例#5
0
        public virtual void CopyObject6()
        {
            FileStream    fos        = new FileStream(destinationFolder + "copyObject6_1.pdf", FileMode.Create);
            PdfWriter     writer     = new PdfWriter(fos);
            PdfDocument   pdfDoc     = new PdfDocument(writer);
            PdfDictionary helloWorld = ((PdfDictionary) new PdfDictionary().MakeIndirect(pdfDoc));

            helloWorld.Put(new PdfName("Hello"), new PdfString("World"));
            PdfPage page = pdfDoc.AddNewPage();

            page.GetPdfObject().Put(new PdfName("HelloWorld"), helloWorld);
            pdfDoc.Close();
            pdfDoc     = new PdfDocument(new PdfReader(destinationFolder + "copyObject6_1.pdf"));
            helloWorld = (PdfDictionary)pdfDoc.GetPage(1).GetPdfObject().Get(new PdfName("HelloWorld"));
            PdfDocument pdfDoc1 = new PdfDocument(new PdfWriter(new FileStream(destinationFolder + "copyObject6_2.pdf"
                                                                               , FileMode.Create)));
            PdfPage page1 = pdfDoc1.AddNewPage();

            page1.GetPdfObject().Put(new PdfName("HelloWorldCopy1"), ((PdfDictionary)helloWorld.CopyTo(pdfDoc1)));
            page1.GetPdfObject().Put(new PdfName("HelloWorldCopy2"), ((PdfDictionary)helloWorld.CopyTo(pdfDoc1, true))
                                     );
            page1.GetPdfObject().Put(new PdfName("HelloWorldCopy3"), ((PdfDictionary)helloWorld.CopyTo(pdfDoc1, false)
                                                                      ));
            page1.Flush();
            pdfDoc.Close();
            pdfDoc1.Close();
            PdfReader   reader      = new PdfReader(destinationFolder + "copyObject6_2.pdf");
            PdfDocument pdfDocument = new PdfDocument(reader);

            NUnit.Framework.Assert.AreEqual(false, reader.HasRebuiltXref(), "Rebuilt");
            PdfObject            obj1 = pdfDocument.GetPage(1).GetPdfObject().Get(new PdfName("HelloWorldCopy1"));
            PdfIndirectReference ref1 = obj1.GetIndirectReference();

            NUnit.Framework.Assert.AreEqual(6, ref1.objNr);
            NUnit.Framework.Assert.AreEqual(0, ref1.genNr);
            PdfObject            obj2 = pdfDocument.GetPage(1).GetPdfObject().Get(new PdfName("HelloWorldCopy2"));
            PdfIndirectReference ref2 = obj2.GetIndirectReference();

            NUnit.Framework.Assert.AreEqual(7, ref2.GetObjNumber());
            NUnit.Framework.Assert.AreEqual(0, ref2.GetGenNumber());
            PdfObject            obj3 = pdfDocument.GetPage(1).GetPdfObject().Get(new PdfName("HelloWorldCopy3"));
            PdfIndirectReference ref3 = obj3.GetIndirectReference();

            NUnit.Framework.Assert.AreEqual(7, ref3.GetObjNumber());
            NUnit.Framework.Assert.AreEqual(0, ref3.GetGenNumber());
            reader.Close();
        }
示例#6
0
        /// <summary>Removes indirect reference from free references linked list.</summary>
        /// <remarks>
        /// Removes indirect reference from free references linked list.
        /// It does not removes it from xref table and affects only the linked list formed by offset values of free references.
        /// </remarks>
        /// <param name="freeRefObjNr">
        /// object number of the reference to be removed.
        /// Removes the free reference with the least object number if this parameter is less than zero:
        /// this could be used for finding the next free reference for reusing.
        /// </param>
        /// <returns>
        ///
        /// <see cref="PdfIndirectReference"/>
        /// instance of the removed free reference corresponding to the object number
        /// passed as parameter.
        /// <see langword="null"/>
        /// - if given object number doesn't correspond to free reference or equals to zero.
        /// </returns>
        private PdfIndirectReference RemoveFreeRefFromList(int freeRefObjNr)
        {
            if (freeReferencesLinkedList.IsEmpty <int, PdfIndirectReference>())
            {
                System.Diagnostics.Debug.Assert(false);
                // free references list is not initialized yet
                return(null);
            }
            if (freeRefObjNr == 0)
            {
                return(null);
            }
            if (freeRefObjNr < 0)
            {
                int?leastFreeRefObjNum = null;
                foreach (KeyValuePair <int, PdfIndirectReference> entry in freeReferencesLinkedList)
                {
                    if (entry.Key <= 0 || xref[entry.Key].GetGenNumber() >= MAX_GENERATION)
                    {
                        continue;
                    }
                    leastFreeRefObjNum = entry.Key;
                    break;
                }
                if (leastFreeRefObjNum == null)
                {
                    return(null);
                }
                freeRefObjNr = (int)leastFreeRefObjNum;
            }
            PdfIndirectReference freeRef = xref[freeRefObjNr];

            if (!freeRef.IsFree())
            {
                return(null);
            }
            PdfIndirectReference prevFreeRef = freeReferencesLinkedList.JRemove(freeRef.GetObjNumber());

            if (prevFreeRef != null)
            {
                freeReferencesLinkedList.Put((int)freeRef.GetOffset(), prevFreeRef);
                ((PdfIndirectReference)prevFreeRef.SetState(PdfObject.MODIFIED)).SetOffset(freeRef.GetOffset());
            }
            return(freeRef);
        }