#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace trn; using namespace Common; using namespace SDF; using namespace PDF; void ProcessElements(ElementReader& reader); void ProcessText(ElementReader& reader); void ProcessText(ElementReader& reader) { Element* element; for (element = reader.Next(); element; element = reader.Next()) // Read page contents { switch (element->GetType()) { case Element::e_text_end: return; case Element::e_text: { GState* gs = element->GetGState(); Font font = gs->GetFont(); if (font.GetType() == Font::e_Type3) { CharIterator itrEnd = element->CharEnd(); for (CharIterator itr = element->CharBegin(); itr != itrEnd; ++itr) { CharData charData = *itr; Obj* type3GlyphStream = font.GetType3GlyphStream(charData.char_code); if (type3GlyphStream) { ElementReader er; er.Begin(type3GlyphStream, ); Element* el; cout << "Iterating..."; for (el = er.Next(); el; el = er.Next()) { // fails while iterating } cout << "done.\n"; er.End(); } reader.Type3FontBegin(*itr); ProcessElements(reader); reader.End(); } } } break; } } } void ProcessElements(ElementReader& reader) { Element* element; for (element = reader.Next(); element; element = reader.Next()) // Read page contents { switch (element->GetType()) { case Element::e_text_begin: { ProcessText(reader); } break; case Element::e_form: { reader.FormBegin(); ProcessElements(reader); reader.End(); } break; } } } int main(int argc, char *argv[]) { PDFNet::Initialize(); try { vector buffer; { FILE* fp = 0; fopen_s(&fp, "c:\\1.pdf", "rb"); if (fp != 0) { fseek(fp, 0, SEEK_END); size_t fpSize = ftell(fp); buffer.resize(fpSize); fseek(fp, 0, SEEK_SET); fread(&(buffer[0]), sizeof (char), buffer.size(), fp); fclose(fp); } } PDFDoc doc((const char*) &(buffer[0]), buffer.size()); int pageCount = doc.GetPageCount(); for (int i = 1; i <= pageCount; ++i) { Page page = doc.GetPage(i); ElementReader er; er.Begin(page); ProcessElements(er); er.End(); } } catch (Exception& e) { cerr << e << "\n"; } catch (exception& e) { cerr << e.what() << "\n"; } catch (...) { cerr << "Unknown error!\n"; } PDFNet::Terminate(); return 0; }