// constructor /** * Constructs a <CODE>PdfImage</CODE>-object. * * @param image the <CODE>Image</CODE>-object * @param name the <CODE>PdfName</CODE> for this image * @throws BadPdfFormatException on error */ public PdfImage(Image image, String name, PdfIndirectReference maskRef) { if (name == null) GenerateImgResName(image); else this.name = new PdfName(name); Put(PdfName.TYPE, PdfName.XOBJECT); Put(PdfName.SUBTYPE, PdfName.IMAGE); Put(PdfName.WIDTH, new PdfNumber(image.Width)); Put(PdfName.HEIGHT, new PdfNumber(image.Height)); if (image.Layer != null) Put(PdfName.OC, image.Layer.Ref); if (image.IsMask() && (image.Bpc == 1 || image.Bpc > 0xff)) Put(PdfName.IMAGEMASK, PdfBoolean.PDFTRUE); if (maskRef != null) { if (image.Smask) Put(PdfName.SMASK, maskRef); else Put(PdfName.MASK, maskRef); } if (image.IsMask() && image.Inverted) Put(PdfName.DECODE, new PdfLiteral("[1 0]")); if (image.Interpolation) Put(PdfName.INTERPOLATE, PdfBoolean.PDFTRUE); Stream isp = null; try { // Raw Image data if (image.IsImgRaw()) { // will also have the CCITT parameters int colorspace = image.Colorspace; int[] transparency = image.Transparency; if (transparency != null && !image.IsMask() && maskRef == null) { StringBuilder s = new StringBuilder("["); for (int k = 0; k < transparency.Length; ++k) s.Append(transparency[k]).Append(' '); s.Append(']'); Put(PdfName.MASK, new PdfLiteral(s.ToString())); } bytes = image.RawData; Put(PdfName.LENGTH, new PdfNumber(bytes.Length)); int bpc = image.Bpc; if (bpc > 0xff) { if (!image.IsMask()) Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY); Put(PdfName.BITSPERCOMPONENT, new PdfNumber(1)); Put(PdfName.FILTER, PdfName.CCITTFAXDECODE); int k = bpc - Image.CCITTG3_1D; PdfDictionary decodeparms = new PdfDictionary(); if (k != 0) decodeparms.Put(PdfName.K, new PdfNumber(k)); if ((colorspace & Image.CCITT_BLACKIS1) != 0) decodeparms.Put(PdfName.BLACKIS1, PdfBoolean.PDFTRUE); if ((colorspace & Image.CCITT_ENCODEDBYTEALIGN) != 0) decodeparms.Put(PdfName.ENCODEDBYTEALIGN, PdfBoolean.PDFTRUE); if ((colorspace & Image.CCITT_ENDOFLINE) != 0) decodeparms.Put(PdfName.ENDOFLINE, PdfBoolean.PDFTRUE); if ((colorspace & Image.CCITT_ENDOFBLOCK) != 0) decodeparms.Put(PdfName.ENDOFBLOCK, PdfBoolean.PDFFALSE); decodeparms.Put(PdfName.COLUMNS, new PdfNumber(image.Width)); decodeparms.Put(PdfName.ROWS, new PdfNumber(image.Height)); Put(PdfName.DECODEPARMS, decodeparms); } else { switch (colorspace) { case 1: Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY); if (image.Inverted) Put(PdfName.DECODE, new PdfLiteral("[1 0]")); break; case 3: Put(PdfName.COLORSPACE, PdfName.DEVICERGB); if (image.Inverted) Put(PdfName.DECODE, new PdfLiteral("[1 0 1 0 1 0]")); break; case 4: default: Put(PdfName.COLORSPACE, PdfName.DEVICECMYK); if (image.Inverted) Put(PdfName.DECODE, new PdfLiteral("[1 0 1 0 1 0 1 0]")); break; } PdfDictionary additional = image.Additional; if (additional != null) Merge(additional); if (image.IsMask() && (image.Bpc == 1 || image.Bpc > 8)) Remove(PdfName.COLORSPACE); Put(PdfName.BITSPERCOMPONENT, new PdfNumber(image.Bpc)); if (image.Deflated) Put(PdfName.FILTER, PdfName.FLATEDECODE); else { FlateCompress(image.CompressionLevel); } } return; } // GIF, JPEG or PNG String errorID; if (image.RawData == null){ WebRequest wr = WebRequest.Create(image.Url); wr.Credentials = CredentialCache.DefaultCredentials; isp = wr.GetResponse().GetResponseStream(); errorID = image.Url.ToString(); } else{ isp = new MemoryStream(image.RawData); errorID = "Byte array"; } switch (image.Type) { case Image.JPEG: Put(PdfName.FILTER, PdfName.DCTDECODE); switch (image.Colorspace) { case 1: Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY); break; case 3: Put(PdfName.COLORSPACE, PdfName.DEVICERGB); break; default: Put(PdfName.COLORSPACE, PdfName.DEVICECMYK); if (image.Inverted) { Put(PdfName.DECODE, new PdfLiteral("[1 0 1 0 1 0 1 0]")); } break; } Put(PdfName.BITSPERCOMPONENT, new PdfNumber(8)); if (image.RawData != null){ bytes = image.RawData; Put(PdfName.LENGTH, new PdfNumber(bytes.Length)); return; } streamBytes = new MemoryStream(); TransferBytes(isp, streamBytes, -1); break; case Image.JPEG2000: Put(PdfName.FILTER, PdfName.JPXDECODE); if (image.Colorspace > 0) { switch (image.Colorspace) { case 1: Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY); break; case 3: Put(PdfName.COLORSPACE, PdfName.DEVICERGB); break; default: Put(PdfName.COLORSPACE, PdfName.DEVICECMYK); break; } Put(PdfName.BITSPERCOMPONENT, new PdfNumber(image.Bpc)); } if (image.RawData != null){ bytes = image.RawData; Put(PdfName.LENGTH, new PdfNumber(bytes.Length)); return; } streamBytes = new MemoryStream(); TransferBytes(isp, streamBytes, -1); break; case Image.JBIG2: Put(PdfName.FILTER, PdfName.JBIG2DECODE); Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY); Put(PdfName.BITSPERCOMPONENT, new PdfNumber(1)); if (image.RawData != null){ bytes = image.RawData; Put(PdfName.LENGTH, new PdfNumber(bytes.Length)); return; } streamBytes = new MemoryStream(); TransferBytes(isp, streamBytes, -1); break; default: throw new IOException(MessageLocalization.GetComposedMessage("1.is.an.unknown.image.format", errorID)); } Put(PdfName.LENGTH, new PdfNumber(streamBytes.Length)); } finally { if (isp != null) { try{ isp.Close(); } catch { // empty on purpose } } } }
/** * @see com.lowagie.text.pdf.PdfContentByte#addImage(com.lowagie.text.Image, float, float, float, float, float, float) */ public override void AddImage(Image image, float a, float b, float c, float d, float e, float f) { if (stencil && !image.IsMask()) CheckNoColor(); base.AddImage(image, a, b, c, d, e, f); }