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 PdfNameTree { 59 60 private static final int leafSize = 64; 61 62 74 public static PdfDictionary writeTree(HashMap items, PdfWriter writer) throws IOException { 75 if (items.isEmpty()) 76 return null; 77 String names[] = new String [items.size()]; 78 names = (String [])items.keySet().toArray(names); 79 Arrays.sort(names); 80 if (names.length <= leafSize) { 81 PdfDictionary dic = new PdfDictionary(); 82 PdfArray ar = new PdfArray(); 83 for (int k = 0; k < names.length; ++k) { 84 ar.add(new PdfString(names[k], null)); 85 ar.add((PdfObject)items.get(names[k])); 86 } 87 dic.put(PdfName.NAMES, ar); 88 return dic; 89 } 90 int skip = leafSize; 91 PdfIndirectReference kids[] = new PdfIndirectReference[(names.length + leafSize - 1) / leafSize]; 92 for (int k = 0; k < kids.length; ++k) { 93 int offset = k * leafSize; 94 int end = Math.min(offset + leafSize, names.length); 95 PdfDictionary dic = new PdfDictionary(); 96 PdfArray arr = new PdfArray(); 97 arr.add(new PdfString(names[offset], null)); 98 arr.add(new PdfString(names[end - 1], null)); 99 dic.put(PdfName.LIMITS, arr); 100 arr = new PdfArray(); 101 for (; offset < end; ++offset) { 102 arr.add(new PdfString(names[offset], null)); 103 arr.add((PdfObject)items.get(names[offset])); 104 } 105 dic.put(PdfName.NAMES, arr); 106 kids[k] = writer.addToBody(dic).getIndirectReference(); 107 } 108 int top = kids.length; 109 while (true) { 110 if (top <= leafSize) { 111 PdfArray arr = new PdfArray(); 112 for (int k = 0; k < top; ++k) 113 arr.add(kids[k]); 114 PdfDictionary dic = new PdfDictionary(); 115 dic.put(PdfName.KIDS, arr); 116 return dic; 117 } 118 skip *= leafSize; 119 int tt = (names.length + skip - 1 )/ skip; 120 for (int k = 0; k < tt; ++k) { 121 int offset = k * leafSize; 122 int end = Math.min(offset + leafSize, top); 123 PdfDictionary dic = new PdfDictionary(); 124 PdfArray arr = new PdfArray(); 125 arr.add(new PdfString(names[k * skip], null)); 126 arr.add(new PdfString(names[Math.min((k + 1) * skip, names.length) - 1], null)); 127 dic.put(PdfName.LIMITS, arr); 128 arr = new PdfArray(); 129 for (; offset < end; ++offset) { 130 arr.add(kids[offset]); 131 } 132 dic.put(PdfName.KIDS, arr); 133 kids[k] = writer.addToBody(dic).getIndirectReference(); 134 } 135 top = tt; 136 } 137 } 138 139 private static void iterateItems(PdfDictionary dic, HashMap items) { 140 PdfArray nn = (PdfArray)PdfReader.getPdfObjectRelease(dic.get(PdfName.NAMES)); 141 if (nn != null) { 142 ArrayList arr = nn.getArrayList(); 143 for (int k = 0; k < arr.size(); ++k) { 144 PdfString s = (PdfString)PdfReader.getPdfObjectRelease((PdfObject)arr.get(k++)); 145 items.put(PdfEncodings.convertToString(s.getBytes(), null), arr.get(k)); 146 } 147 } 148 else if ((nn = (PdfArray)PdfReader.getPdfObjectRelease(dic.get(PdfName.KIDS))) != null) { 149 ArrayList arr = nn.getArrayList(); 150 for (int k = 0; k < arr.size(); ++k) { 151 PdfDictionary kid = (PdfDictionary)PdfReader.getPdfObjectRelease((PdfObject)arr.get(k)); 152 iterateItems(kid, items); 153 } 154 } 155 } 156 157 public static HashMap readTree(PdfDictionary dic) { 158 HashMap items = new HashMap (); 159 if (dic != null) 160 iterateItems(dic, items); 161 return items; 162 } 163 } | Popular Tags |