//--------------------------------------------------------------------------------------- // Copyright (c) 2001-2008 by PDFTron Systems Inc. All Rights Reserved. // Consult legal.txt regarding legal and license information. //--------------------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace pdftron; using namespace Common; using namespace SDF; using namespace PDF; //----------------------------------------------------------------------------------- // This sample illustrates how to embed various raster image formats // (e.g. TIFF, JPEG, JPEG2000, JBIG2, GIF, PNG, BMP, etc.) in a PDF document. // // Note: On Windows platform this sample utilizes GDI+ and requires GDIPLUS.DLL to // be present in the system path. //----------------------------------------------------------------------------------- int main(int argc, char *argv[]) { int ret = 0; PDFNet::Initialize(); PDFNet::SetResourcesPath("../../../resources"); // Relative path to the folder containing test files. string input_path = "../../TestFiles/"; string output_path = "../../TestFiles/Output/"; try { cout << "-------------------------------------------------" << endl; PDFDoc doc; ElementBuilder f; // Used to build new Element objects ElementWriter writer; // Used to write Elements to the page Page page = doc.PageCreate(); // Start a new page writer.Begin(page); // Begin writing to this page // ---------------------------------------------------------- // Add JPEG image to the output file PDF::Image img = PDF::Image::Create(doc, (input_path + "peppers.jpg").c_str()); Element element = f.CreateImage(img, Matrix2D(200, 0, 0, 250, 50, 500)); writer.WritePlacedElement(element); #ifdef _WIN32 // ---------------------------------------------------------- // Add a PNG image to the output file img = PDF::Image::Create(doc, (input_path + "butterfly.png").c_str()); element = f.CreateImage(img, Matrix2D(img.GetImageWidth(), 0, 0, img.GetImageHeight(), 300, 500)); writer.WritePlacedElement(element); // ---------------------------------------------------------- // Add a GIF image to the output file img = PDF::Image::Create(doc, (input_path + "pdfnet.gif").c_str()); element = f.CreateImage(img, Matrix2D(img.GetImageWidth(), 0, 0, img.GetImageHeight(), 50, 350)); writer.WritePlacedElement(element); // ---------------------------------------------------------- // Add a TIFF image to the output file // Note: encoder hints can be used to select between different compression methods. // For example to instuct PDFNet to compress the image using Flate/PNG compression, // use can use the following encoder hint: // SDF::Array flate_hint; // flate_hint.PushBack(new Name("Flate")); // img = PDF::Image::Create(*doc, (input_path + "grayscale.tif").c_str(), &flate_hint); img = PDF::Image::Create(doc, (input_path + "grayscale.tif").c_str()); element = f.CreateImage(img, Matrix2D(img.GetImageWidth(), 0, 0, img.GetImageHeight(), 10, 50)); writer.WritePlacedElement(element); writer.End(); // Save the page doc.PagePushBack(page); // Add the page to the document page sequence // ---------------------------------------------------------- // Embed a monochrome TIFF. Compress the image using lossy JBIG2 filter. page = doc.PageCreate(PDF::Rect(0, 0, 612, 794)); writer.Begin(page); // begin writing to this page ObjSet hint_set; Obj enc=hint_set.CreateArray(); // Initialize encoder 'hint' parameter enc.PushBackName("JBIG2"); enc.PushBackName("Lossy"); img = PDF::Image::Create(doc, (input_path + "multipage.tif").c_str(), enc); element = f.CreateImage(img, Matrix2D(612, 0, 0, 794, 0, 0)); writer.WritePlacedElement(element); #endif // _WIN32 writer.End(); // Save the page doc.PagePushBack(page); // Add the page to the document page sequence // ---------------------------------------------------------- // Add a JPEG2000 (JP2) image to the output file // Create a new page page = doc.PageCreate(); writer.Begin(page); // Begin writing to the page // Embed the image. img = Image::Create(doc, (input_path + "palm.jp2").c_str()); // Position the image on the page. element = f.CreateImage(img, Matrix2D(img.GetImageWidth(), 0, 0, img.GetImageHeight(), 96, 80)); writer.WritePlacedElement(element); // Write 'JPEG2000 Sample' text string under the image. writer.WriteElement(f.CreateTextBegin(Font::Create(doc, Font::e_times_roman), 32)); element = f.CreateTextRun("JPEG2000 Sample"); element.SetTextMatrix(1, 0, 0, 1, 190, 30); writer.WriteElement(element); writer.WriteElement(f.CreateTextEnd()); writer.End(); // Finish writing to the page doc.PagePushBack(page); //---------------------------------------------------------- /* The following example illustrates how PDFNet can be used for direct embedding of GDI+ bitmaps on Windows platforms. To test the code you will need to link and initialize GDI+. // ---------------------------------------------------------- // Embed a multi-page TIFF to the output file // Start a new page ----------------------------------------- page = doc.PageCreate(PDF::Rect(0, 0, 612, 794)); writer.Begin(page); // begin writing to this page strcpy(szFileName, (input_path + "multipage.tif").c_str()); // Convert ANSI file name to Unicode MultiByteToWideChar(CP_ACP, 0, szFileName, strlen(szFileName) + 1, wszFileName, sizeof(wszFileName)/sizeof(wszFileName[0])); // ---------------------------------------------------------- // Embed the first TIFF page, use JBIG2 Encoding // Use JBIG2 Encoding SDF::Array JBIG2_hint; JBIG2_hint.PushBack(new Name("JBIG2")); bmp = Bitmap::FromFile(wszFileName); PDF::Image img = PDF::Image::Create(*doc, bmp, &JBIG2_hint); PDF::Element* element = f.CreateImage(img, Matrix2D(612, 0, 0, 794, 0, 0)); writer.WritePlacedElement(element); writer.End(); // save changes to the current page doc.PagePushBack(page); // ---------------------------------------------------------- // Embed the second TIFF frame, use JBIG2 Encoding page = doc.PageCreate(); // Create a new page writer.Begin(page); // Begin writing to this page // Select the current TIFF page using SelectActiveFrame bmp->SelectActiveFrame(&FrameDimensionPage, 1); img = PDF::Image::Create(*doc, bmp, &JBIG2_hint); element = f.CreateImage(img, Matrix2D(612, 0, 0, 794, 0, 0)); writer.WritePlacedElement(element); writer.End(); // Finish writing to the page doc.PagePushBack(page); delete bmp; // ---------------------------------------------------------- // The following sample illustrates how to directly embed a JPEG // image in PDF without transcoding. page = doc.PageCreate(); // Create a new page writer.Begin(page); // Begin writing to the page strcpy(szFileName, (input_path + "peppers.jpg").c_str()); // Convert ANSI file name to Unicode MultiByteToWideChar(CP_ACP, 0, szFileName, strlen(szFileName) + 1, wszFileName, sizeof(wszFileName)/sizeof(wszFileName[0])); bmp = Bitmap::FromFile(wszFileName); if (bmp) { Filters::StdFile file((input_path + "peppers.jpg").c_str(), Filters::StdFile::e_read_mode); Filters::FilterReader reader(file); PDF::Image img = PDF::Image::Create(*doc, reader, bmp->GetWidth(), bmp->GetHeight(), 8, ColorSpace::CreateDeviceRGB(), PDF::Image::e_jpeg); // the format of the input data stream Element* element = f.CreateImage(img, Matrix2D(bmp->GetWidth()*1.4, 0, 0, bmp->GetHeight()*1.4, 0, 0)); writer.WritePlacedElement(element); delete bmp; } writer.End(); // Finish writing to the page doc.PagePushBack(page); */ // ---------------------------------------------------------- // doc.Save((output_path + "addimage.pdf").c_str(), Doc::e_remove_unused, 0); doc.Save((output_path + "addimage.pdf").c_str(), SDFDoc::e_linearized, 0); cout << "Done. Result saved in addimage.pdf..." << endl; } catch(Common::Exception& e) { cout << e << endl; ret = 1; } catch(...) { cout << "Unknown Exception" << endl; ret = 1; } PDFNet::Terminate(); return ret; }