// // Copyright (c) 2001-2019 by PDFTron Systems Inc. All Rights Reserved. // using System; using System.Drawing; using System.Drawing.Imaging; using pdftron; using pdftron.Common; using pdftron.PDF; using pdftron.SDF; using pdftron.Filters; using System.IO; namespace ImageExtractTestCS { class Class1 { private static pdftron.PDFNetLoader pdfNetLoader = pdftron.PDFNetLoader.Instance(); static Class1() { } static int image_counter = 0; // Relative path to the folder containing test files. static string input_path = "../../../../TestFiles/"; static string output_path = @"D:\Ryan\clients\serrala\20947\"; static void ImageExtract(PDFDoc doc, ElementReader reader) { Element element; while ((element = reader.Next()) != null) { switch (element.GetType()) { case Element.Type.e_image: case Element.Type.e_inline_image: { Console.WriteLine("--> Image: {0}", ++image_counter); Console.WriteLine(" Width: {0}", element.GetImageWidth()); Console.WriteLine(" Height: {0}", element.GetImageHeight()); Console.WriteLine(" BPC: {0}", element.GetBitsPerComponent()); Matrix2D ctm = element.GetCTM(); double x2 = 1, y2 = 1, y1 = ctm.m_v; ctm.Mult(ref x2, ref y2); // Write the coords to 3 decimal places. Console.WriteLine(" Coords: x1={0:N2}, y1={1:N2}, x2={2:N2}, y2={3:N2}", ctm.m_h, ctm.m_v, x2, y2); pdftron.PDF.Image image = null; if (element.GetType() == Element.Type.e_image) { image = new pdftron.PDF.Image(element.GetXObject()); } else // inline image { if (y1 > y2) { byte[] flipped_image = FlipImage(element); image = pdftron.PDF.Image.Create(doc, flipped_image, element.GetImageWidth(), element.GetImageHeight(), 8, ColorSpace.CreateDeviceRGB()); } else { Image2RGB image2rgb = new Image2RGB(element); FilterReader image_reader = new FilterReader(image2rgb); image = pdftron.PDF.Image.Create(doc, image_reader, element.GetImageWidth(), element.GetImageHeight(), 8, ColorSpace.CreateDeviceRGB()); } } string fname = output_path + "image_extract1_" + image_counter.ToString(); pdftron.Filters.MemoryFilter mf = new pdftron.Filters.MemoryFilter(0, false); // zero, since we don't know how big the TIFF will be, and false = sink FilterWriter fw = new FilterWriter(mf); int imageType = image.Export(fw); if(imageType == 0) { fname += ".png"; } else if(imageType == 1) { fname += ".tif"; } else if (imageType == 2) { fname += ".jpg"; } else { throw new Exception("Unknown image type"); } mf.SetAsInputFilter(); // switch the MemoryFilter to a source FilterReader filterReader = new FilterReader(mf); byte[] buffer = new byte[1024]; // 1KiB buffer using (FileStream ostm = new FileStream(fname, FileMode.Create, FileAccess.Write)) { int bytesRead = filterReader.Read(buffer); while (bytesRead > 0) { // for demo purpose, now write to disk, but this can be any stream/buffer ostm.Write(buffer, 0, bytesRead); bytesRead = filterReader.Read(buffer); } } //mf.WriteToFile(fname, false); // for demo purpose write to disk // See here for another example reading MemoryFilter break; } case Element.Type.e_form: // Process form XObjects { reader.FormBegin(); ImageExtract(doc, reader); reader.End(); break; } } } } static byte[] FlipImage(Element element) { Image2RGB image2rgb = new Image2RGB(element); int width = element.GetImageWidth(); int height = element.GetImageHeight(); int out_data_sz = width * height * 3; int stride = width * 3; FilterReader reader = new FilterReader(image2rgb); byte[] image_data = new byte[out_data_sz]; byte[] flipped_data = new byte[out_data_sz]; reader.Read(image_data); for (int row = 0; row < height; ++row) { Buffer.BlockCopy(image_data, row * stride, flipped_data, out_data_sz - (stride * (row + 1)), stride); } return flipped_data; } static void Main(string[] args) { PDFNet.Initialize(); // Example 1: // Extract images by traversing the display list for // every page. With this approach it is possible to obtain // image positioning information and DPI. try { using (PDFDoc doc = new PDFDoc(your_pdf)) using (ElementReader reader = new ElementReader()) { doc.InitSecurityHandler(); PageIterator itr; for (itr = doc.GetPageIterator(); itr.HasNext(); itr.Next()) { reader.Begin(itr.Current()); ImageExtract(doc, reader); reader.End(); } Console.WriteLine("Done."); } } catch (PDFNetException e) { Console.WriteLine(e.Message); } Console.WriteLine("----------------------------------------------------------------"); } } }