static void ProcessElements(ElementReader reader, ElementWriter writer, XSet visited) { Element element; while ((element = reader.Next()) != null) // Read page contents { switch (element.GetType()) { case Element.Type.e_image: case Element.Type.e_inline_image: // remove all images by skipping them break; case Element.Type.e_path: { // Set all paths to red color. GState gs = element.GetGState(); gs.SetFillColorSpace(ColorSpace.CreateDeviceRGB()); gs.SetFillColor(new ColorPt(1, 0, 0)); writer.WriteElement(element); break; } case Element.Type.e_text: { // Set all text to blue color. GState gs = element.GetGState(); gs.SetFillColorSpace(ColorSpace.CreateDeviceRGB()); gs.SetFillColor(new ColorPt(0, 0, 1)); writer.WriteElement(element); break; } case Element.Type.e_form: { writer.WriteElement(element); // write Form XObject reference to current stream Obj form_obj = element.GetXObject(); if (!visited.Contains(form_obj.GetObjNum())) // if this XObject has not been processed { // recursively process the Form XObject visited.Add(form_obj.GetObjNum()); ElementWriter new_writer = new ElementWriter(); reader.FormBegin(); new_writer.Begin(form_obj, true); reader.ClearChangeList(); new_writer.SetDefaultGState(reader); ProcessElements(reader, new_writer, visited); new_writer.End(); reader.End(); } break; } default: writer.WriteElement(element); break; } } }