diff -Naur src-orig/com/lowagie/text/pdf/PdfPageLabelFormat.java src/com/lowagie/text/pdf/PdfPageLabelFormat.java
--- src-orig/com/lowagie/text/pdf/PdfPageLabelFormat.java 1970-01-01 01:00:00.000000000 +0100
+++ src/com/lowagie/text/pdf/PdfPageLabelFormat.java 2007-06-22 23:24:32.000000000 +0200
@@(protected) @@
+package com.lowagie.text.pdf;
+
+/**
+ * A specification how page labels for a range of pages
+ * should look like. Each page label format is valid for all subsequent
+ * pages that do not define a page label format themselves.
+ */
+public class PdfPageLabelFormat {
+
+ private final int physicalPage;
+ private final int numberStyle;
+ private final String prefix;
+ private final int logicalPage;
+
+ /** Creates a page label format.
+ * @param physicalPage the real page to start the numbering. First page is 1
+ * @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS
+ * @param prefix the text to prefix the number. Can be <CODE>null</CODE> or empty
+ * @param logicalPage the first logical page number
+ */
+ public PdfPageLabelFormat(int physicalPage, int numberStyle, String prefix, int logicalPage) {
+ this.physicalPage = physicalPage;
+ this.numberStyle = numberStyle;
+ this.prefix = prefix;
+ this.logicalPage = logicalPage;
+ }
+
+ public int getPhysicalPage() { return physicalPage; }
+ public int getNumberStyle() { return numberStyle; }
+ public String getPrefix() { return prefix; }
+ public int getLogicalPage() {return logicalPage;}
+}
diff -Naur src-orig/com/lowagie/text/pdf/PdfPageLabels.java src/com/lowagie/text/pdf/PdfPageLabels.java
--- src-orig/com/lowagie/text/pdf/PdfPageLabels.java 2007-06-22 23:16:04.000000000 +0200
+++ src/com/lowagie/text/pdf/PdfPageLabels.java 2007-06-22 23:30:50.000000000 +0200
@@(protected) @@
import
java.util.HashMap;
import
java.util.Iterator;
+import
java.util.Map;
import
java.util.TreeMap;
import
com.lowagie.text.factories.RomanAlphabetFactory;
@@(protected) @@
}
/** Adds or replaces a page label.
+ */
+ public void addPageLabel(PdfPageLabelFormat format) {
+ addPageLabel(format.getPhysicalPage(), format.getNumberStyle(), format.getPrefix(), format.getLogicalPage());
+ }
+
+ /** Adds or replaces a page label.
* @param page the real page to start the numbering. First page is 1
* @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS
* @param text the text to prefix the number. Can be <CODE>null</CODE> or empty
@@(protected) @@
}
return labelstrings;
}
+
+ /**
+ * Retrieves the page labels from a PDF as an array of {@(protected).
+ * @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
+ */
+ public static PdfPageLabelFormat[] getPageLabelFormats(PdfReader reader) {
+ PdfDictionary dict = reader.getCatalog();
+ PdfDictionary labels = (PdfDictionary)PdfReader.getPdfObject((PdfObject)dict.get(PdfName.PAGELABELS));
+ if (labels == null) return new PdfPageLabelFormat[0];
+ PdfArray numbers = (PdfArray)PdfReader.getPdfObject((PdfObject)labels.get(PdfName.NUMS));
+ PdfNumber pageIndex;
+ PdfDictionary pageLabel;
+ TreeMap numberTree = new TreeMap();
+ for (Iterator i = numbers.listIterator(); i.hasNext(); ) {
+ pageIndex = (PdfNumber)i.next();
+ pageLabel = (PdfDictionary) PdfReader.getPdfObject((PdfObject)i.next());
+ numberTree.put(new Integer(pageIndex.intValue()), pageLabel);
+ }
+ PdfPageLabelFormat[] formats = new PdfPageLabelFormat[numberTree.size()];
+ String prefix;
+ int numberStyle;
+ int pagecount;
+ int i=0;
+ for (Iterator it = numberTree.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry) it.next();
+ Integer key = (Integer)entry.getKey();
+ PdfDictionary d = (PdfDictionary) entry.getValue();
+ 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)).toString();
+ } 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[i] = new PdfPageLabelFormat(key.intValue()+1, numberStyle, prefix, pagecount);
+ i++;
+ }
+ return formats;
+ }
}
\ No newline at end of file