| 1 47 package com.lowagie.text.pdf; 48 49 import java.io.IOException ; 50 import java.util.ArrayList ; 51 import java.util.Arrays ; 52 import java.util.HashMap ; 53 54 58 public class PdfNumberTree { 59 60 private static final int leafSize = 64; 61 62 70 public static PdfDictionary writeTree(HashMap items, PdfWriter writer) throws IOException { 71 if (items.isEmpty()) 72 return null; 73 Integer numbers[] = new Integer [items.size()]; 74 numbers = (Integer [])items.keySet().toArray(numbers); 75 Arrays.sort(numbers); 76 if (numbers.length <= leafSize) { 77 PdfDictionary dic = new PdfDictionary(); 78 PdfArray ar = new PdfArray(); 79 for (int k = 0; k < numbers.length; ++k) { 80 ar.add(new PdfNumber(numbers[k].intValue())); 81 ar.add((PdfObject)items.get(numbers[k])); 82 } 83 dic.put(PdfName.NUMS, ar); 84 return dic; 85 } 86 int skip = leafSize; 87 PdfIndirectReference kids[] = new PdfIndirectReference[(numbers.length + leafSize - 1) / leafSize]; 88 for (int k = 0; k < kids.length; ++k) { 89 int offset = k * leafSize; 90 int end = Math.min(offset + leafSize, numbers.length); 91 PdfDictionary dic = new PdfDictionary(); 92 PdfArray arr = new PdfArray(); 93 arr.add(new PdfNumber(numbers[offset].intValue())); 94 arr.add(new PdfNumber(numbers[end - 1].intValue())); 95 dic.put(PdfName.LIMITS, arr); 96 arr = new PdfArray(); 97 for (; offset < end; ++offset) { 98 arr.add(new PdfNumber(numbers[offset].intValue())); 99 arr.add((PdfObject)items.get(numbers[offset])); 100 } 101 dic.put(PdfName.NUMS, arr); 102 kids[k] = writer.addToBody(dic).getIndirectReference(); 103 } 104 int top = kids.length; 105 while (true) { 106 if (top <= leafSize) { 107 PdfArray arr = new PdfArray(); 108 for (int k = 0; k < top; ++k) 109 arr.add(kids[k]); 110 PdfDictionary dic = new PdfDictionary(); 111 dic.put(PdfName.KIDS, arr); 112 return dic; 113 } 114 skip *= leafSize; 115 int tt = (numbers.length + skip - 1 )/ skip; 116 for (int k = 0; k < tt; ++k) { 117 int offset = k * leafSize; 118 int end = Math.min(offset + leafSize, top); 119 PdfDictionary dic = new PdfDictionary(); 120 PdfArray arr = new PdfArray(); 121 arr.add(new PdfNumber(numbers[k * skip].intValue())); 122 arr.add(new PdfNumber(numbers[Math.min((k + 1) * skip, numbers.length) - 1].intValue())); 123 dic.put(PdfName.LIMITS, arr); 124 arr = new PdfArray(); 125 for (; offset < end; ++offset) { 126 arr.add(kids[offset]); 127 } 128 dic.put(PdfName.KIDS, arr); 129 kids[k] = writer.addToBody(dic).getIndirectReference(); 130 } 131 top = tt; 132 } 133 } 134 135 private static void iterateItems(PdfDictionary dic, HashMap items) { 136 PdfArray nn = (PdfArray)PdfReader.getPdfObjectRelease(dic.get(PdfName.NUMS)); 137 if (nn != null) { 138 ArrayList arr = nn.getArrayList(); 139 for (int k = 0; k < arr.size(); ++k) { 140 PdfNumber s = (PdfNumber)PdfReader.getPdfObjectRelease((PdfObject)arr.get(k++)); 141 items.put(new Integer (s.intValue()), arr.get(k)); 142 } 143 } 144 else if ((nn = (PdfArray)PdfReader.getPdfObjectRelease(dic.get(PdfName.KIDS))) != null) { 145 ArrayList arr = nn.getArrayList(); 146 for (int k = 0; k < arr.size(); ++k) { 147 PdfDictionary kid = (PdfDictionary)PdfReader.getPdfObjectRelease((PdfObject)arr.get(k)); 148 iterateItems(kid, items); 149 } 150 } 151 } 152 153 public static HashMap readTree(PdfDictionary dic) { 154 HashMap items = new HashMap (); 155 if (dic != null) 156 iterateItems(dic, items); 157 return items; 158 } 159 } | Popular Tags |