/**
* 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.Catalog;
PdfDictionary labels = (PdfDictionary)PdfReader.GetPdfObjectRelease(dict.Get(PdfName.PAGELABELS));
if (labels == null)
{
return(null);
}
Hashtable numberTree = PdfNumberTree.ReadTree(labels);
int[] numbers = new int[numberTree.Count];
numberTree.Keys.CopyTo(numbers, 0);
Array.Sort(numbers);
PdfPageLabelFormat[] formats = new PdfPageLabelFormat[numberTree.Count];
String prefix;
int numberStyle;
int pagecount;
for (int k = 0; k < numbers.Length; ++k)
{
int key = numbers[k];
PdfDictionary d = (PdfDictionary)PdfReader.GetPdfObjectRelease((PdfObject)numberTree[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()[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 + 1, numberStyle, prefix, pagecount);
}
return(formats);
}