Esempio n. 1
0
 /// <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));
     }
 }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
        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;
            }
        }