public PdfXObject AddImage(FonetImage img) { // check if already created string url = img.Uri; PdfXObject xObject = (PdfXObject)this.xObjectsMap[url]; if (xObject == null) { PdfICCStream iccStream = null; ColorSpace cs = img.ColorSpace; if (cs.HasICCProfile()) { iccStream = new PdfICCStream(doc.NextObjectId(), cs.GetICCProfile()); iccStream.NumComponents = new PdfNumeric(cs.GetNumComponents()); iccStream.AddFilter(new FlateFilter()); this.objects.Add(iccStream); } // else, create a new one PdfName name = new PdfName("XO" + xObjectsMap.Count); xObject = new PdfXObject(img.Bitmaps, name, doc.NextObjectId()); xObject.SubType = PdfName.Names.Image; xObject.Dictionary[PdfName.Names.Width] = new PdfNumeric(img.Width); xObject.Dictionary[PdfName.Names.Height] = new PdfNumeric(img.Height); xObject.Dictionary[PdfName.Names.BitsPerComponent] = new PdfNumeric(img.BitsPerPixel); // Check for ICC color space if (iccStream != null) { PdfArray ar = new PdfArray(); ar.Add(PdfName.Names.ICCBased); ar.Add(iccStream.GetReference()); xObject.Dictionary[PdfName.Names.ColorSpace] = ar; } else { xObject.Dictionary[PdfName.Names.ColorSpace] = new PdfName(img.ColorSpace.GetColorSpacePDFString()); } xObject.AddFilter(img.Filter); this.objects.Add(xObject); this.xObjectsMap.Add(url, xObject); } return(xObject); }