internal void SelectPages(ArrayList pagesToKeep) {
IntHashtable pg = new IntHashtable();
ArrayList finalPages = new ArrayList();
int psize = Size;
foreach (int p in pagesToKeep) {
if (p >= 1 && p <= psize && !pg.ContainsKey(p)) {
pg[p] = 1;
finalPages.Add(p);
}
}
if (reader.partial) {
for (int k = 1; k <= psize; ++k) {
GetPageOrigRef(k);
ResetReleasePage();
}
}
PRIndirectReference parent = (PRIndirectReference)reader.catalog.Get(PdfName.PAGES);
PdfDictionary topPages = (PdfDictionary)PdfReader.GetPdfObject(parent);
ArrayList newPageRefs = new ArrayList(finalPages.Count);
PdfArray kids = new PdfArray();
foreach (int p in finalPages) {
PRIndirectReference pref = GetPageOrigRef(p);
ResetReleasePage();
kids.Add(pref);
newPageRefs.Add(pref);
GetPageN(p).Put(PdfName.PARENT, parent);
}
AcroFields af = reader.AcroFields;
bool removeFields = (af.Fields.Count > 0);
for (int k = 1; k <= psize; ++k) {
if (!pg.ContainsKey(k)) {
if (removeFields)
af.RemoveFieldsFromPage(k);
PRIndirectReference pref = GetPageOrigRef(k);
int nref = pref.Number;
reader.xrefObj[nref] = null;
if (reader.partial) {
reader.xref[nref * 2] = -1;
reader.xref[nref * 2 + 1] = 0;
}
}
}
topPages.Put(PdfName.COUNT, new PdfNumber(finalPages.Count));
topPages.Put(PdfName.KIDS, kids);
refsp = null;
refsn = newPageRefs;
}
}