void showPagesInfo(PDFParser& parser, InputFile& pdfFile, EStatusCode status) { for(unsigned long i=0; i < parser.GetPagesCount() && eSuccess == status; ++i) { cout << "Showing info for page " << i << ":\n"; // Parse page object RefCountPtr<PDFDictionary> page(parser.ParsePage(i)); // check XObject referenences checkXObjectRef(parser,page); // show page content RefCountPtr<PDFObject> contents(parser.QueryDictionaryObject(page.GetPtr(),"Contents")); if(!contents) { cout << "No contents for this page\n"; continue; } // content may be array or single cout << "Showing content of page:\n"; showPageContent(parser,contents,pdfFile); cout << "End page content\n"; } }
EStatusCode parsePDF() { PDFParser parser; InputFile pdfFile; EStatusCode status = pdfFile.OpenFile(scBasePath + "XObjectContent.PDF"); if(status != eSuccess) return status; status = parser.StartPDFParsing(pdfFile.GetInputStream()); if(status != eSuccess) return status; showPDFinfo(parser); // Just wcout some info (no iteration) showPagesInfo(parser,pdfFile,status); return status; }
void checkXObjectRef(PDFParser& parser,RefCountPtr<PDFDictionary> page) { PDFObjectCastPtr<PDFDictionary> resources(parser.QueryDictionaryObject(page.GetPtr(),"Resources")); if(!resources) { wcout << "No XObject in this page\n"; return; } PDFObjectCastPtr<PDFDictionary> xobjects(parser.QueryDictionaryObject(resources.GetPtr(),"XObject")); if(!xobjects) { wcout << "No XObject in this page\n"; return; } cout << "Displaying XObjects information for this page:\n"; showXObjectsPerPageInfo(parser,xobjects); }
void showContentStream(PDFStreamInput* inStream,IByteReaderWithPosition* inPDFStream,PDFParser& inParser) { IByteReader* streamReader = inParser.CreateInputStreamReader(inStream); Byte buffer[1000]; if(streamReader) { inPDFStream->SetPosition(inStream->GetStreamContentStart()); while(streamReader->NotEnded()) { LongBufferSizeType readAmount = streamReader->Read(buffer,1000); cout.write((const char*)buffer,readAmount); } cout << "\n"; } else cout << "Unable to read content stream\n"; delete streamReader; }
void showXObjectsPerPageInfo(PDFParser& parser,PDFObjectCastPtr<PDFDictionary> xobjects) { RefCountPtr<PDFName> key; PDFObjectCastPtr<PDFIndirectObjectReference> value; MapIterator<PDFNameToPDFObjectMap> it = xobjects->GetIterator(); while(it.MoveNext()) { key = it.GetKey(); value = it.GetValue(); cout << "XObject named " << key->GetValue().c_str() << " is object " << value->mObjectID << " of type "; PDFObjectCastPtr<PDFStreamInput> xobject(parser.ParseNewObject(value->mObjectID)); PDFObjectCastPtr<PDFDictionary> xobjectDictionary(xobject->QueryStreamDictionary()); PDFObjectCastPtr<PDFName> typeOfXObject = xobjectDictionary->QueryDirectObject("Subtype"); cout << typeOfXObject->GetValue().c_str() << "\n"; } }
void showPageContent(PDFParser& parser, RefCountPtr<PDFObject> contents, InputFile& pdfFile) { if(contents->GetType() == ePDFObjectArray) { PDFObjectCastPtr<PDFIndirectObjectReference> streamReferences; SingleValueContainerIterator<PDFObjectVector> itContents = ((PDFArray*)contents.GetPtr())->GetIterator(); // array of streams while(itContents.MoveNext()) { streamReferences = itContents.GetItem(); PDFObjectCastPtr<PDFStreamInput> stream = parser.ParseNewObject(streamReferences->mObjectID); showContentStream(stream.GetPtr(),pdfFile.GetInputStream(),parser); } } else { // stream showContentStream((PDFStreamInput*)contents.GetPtr(),pdfFile.GetInputStream(),parser); } }
void showPDFinfo(PDFParser& parser) { cout << "PDF Header level = " << parser.GetPDFLevel() << "\n"; cout << "Number of objects in PDF = " << parser.GetObjectsCount() << "\n"; cout << "Number of pages in PDF = " << parser.GetPagesCount() << "\n"; }
EStatusCode RotatedPagesPDF::Run(const TestConfiguration& inTestConfiguration) { LogConfiguration logConfiguration(true,true,RelativeURLToLocalPath(inTestConfiguration.mSampleFileBase,"RotatedPagesLog.txt")); EStatusCode status; do { // PDF Page rotation writing PDFWriter pdfWriter; status = pdfWriter.StartPDF( RelativeURLToLocalPath(inTestConfiguration.mSampleFileBase,"RotatedPages.pdf"), ePDFVersion13,logConfiguration); if(status != PDFHummus::eSuccess) { cout<<"failed to start RotatedPages.pdf\n"; break; } AbstractContentContext::TextOptions textOptions(pdfWriter.GetFontForFile( RelativeURLToLocalPath( inTestConfiguration.mSampleFileBase, "TestMaterials/fonts/arial.ttf")), 14, AbstractContentContext::eGray, 0); for(int i=0;i<6 && PDFHummus::eSuccess == status;++i) { PDFPage page; page.SetMediaBox(PDFRectangle(0,0,595,842)); page.SetRotate(33); if ( page.GetRotate().second != 0 ) { status = PDFHummus::eFailure; cout<<"Failed to reject invalid rotation\n"; break; } page.SetRotate(i*90); std::ostringstream s; s << "Page rotated by " << i*90 << " degrees."; PageContentContext* cxt = pdfWriter.StartPageContentContext(&page); cxt->WriteText(75,805,s.str(),textOptions); status = pdfWriter.EndPageContentContext(cxt); if(status != eSuccess) { status = PDFHummus::eFailure; cout<<"Failed to end content context\n"; break; } status = pdfWriter.WritePage(&page); if(status != PDFHummus::eSuccess) cout<<"failed to write page "<<i<<"\n"; } status = pdfWriter.EndPDF(); if(status != PDFHummus::eSuccess) { cout<<"failed in end RotatedPages.pdf\n"; break; } // PDF page rotation copy status = pdfWriter.StartPDF( RelativeURLToLocalPath(inTestConfiguration.mSampleFileBase,"RotatedPagesCopy.pdf"), ePDFVersion13); if(status != PDFHummus::eSuccess) { cout<<"failed to start RotatedPagesCopy.pdf\n"; break; } EStatusCodeAndObjectIDTypeList result; // append pages result = pdfWriter.AppendPDFPagesFromPDF( RelativeURLToLocalPath(inTestConfiguration.mSampleFileBase,"RotatedPages.pdf"), PDFPageRange()); if(result.first != PDFHummus::eSuccess) { cout<<"failed to append pages from RotatedPages.pdf\n"; status = result.first; break; } status = pdfWriter.EndPDF(); if(status != PDFHummus::eSuccess) { cout<<"failed in end RotatedPagesCopy.pdf\n"; break; } // PDF Page rotation parsing InputFile pdfFile; PDFParser pdfParser; status = pdfFile.OpenFile( RelativeURLToLocalPath(inTestConfiguration.mSampleFileBase,"RotatedPagesCopy.pdf")); if(status != PDFHummus::eSuccess) { cout<<"unable to open file RotatedPagesCopy.pdf for reading.\n"; break; } status = pdfParser.StartPDFParsing(pdfFile.GetInputStream()); if(status != PDFHummus::eSuccess) { cout<<"unable to parse input file"; break; } if(pdfParser.GetPagesCount() != 6) { cout<<"expecting 6 pages, got "<<pdfParser.GetPagesCount()<<"\n"; status = PDFHummus::eFailure; break; } for(unsigned long i=0;i<pdfParser.GetPagesCount() && PDFHummus::eSuccess == status;++i) { RefCountPtr<PDFDictionary> page = pdfParser.ParsePage(i); if (!page) { cout << i << ". page parsing failed\n"; status = PDFHummus::eFailure; break; } PDFPageInput input( &pdfParser, page ); if ( input.GetRotate() != i*90 ) { cout<< i << ". page has invalid rotation\n"; status = PDFHummus::eFailure; break; } } }while(false); return status; }