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; } } }
/// <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); }
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); } } }
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); }
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(); }
/// <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); }