private bool UpdateStructParentTreeEntries(PdfPage page, ParentTreeHandler.PageMcrsContainer mcrs) { bool res = false; foreach (KeyValuePair <int, PdfMcr> entry in mcrs.GetObjRefs()) { PdfMcr mcr = entry.Value; PdfDictionary parentObj = ((PdfStructElem)mcr.GetParent()).GetPdfObject(); if (!parentObj.IsIndirect()) { continue; } int structParent = entry.Key; parentTree.AddEntry(structParent, parentObj); res = true; } int pageStructParentIndex; foreach (KeyValuePair <PdfIndirectReference, SortedDictionary <int, PdfMcr> > entry in mcrs.GetPageResourceXObjects ()) { PdfIndirectReference xObjectRef = entry.Key; if (xObjectToStructParentsInd.ContainsKey(xObjectRef)) { pageStructParentIndex = (int)xObjectToStructParentsInd.JRemove(xObjectRef); if (UpdateStructParentTreeForContentStreamEntries(entry.Value, pageStructParentIndex)) { res = true; } } } if (page.IsFlushed()) { PdfIndirectReference pageRef = page.GetPdfObject().GetIndirectReference(); if (!pageToStructParentsInd.ContainsKey(pageRef)) { return(res); } pageStructParentIndex = (int)pageToStructParentsInd.JRemove(pageRef); } else { pageStructParentIndex = GetOrCreatePageStructParentIndex(page); } if (UpdateStructParentTreeForContentStreamEntries(mcrs.GetPageContentStreamsMcrs(), pageStructParentIndex) ) { res = true; } return(res); }
public virtual PdfObjRef FindObjRefByStructParentIndex(PdfDictionary pageDict, int structParentIndex) { ParentTreeHandler.PageMcrsContainer pageMcrs = pageToPageMcrs.Get(pageDict.GetIndirectReference()); return(pageMcrs != null ? (PdfObjRef)pageMcrs.GetObjRefs().Get(structParentIndex) : null); }
public virtual void UnregisterMcr(PdfMcr mcrToUnregister) { PdfDictionary pageDict = mcrToUnregister.GetPageObject(); if (pageDict == null) { // invalid mcr, ignore return; } if (pageDict.IsFlushed()) { throw new PdfException(PdfException.CannotRemoveMarkedContentReferenceBecauseItsPageWasAlreadyFlushed); } ParentTreeHandler.PageMcrsContainer pageMcrs = pageToPageMcrs.Get(pageDict.GetIndirectReference()); if (pageMcrs != null) { PdfObject stm; if ((stm = GetStm(mcrToUnregister)) != null) { PdfIndirectReference xObjectReference = stm is PdfIndirectReference ? (PdfIndirectReference)stm : stm.GetIndirectReference (); pageMcrs.GetPageResourceXObjects().Get(xObjectReference).JRemove(mcrToUnregister.GetMcid()); if (pageMcrs.GetPageResourceXObjects().Get(xObjectReference).IsEmpty()) { pageMcrs.GetPageResourceXObjects().JRemove(xObjectReference); xObjectToStructParentsInd.JRemove(xObjectReference); } structTreeRoot.SetModified(); } else { if (mcrToUnregister is PdfObjRef) { PdfDictionary obj = ((PdfDictionary)mcrToUnregister.GetPdfObject()).GetAsDictionary(PdfName.Obj); if (obj != null && !obj.IsFlushed()) { PdfNumber n = obj.GetAsNumber(PdfName.StructParent); if (n != null) { pageMcrs.GetObjRefs().JRemove(n.IntValue()); structTreeRoot.SetModified(); return; } } foreach (KeyValuePair <int, PdfMcr> entry in pageMcrs.GetObjRefs()) { if (entry.Value.GetPdfObject() == mcrToUnregister.GetPdfObject()) { pageMcrs.GetObjRefs().JRemove(entry.Key); structTreeRoot.SetModified(); break; } } } else { pageMcrs.GetPageContentStreamsMcrs().JRemove(mcrToUnregister.GetMcid()); structTreeRoot.SetModified(); } } } }