/** * Gets the page label dictionary to insert into the document. * * @return the page label dictionary */ public PdfDictionary getDictionary(PdfWriter writer) { try { return PdfNumberTree.writeTree(map, writer); } catch (IOException e) { throw new ExceptionConverter(e); } }
/** * Retrieves the page labels from a PDF as an array of String objects. * * @param reader a PdfReader object that has the page labels you want to retrieve * @return a String array or <code>null</code> if no page labels are present */ public static String[] getPageLabels(PdfReader reader) { int n = reader.getNumberOfPages(); PdfDictionary dict = reader.getCatalog(); PdfDictionary labels = (PdfDictionary) PdfReader.getPdfObjectRelease(dict.get(PdfName.PAGELABELS)); if (labels == null) return null; String[] labelstrings = new String[n]; HashMap<Integer, PdfObject> numberTree = PdfNumberTree.readTree(labels); int pagecount = 1; Integer current; String prefix = ""; char type = 'D'; for (int i = 0; i < n; i++) { current = Integer.valueOf(i); if (numberTree.containsKey(current)) { PdfDictionary d = (PdfDictionary) PdfReader.getPdfObjectRelease(numberTree.get(current)); if (d.contains(PdfName.ST)) { pagecount = ((PdfNumber) d.get(PdfName.ST)).intValue(); } else { pagecount = 1; } if (d.contains(PdfName.P)) { prefix = ((PdfString) d.get(PdfName.P)).toUnicodeString(); } if (d.contains(PdfName.S)) { type = ((PdfName) d.get(PdfName.S)).toString().charAt(1); } else { type = 'e'; } } switch (type) { default: labelstrings[i] = prefix + pagecount; break; case 'R': labelstrings[i] = prefix + RomanNumberFactory.getUpperCaseString(pagecount); break; case 'r': labelstrings[i] = prefix + RomanNumberFactory.getLowerCaseString(pagecount); break; case 'A': labelstrings[i] = prefix + RomanAlphabetFactory.getUpperCaseString(pagecount); break; case 'a': labelstrings[i] = prefix + RomanAlphabetFactory.getLowerCaseString(pagecount); break; case 'e': labelstrings[i] = prefix; break; } pagecount++; } return labelstrings; }
/** * Retrieves the page labels from a PDF as an array of {@link PdfPageLabelFormat} objects. * * @param reader a PdfReader object that has the page labels you want to retrieve * @return a PdfPageLabelEntry array, containing an entry for each format change or <code>null * </code> if no page labels are present */ public static PdfPageLabelFormat[] getPageLabelFormats(PdfReader reader) { PdfDictionary dict = reader.getCatalog(); PdfDictionary labels = (PdfDictionary) PdfReader.getPdfObjectRelease(dict.get(PdfName.PAGELABELS)); if (labels == null) return null; HashMap<Integer, PdfObject> numberTree = PdfNumberTree.readTree(labels); Integer numbers[] = new Integer[numberTree.size()]; numbers = numberTree.keySet().toArray(numbers); Arrays.sort(numbers); PdfPageLabelFormat[] formats = new PdfPageLabelFormat[numberTree.size()]; String prefix; int numberStyle; int pagecount; for (int k = 0; k < numbers.length; ++k) { Integer key = numbers[k]; PdfDictionary d = (PdfDictionary) PdfReader.getPdfObjectRelease(numberTree.get(key)); if (d.contains(PdfName.ST)) { pagecount = ((PdfNumber) d.get(PdfName.ST)).intValue(); } else { pagecount = 1; } if (d.contains(PdfName.P)) { prefix = ((PdfString) d.get(PdfName.P)).toUnicodeString(); } else { prefix = ""; } if (d.contains(PdfName.S)) { char type = ((PdfName) d.get(PdfName.S)).toString().charAt(1); switch (type) { case 'R': numberStyle = UPPERCASE_ROMAN_NUMERALS; break; case 'r': numberStyle = LOWERCASE_ROMAN_NUMERALS; break; case 'A': numberStyle = UPPERCASE_LETTERS; break; case 'a': numberStyle = LOWERCASE_LETTERS; break; default: numberStyle = DECIMAL_ARABIC_NUMERALS; break; } } else { numberStyle = EMPTY; } formats[k] = new PdfPageLabelFormat(key.intValue() + 1, numberStyle, prefix, pagecount); } return formats; }