/// <summary>Create PdfPages tree.</summary> /// <param name="pdfCatalog"> /// /// <seealso>PdfCatalog</seealso> /// </param> public PdfPagesTree(PdfCatalog pdfCatalog) { this.document = pdfCatalog.GetDocument(); this.pageRefs = new List <PdfDictionary>(); this.parents = new List <PdfPages>(); this.pages = new List <PdfPage>(); if (pdfCatalog.GetPdfObject().ContainsKey(PdfName.Pages)) { PdfDictionary pages = pdfCatalog.GetPdfObject().GetAsDictionary(PdfName.Pages); if (pages == null) { throw new PdfException(PdfException.InvalidPageStructurePagesPagesMustBePdfDictionary); } this.root = new PdfPages(0, int.MaxValue, pages, null); parents.Add(this.root); for (int i = 0; i < this.root.GetCount(); i++) { this.pageRefs.Add(null); this.pages.Add(null); } } else { this.root = null; this.parents.Add(new PdfPages(0, this.document)); } }
public virtual PdfDictionary BuildTree() { int?[] numbers = new int?[items.Count]; numbers = items.Keys.ToArray(numbers); iText.IO.Util.JavaUtil.Sort(numbers); if (numbers.Length <= NODE_SIZE) { PdfDictionary dic = new PdfDictionary(); PdfArray ar = new PdfArray(); for (int k = 0; k < numbers.Length; ++k) { ar.Add(new PdfNumber((int)numbers[k])); ar.Add(items.Get(numbers[k])); } dic.Put(PdfName.Nums, ar); return(dic); } int skip = NODE_SIZE; PdfDictionary[] kids = new PdfDictionary[(numbers.Length + NODE_SIZE - 1) / NODE_SIZE]; for (int i = 0; i < kids.Length; ++i) { int offset = i * NODE_SIZE; int end = Math.Min(offset + NODE_SIZE, numbers.Length); PdfDictionary dic = new PdfDictionary(); PdfArray arr = new PdfArray(); arr.Add(new PdfNumber((int)numbers[offset])); arr.Add(new PdfNumber((int)numbers[end - 1])); dic.Put(PdfName.Limits, arr); arr = new PdfArray(); for (; offset < end; ++offset) { arr.Add(new PdfNumber((int)numbers[offset])); arr.Add(items.Get(numbers[offset])); } dic.Put(PdfName.Nums, arr); dic.MakeIndirect(catalog.GetDocument()); kids[i] = dic; } int top = kids.Length; while (true) { if (top <= NODE_SIZE) { PdfArray arr = new PdfArray(); for (int k = 0; k < top; ++k) { arr.Add(kids[k]); } PdfDictionary dic = new PdfDictionary(); dic.Put(PdfName.Kids, arr); return(dic); } skip *= NODE_SIZE; int tt = (numbers.Length + skip - 1) / skip; for (int k = 0; k < tt; ++k) { int offset = k * NODE_SIZE; int end = Math.Min(offset + NODE_SIZE, top); PdfDictionary dic = (PdfDictionary) new PdfDictionary().MakeIndirect(catalog.GetDocument()); PdfArray arr = new PdfArray(); arr.Add(new PdfNumber((int)numbers[k * skip])); arr.Add(new PdfNumber((int)numbers[Math.Min((k + 1) * skip, numbers.Length) - 1])); dic.Put(PdfName.Limits, arr); arr = new PdfArray(); for (; offset < end; ++offset) { arr.Add(kids[offset]); } dic.Put(PdfName.Kids, arr); kids[k] = dic; } top = tt; } }
public virtual PdfDictionary BuildTree() { String[] names = new String[items.Count]; names = items.Keys.ToArray(names); iText.IO.Util.JavaUtil.Sort(names); if (names.Length <= NODE_SIZE) { PdfDictionary dic = new PdfDictionary(); PdfArray ar = new PdfArray(); foreach (String name in names) { ar.Add(new PdfString(name, null)); ar.Add(items.Get(name)); } dic.Put(PdfName.Names, ar); return(dic); } int skip = NODE_SIZE; PdfDictionary[] kids = new PdfDictionary[(names.Length + NODE_SIZE - 1) / NODE_SIZE]; for (int k = 0; k < kids.Length; ++k) { int offset = k * NODE_SIZE; int end = Math.Min(offset + NODE_SIZE, names.Length); PdfDictionary dic = new PdfDictionary(); PdfArray arr = new PdfArray(); arr.Add(new PdfString(names[offset], null)); arr.Add(new PdfString(names[end - 1], null)); dic.Put(PdfName.Limits, arr); arr = new PdfArray(); for (; offset < end; ++offset) { arr.Add(new PdfString(names[offset], null)); arr.Add(items.Get(names[offset])); } dic.Put(PdfName.Names, arr); dic.MakeIndirect(catalog.GetDocument()); kids[k] = dic; } int top = kids.Length; while (true) { if (top <= NODE_SIZE) { PdfArray arr = new PdfArray(); for (int i = 0; i < top; ++i) { arr.Add(kids[i]); } PdfDictionary dic = new PdfDictionary(); dic.Put(PdfName.Kids, arr); return(dic); } skip *= NODE_SIZE; int tt = (names.Length + skip - 1) / skip; for (int i_1 = 0; i_1 < tt; ++i_1) { int offset = i_1 * NODE_SIZE; int end = Math.Min(offset + NODE_SIZE, top); PdfDictionary dic = ((PdfDictionary) new PdfDictionary().MakeIndirect(catalog.GetDocument())); PdfArray arr = new PdfArray(); arr.Add(new PdfString(names[i_1 * skip], null)); arr.Add(new PdfString(names[Math.Min((i_1 + 1) * skip, names.Length) - 1], null)); dic.Put(PdfName.Limits, arr); arr = new PdfArray(); for (; offset < end; ++offset) { arr.Add(kids[offset]); } dic.Put(PdfName.Kids, arr); kids[i_1] = dic; } top = tt; } }