EStatusCode PFMFileReader::Read(const string& inPFMFilePath) { EStatusCode status = PDFHummus::eSuccess; mInternalReadStatus = PDFHummus::eSuccess; InputFile pfmFile; status = pfmFile.OpenFile(inPFMFilePath); if(status != PDFHummus::eSuccess) { TRACE_LOG1("PFMFileReader::Read, unable to open PFM file in %s",inPFMFilePath.c_str()); return status; } do { mReaderStream = pfmFile.GetInputStream(); status = ReadHeader(); if(status != PDFHummus::eSuccess) break; status = ReadExtension(); if(status != PDFHummus::eSuccess) break; status = ReadExtendedFontMetrics(); if(status != PDFHummus::eSuccess) break; }while(false); pfmFile.CloseFile(); return status; }
EStatusCode PreprocessorTest::RunTest(const string& inName, const string& inOriginalFile, const string& inOutputFile, const string& inComparisonFile) { EStatusCode status = eSuccess; StringToStringMap preprocessorDefinitions; StringList includeFolders; includeFolders.push_back(scSamplesBasePath); preprocessorDefinitions.insert(StringToStringMap::value_type("PREDEFINED_SYMBOL","2")); InputFile sourceFile; sourceFile.OpenFile(inOriginalFile); OutputFile outputFile; outputFile.OpenFile(inOutputFile); mCurrentStream = outputFile.GetOutputStream(); PreProcessor preProcessor; preProcessor.Setup(sourceFile.GetInputStream(),inOriginalFile,preprocessorDefinitions,includeFolders); preProcessor.AddListener(this); mStartRow = true; BoolAndString tokenizerResult = preProcessor.GetNextToken(); while(tokenizerResult.first) { if(!mStartRow) mCurrentStream->Write((const Byte*)" ",2); // 2 spaces, so we can clearly distinct tokens mCurrentStream->Write((const Byte*)tokenizerResult.second.c_str(),tokenizerResult.second.size()); mStartRow = false; tokenizerResult = preProcessor.GetNextToken(); } sourceFile.CloseFile(); outputFile.CloseFile(); mCurrentStream = NULL; SimpleFileComparer comparer; if(!comparer.Same(inOutputFile,inComparisonFile)) { cout<<"TokenizerTest::Run, failed in test named "<<inName<<". see result in "<<inOutputFile<<" and compare with the required result in "<<inComparisonFile<<"\n"; status = eFailure; } return status; }
EStatusCode OpenTypeFileInput::ReadOpenTypeFile(const std::string& inFontFilePath, unsigned short inFaceIndex) { InputFile fontFile; EStatusCode status = fontFile.OpenFile(inFontFilePath); if(status != PDFHummus::eSuccess) { TRACE_LOG1("OpenTypeFileInput::ReadOpenTypeFile, cannot open true type font file at %s",inFontFilePath.c_str()); return status; } status = ReadOpenTypeFile(fontFile.GetInputStream(), inFaceIndex); fontFile.CloseFile(); return status; }
EStatusCode PFBStreamTest::Run(const TestConfiguration& inTestConfiguration) { EStatusCode status; InputFile pfbFile; OutputFile decodedPFBFile; InputPFBDecodeStream decodeStream; do { pfbFile.OpenFile(RelativeURLToLocalPath(inTestConfiguration.mSampleFileBase,"TestMaterials/fonts/HLB_____.PFB")); decodedPFBFile.OpenFile(RelativeURLToLocalPath(inTestConfiguration.mSampleFileBase,"decodedPFBFile.txt")); status = decodeStream.Assign(pfbFile.GetInputStream()); if(status != PDFHummus::eSuccess) { cout<<"Failed to assign pfb input stream"; break; } OutputStreamTraits traits(decodedPFBFile.GetOutputStream()); status = traits.CopyToOutputStream(&decodeStream); if(status != PDFHummus::eSuccess) { cout<<"Failed to decode pfb stream"; break; } }while(false); decodeStream.Assign(NULL); pfbFile.CloseFile(); decodedPFBFile.CloseFile(); return status; }
EStatusCode InputImagesAsStreamsTest::Run() { // A minimal test to see if images as streams work. i'm using regular file streams, just to show the point // obviously this is quite a trivial case. PDFWriter pdfWriter; EStatusCode status; do { status = pdfWriter.StartPDF("C:\\PDFLibTests\\ImagesInStreams.PDF",ePDFVersion13); if(status != PDFHummus::eSuccess) { cout<<"failed to start PDF\n"; break; } PDFPage* page = new PDFPage(); page->SetMediaBox(PDFRectangle(0,0,595,842)); // JPG image InputFile jpgImage; status = jpgImage.OpenFile("C:\\PDFLibTests\\TestMaterials\\images\\otherStage.JPG"); if(status != PDFHummus::eSuccess) { cout<<"failed to open JPG image in"<<"C:\\PDFLibTests\\TestMaterials\\images\\otherStage.JPG"<<"\n"; break; } PDFFormXObject* formXObject = pdfWriter.CreateFormXObjectFromJPGStream(jpgImage.GetInputStream()); if(!formXObject) { cout<<"failed to create form XObject from file\n"; status = PDFHummus::eFailure; break; } jpgImage.CloseFile(); PageContentContext* pageContentContext = pdfWriter.StartPageContentContext(page); if(NULL == pageContentContext) { status = PDFHummus::eFailure; cout<<"failed to create content context for page\n"; } pageContentContext->q(); pageContentContext->cm(1,0,0,1,0,400); pageContentContext->Do(page->GetResourcesDictionary().AddFormXObjectMapping(formXObject->GetObjectID())); pageContentContext->Q(); delete formXObject; status = pdfWriter.EndPageContentContext(pageContentContext); if(status != PDFHummus::eSuccess) { cout<<"failed to end page content context\n"; break; } status = pdfWriter.WritePageAndRelease(page); if(status != PDFHummus::eSuccess) { cout<<"failed to write page\n"; break; } // TIFF image page = new PDFPage(); page->SetMediaBox(PDFRectangle(0,0,595,842)); InputFile tiffFile; status = tiffFile.OpenFile("C:\\PDFLibTests\\TestMaterials\\images\\tiff\\FLAG_T24.TIF"); if(status != PDFHummus::eSuccess) { cout<<"failed to open TIFF image in"<<"C:\\PDFLibTests\\TestMaterials\\images\\tiff\\FLAG_T24.TIF"<<"\n"; break; } formXObject = pdfWriter.CreateFormXObjectFromTIFFStream(tiffFile.GetInputStream()); if(!formXObject) { cout<<"failed to create image form XObject for TIFF\n"; status = PDFHummus::eFailure; break; } tiffFile.CloseFile(); pageContentContext = pdfWriter.StartPageContentContext(page); if(NULL == pageContentContext) { status = PDFHummus::eFailure; cout<<"failed to create content context for page with TIFF image\n"; } // continue page drawing, place the image in 0,0 (playing...could avoid CM at all) pageContentContext->q(); pageContentContext->cm(1,0,0,1,0,0); pageContentContext->Do(page->GetResourcesDictionary().AddFormXObjectMapping(formXObject->GetObjectID())); pageContentContext->Q(); delete formXObject; status = pdfWriter.EndPageContentContext(pageContentContext); if(status != PDFHummus::eSuccess) { cout<<"failed to end page content context for TIFF\n"; break; } status = pdfWriter.WritePageAndRelease(page); if(status != PDFHummus::eSuccess) { cout<<"failed to write page, for TIFF\n"; break; } // PDF InputFile pdfFile; status = pdfFile.OpenFile("C:\\PDFLibTests\\TestMaterials\\Original.pdf"); if(status != PDFHummus::eSuccess) { cout<<"failed to open PDF file in"<<"C:\\PDFLibTests\\TestMaterials\\Original.pdf"<<"\n"; break; } status = pdfWriter.AppendPDFPagesFromPDF(pdfFile.GetInputStream(),PDFPageRange()).first; if(status != PDFHummus::eSuccess) { cout<<"failed to append pages from Original.PDF\n"; break; } pdfFile.CloseFile(); status = pdfWriter.EndPDF(); if(status != PDFHummus::eSuccess) { cout<<"failed in end PDF\n"; break; } } while(false); return status; }
EStatusCode CustomLogTest::Run() { // Place log in a compressed stream, for a non-file PDF EStatusCode status; OutputFlateEncodeStream flateEncodeStream; OutputFlateDecodeStream flateDecodeStream; do { PDFWriter pdfWriter; OutputFile compressedLogFile; OutputStringBufferStream pdfStream; // setup log file with compression status = compressedLogFile.OpenFile("c:\\PDFLibTests\\CustomLogEncrypted.txt"); if(status != PDFHummus::eSuccess) break; flateEncodeStream.Assign(compressedLogFile.GetOutputStream()); // generate PDF TRACE_LOG("Starting PDF File Writing"); status = pdfWriter.StartPDFForStream(&pdfStream,ePDFVersion13,LogConfiguration(true,&flateEncodeStream)); if(status != PDFHummus::eSuccess) break; TRACE_LOG("Now will add an empty page"); PDFPage* page = new PDFPage(); page->SetMediaBox(PDFRectangle(0,0,400,400)); status = pdfWriter.WritePageAndRelease(page); if(status != PDFHummus::eSuccess) break; TRACE_LOG("Added page, now will close"); status = pdfWriter.EndPDFForStream(); if(status != PDFHummus::eSuccess) break; // since log was started by starting PDF...the ending resets it. so let's now begin again Singleton<Trace>::GetInstance()->SetLogSettings(&flateEncodeStream,true); TRACE_LOG("Finished PDF!!!1"); // dump PDF to a file, so we can review it OutputFile pdfFile; status = pdfFile.OpenFile("c:\\PDFLibTests\\DumpPDFFile.pdf"); if(status != PDFHummus::eSuccess) break; string pdfString = pdfStream.ToString(); pdfFile.GetOutputStream()->Write((const Byte*)pdfString.c_str(),pdfString.size()); pdfFile.CloseFile(); TRACE_LOG("PDF stream dumped"); // now finalize trace compressed file flateEncodeStream.Assign(NULL); compressedLogFile.CloseFile(); // Finish log Singleton<Trace>::Reset(); // now open a new file and decompress the log into it. OutputFile decryptedLogFile; status = decryptedLogFile.OpenFile("c:\\PDFLibTests\\CustomLogDecrypted.txt"); if(status != PDFHummus::eSuccess) break; // place an initial bom (cause the compressed content is unicode) unsigned short bom = (0xFE<<8) + 0xFF; decryptedLogFile.GetOutputStream()->Write((const Byte*)&bom,2); flateDecodeStream.Assign(decryptedLogFile.GetOutputStream()); OutputStreamTraits traits(&flateDecodeStream); InputFile compressedLogFileInput; status = compressedLogFileInput.OpenFile("c:\\PDFLibTests\\CustomLogEncrypted.txt"); if(status != PDFHummus::eSuccess) break; status = traits.CopyToOutputStream(compressedLogFileInput.GetInputStream()); if(status != PDFHummus::eSuccess) break; compressedLogFileInput.CloseFile(); flateDecodeStream.Assign(NULL); decryptedLogFile.CloseFile(); }while(false); if(status != PDFHummus::eSuccess) { // cancel ownership of subsstreams flateDecodeStream.Assign(NULL); flateEncodeStream.Assign(NULL); } return status; }