Esempio n. 1
0
        /**
         * Adds an <CODE>Image</CODE> to the page. The positioning of the <CODE>Image</CODE>
         * is done with the transformation matrix. To position an <CODE>image</CODE> at (x,y)
         * The image can be placed inline.
         * @param image the <CODE>Image</CODE> object
         * @param a an element of the transformation matrix
         * @param b an element of the transformation matrix
         * @param c an element of the transformation matrix
         * @param d an element of the transformation matrix
         * @param e an element of the transformation matrix
         * @param f an element of the transformation matrix
         * @param inlineImage <CODE>true</CODE> to place this image inline, <CODE>false</CODE> otherwise
         * @param isMCBlockOpened <CODE>true</CODE> not to open MCBlock, <CODE>false</CODE> otherwise
         * @throws DocumentException on error
         */
        protected internal void AddImage(Image image, double a, double b, double c, double d, double e, double f, bool inlineImage, bool isMCBlockOpened) {
            try
            {
                AffineTransform transform = new AffineTransform(a, b, c, d, e, f);

                if (image.Layer != null)
                    BeginLayer(image.Layer);
                if (IsTagged())
                {
                    if (inText)
                        EndText();

                    Point2D[] src = new Point2D.Float[]
                    {new Point2D.Float(0, 0), new Point2D.Float(1, 0), new Point2D.Float(1, 1), new Point2D.Float(0, 1)};
                    Point2D[] dst = new Point2D.Float[4];
                    transform.Transform(src, 0, dst, 0, 4);
                    float left = float.MaxValue;
                    float right = float.MinValue;
                    float bottom = float.MaxValue;
                    float top = float.MinValue;
                    for (int i = 0; i < 4; i++)
                    {
                        if (dst[i].GetX() < left)
                            left = (float) dst[i].GetX();
                        if (dst[i].GetX() > right)
                            right = (float) dst[i].GetX();
                        if (dst[i].GetY() < bottom)
                            bottom = (float) dst[i].GetY();
                        if (dst[i].GetY() > top)
                            top = (float) dst[i].GetY();
                    }
                    image.SetAccessibleAttribute(PdfName.BBOX, new PdfArray(new float[] {left, bottom, right, top}));
                }
                if (writer != null && image.IsImgTemplate())
                {
                    writer.AddDirectImageSimple(image);
                    PdfTemplate template = image.TemplateData;
                    if (image.GetAccessibleAttributes() != null)
                    {
                        foreach (PdfName key in image.GetAccessibleAttributes().Keys)
                        {
                            template.SetAccessibleAttribute(key, image.GetAccessibleAttribute(key));
                        }
                    }
                    float w = template.Width;
                    float h = template.Height;
                    AddTemplate(template, a/w, b/w, c/h, d/h, e, f, isMCBlockOpened);
                }
                else
                {
                    content.Append("q ");

                    if (!transform.IsIdentity())
                    {
                        content.Append(a).Append(' ');
                        content.Append(b).Append(' ');
                        content.Append(c).Append(' ');
                        content.Append(d).Append(' ');
                        content.Append(e).Append(' ');
                        content.Append(f).Append(" cm");
                    }

                    if (inlineImage)
                    {
                        content.Append("\nBI\n");
                        PdfImage pimage = new PdfImage(image, "", null);
                        if (image is ImgJBIG2)
                        {
                            byte[] globals = ((ImgJBIG2) image).GlobalBytes;
                            if (globals != null)
                            {
                                PdfDictionary decodeparms = new PdfDictionary();
                                decodeparms.Put(PdfName.JBIG2GLOBALS, writer.GetReferenceJBIG2Globals(globals));
                                pimage.Put(PdfName.DECODEPARMS, decodeparms);
                            }
                        }
                        PdfWriter.CheckPdfIsoConformance(writer, PdfIsoKeys.PDFISOKEY_INLINE_IMAGE, pimage);
                        foreach (PdfName key in pimage.Keys)
                        {
                            if (!abrev.ContainsKey(key))
                                continue;
                            PdfObject value = pimage.Get(key);
                            String s = abrev[key];
                            content.Append(s);
                            bool check = true;
                            if (key.Equals(PdfName.COLORSPACE) && value.IsArray())
                            {
                                PdfArray ar = (PdfArray) value;
                                if (ar.Size == 4
                                    && PdfName.INDEXED.Equals(ar.GetAsName(0))
                                    && ar.GetPdfObject(1).IsName()
                                    && ar.GetPdfObject(2).IsNumber()
                                    && ar.GetPdfObject(3).IsString()
                                    )
                                {
                                    check = false;
                                }

                            }
                            if (check && key.Equals(PdfName.COLORSPACE) && !value.IsName())
                            {
                                PdfName cs = writer.GetColorspaceName();
                                PageResources prs = PageResources;
                                prs.AddColor(cs, writer.AddToBody(value).IndirectReference);
                                value = cs;
                            }
                            value.ToPdf(null, content);
                            content.Append('\n');
                        }
                        content.Append("ID\n");
                        pimage.WriteContent(content);
                        content.Append("\nEI\nQ").Append_i(separator);
                    }
                    else
                    {
                        PdfName name;
                        PageResources prs = PageResources;
                        Image maskImage = image.ImageMask;
                        if (maskImage != null)
                        {
                            name = writer.AddDirectImageSimple(maskImage);
                            prs.AddXObject(name, writer.GetImageReference(name));
                        }
                        name = writer.AddDirectImageSimple(image);
                        name = prs.AddXObject(name, writer.GetImageReference(name));
                        content.Append(' ').Append(name.GetBytes()).Append(" Do Q").Append_i(separator);
                    }
                }
                if (image.HasBorders())
                {
                    SaveState();
                    float w = image.Width;
                    float h = image.Height;
                    ConcatCTM(a/w, b/w, c/h, d/h, e, f);
                    Rectangle(image);
                    RestoreState();
                }
                if (image.Layer != null)
                    EndLayer();
                Annotation annot = image.Annotation;
                if (annot == null)
                    return;
                double[] r = new double[unitRect.Length];
                for (int k = 0; k < unitRect.Length; k += 2)
                {
                    r[k] = a*unitRect[k] + c*unitRect[k + 1] + e;
                    r[k + 1] = b*unitRect[k] + d*unitRect[k + 1] + f;
                }
                double llx = r[0];
                double lly = r[1];
                double urx = llx;
                double ury = lly;
                for (int k = 2; k < r.Length; k += 2)
                {
                    llx = Math.Min(llx, r[k]);
                    lly = Math.Min(lly, r[k + 1]);
                    urx = Math.Max(urx, r[k]);
                    ury = Math.Max(ury, r[k + 1]);
                }
                annot = new Annotation(annot);
                annot.SetDimensions((float) llx, (float) lly, (float) urx, (float) ury);
                PdfAnnotation an = PdfAnnotationsImp.ConvertAnnotation(writer, annot,
                    new Rectangle((float) llx, (float) lly, (float) urx, (float) ury));
                if (an == null)
                    return;
                AddAnnotation(an);
            } catch (IOException ioe) {
                String path = image != null && image.Url != null ? image.Url.AbsolutePath
                    : MessageLocalization.GetComposedMessage("unknown");
                throw new DocumentException(MessageLocalization.GetComposedMessage("add.image.exception", path), ioe);
            }
        }
 /**
 * Adds an <CODE>Image</CODE> to the page. The positioning of the <CODE>Image</CODE>
 * is done with the transformation matrix. To position an <CODE>image</CODE> at (x,y)
 * use AddImage(image, image_width, 0, 0, image_height, x, y). The image can be placed inline.
 * @param image the <CODE>Image</CODE> object
 * @param a an element of the transformation matrix
 * @param b an element of the transformation matrix
 * @param c an element of the transformation matrix
 * @param d an element of the transformation matrix
 * @param e an element of the transformation matrix
 * @param f an element of the transformation matrix
 * @param inlineImage <CODE>true</CODE> to place this image inline, <CODE>false</CODE> otherwise
 * @throws DocumentException on error
 */
 public virtual void AddImage(Image image, float a, float b, float c, float d, float e, float f, bool inlineImage) {
     if (image.Layer != null)
         BeginLayer(image.Layer);
     if (inText && IsTagged()){
         EndText();
     }
     if (writer != null && image.IsImgTemplate()) {
         writer.AddDirectImageSimple(image);
         PdfTemplate template = image.TemplateData;
         float w = template.Width;
         float h = template.Height;
         AddTemplate(template, a / w, b / w, c / h, d / h, e, f);
     }
     else {
         content.Append("q ");
         content.Append(a).Append(' ');
         content.Append(b).Append(' ');
         content.Append(c).Append(' ');
         content.Append(d).Append(' ');
         content.Append(e).Append(' ');
         content.Append(f).Append(" cm");
         if (inlineImage) {
             content.Append("\nBI\n");
             PdfImage pimage = new PdfImage(image, "", null);
             if (image is ImgJBIG2) {
                 byte[] globals = ((ImgJBIG2)image).GlobalBytes;
                 if (globals != null) {
                     PdfDictionary decodeparms = new PdfDictionary();
                     decodeparms.Put(PdfName.JBIG2GLOBALS, writer.GetReferenceJBIG2Globals(globals));
                     pimage.Put(PdfName.DECODEPARMS, decodeparms);
                 }
             }
             PdfWriter.CheckPdfIsoConformance(writer, PdfIsoKeys.PDFISOKEY_INLINE_IMAGE, pimage);
             foreach (PdfName key in pimage.Keys) {
                 if (!abrev.ContainsKey(key))
                     continue;
                 PdfObject value = pimage.Get(key);
                 String s = abrev[key];
                 content.Append(s);
                 bool check = true;
                 if (key.Equals(PdfName.COLORSPACE) && value.IsArray()) {
                     PdfArray ar = (PdfArray)value;
                     if (ar.Size == 4 
                         && PdfName.INDEXED.Equals(ar.GetAsName(0)) 
                         && ar[1].IsName()
                         && ar[2].IsNumber()
                         && ar[3].IsString()
                     ) {
                         check = false;
                     }
                     
                 }
                 if (check && key.Equals(PdfName.COLORSPACE) && !value.IsName()) {
                     PdfName cs = writer.GetColorspaceName();
                     PageResources prs = PageResources;
                     prs.AddColor(cs, writer.AddToBody(value).IndirectReference);
                     value = cs;
                 }
                 value.ToPdf(null, content);
                 content.Append('\n');
             }
             content.Append("ID\n");
             pimage.WriteContent(content);
             content.Append("\nEI\nQ").Append_i(separator);
         }
         else {
             PdfName name;
             PageResources prs = PageResources;
             Image maskImage = image.ImageMask;
             if (maskImage != null) {
                 name = writer.AddDirectImageSimple(maskImage);
                 prs.AddXObject(name, writer.GetImageReference(name));
             }
             name = writer.AddDirectImageSimple(image);
             name = prs.AddXObject(name, writer.GetImageReference(name));
             content.Append(' ').Append(name.GetBytes()).Append(" Do Q").Append_i(separator);
         }
     }
     if (image.HasBorders()) {
         SaveState();
         float w = image.Width;
         float h = image.Height;
         ConcatCTM(a / w, b / w, c / h, d / h, e, f);
         Rectangle(image);
         RestoreState();
     }
     if (image.Layer != null)
         EndLayer();
     Annotation annot = image.Annotation;
     if (annot == null)
         return;
     float[] r = new float[unitRect.Length];
     for (int k = 0; k < unitRect.Length; k += 2) {
         r[k] = a * unitRect[k] + c * unitRect[k + 1] + e;
         r[k + 1] = b * unitRect[k] + d * unitRect[k + 1] + f;
     }
     float llx = r[0];
     float lly = r[1];
     float urx = llx;
     float ury = lly;
     for (int k = 2; k < r.Length; k += 2) {
         llx = Math.Min(llx, r[k]);
         lly = Math.Min(lly, r[k + 1]);
         urx = Math.Max(urx, r[k]);
         ury = Math.Max(ury, r[k + 1]);
     }
     annot = new Annotation(annot);
     annot.SetDimensions(llx, lly, urx, ury);
     PdfAnnotation an = PdfAnnotationsImp.ConvertAnnotation(writer, annot, new Rectangle(llx, lly, urx, ury));
     if (an == null)
         return;
     AddAnnotation(an);
 }
Esempio n. 3
0
        /**
        * Adds an <CODE>Image</CODE> to the page. The positioning of the <CODE>Image</CODE>
        * is done with the transformation matrix. To position an <CODE>image</CODE> at (x,y)
        * use AddImage(image, image_width, 0, 0, image_height, x, y). The image can be placed inline.
        * @param image the <CODE>Image</CODE> object
        * @param a an element of the transformation matrix
        * @param b an element of the transformation matrix
        * @param c an element of the transformation matrix
        * @param d an element of the transformation matrix
        * @param e an element of the transformation matrix
        * @param f an element of the transformation matrix
        * @param inlineImage <CODE>true</CODE> to place this image inline, <CODE>false</CODE> otherwise
        * @throws DocumentException on error
        */
        public virtual void AddImage(Image image, float a, float b, float c, float d, float e, float f, bool inlineImage)
        {
            if (image.Layer != null)
                BeginLayer(image.Layer);
            if (image.IsImgTemplate()) {
                writer.AddDirectImageSimple(image);
                PdfTemplate template = image.TemplateData;
                float w = template.Width;
                float h = template.Height;
                AddTemplate(template, a / w, b / w, c / h, d / h, e, f);
            }
            else {
                content.Append("q ");
                content.Append(a).Append(' ');
                content.Append(b).Append(' ');
                content.Append(c).Append(' ');
                content.Append(d).Append(' ');
                content.Append(e).Append(' ');
                content.Append(f).Append(" cm");
                if (inlineImage) {
                    content.Append("\nBI\n");
                    PdfImage pimage = new PdfImage(image, "", null);
                    foreach (PdfName key in pimage.Keys) {
                        PdfObject value = pimage.Get(key);
                        String s = (String)abrev[key];
                        if (s == null)
                            continue;
                        content.Append(s);
                        bool check = true;
                        if (key.Equals(PdfName.COLORSPACE) && value.IsArray()) {
                            ArrayList ar = ((PdfArray)value).ArrayList;
                            if (ar.Count == 4
                                && PdfName.INDEXED.Equals(ar[0])
                                && ((PdfObject)ar[1]).IsName()
                                && ((PdfObject)ar[2]).IsNumber()
                                && ((PdfObject)ar[3]).IsString()
                            ) {
                                check = false;
                            }

                        }
                        if (check && key.Equals(PdfName.COLORSPACE) && !value.IsName()) {
                            PdfName cs = writer.GetColorspaceName();
                            PageResources prs = PageResources;
                            prs.AddColor(cs, writer.AddToBody(value).IndirectReference);
                            value = cs;
                        }
                        value.ToPdf(null, content);
                        content.Append('\n');
                    }
                    content.Append("ID\n");
                    pimage.WriteContent(content);
                    content.Append("\nEI\nQ").Append_i(separator);
                }
                else {
                    PdfName name;
                    PageResources prs = PageResources;
                    Image maskImage = image.ImageMask;
                    if (maskImage != null) {
                        name = writer.AddDirectImageSimple(maskImage);
                        prs.AddXObject(name, writer.GetImageReference(name));
                    }
                    name = writer.AddDirectImageSimple(image);
                    name = prs.AddXObject(name, writer.GetImageReference(name));
                    content.Append(' ').Append(name.GetBytes()).Append(" Do Q").Append_i(separator);
                }
            }
            if (image.HasBorders()) {
                SaveState();
                float w = image.Width;
                float h = image.Height;
                ConcatCTM(a / w, b / w, c / h, d / h, e, f);
                Rectangle(image);
                RestoreState();
            }
            if (image.Layer != null)
                EndLayer();
            Annotation annot = image.Annotation;
            if (annot == null)
                return;
            float[] r = new float[unitRect.Length];
            for (int k = 0; k < unitRect.Length; k += 2) {
                r[k] = a * unitRect[k] + c * unitRect[k + 1] + e;
                r[k + 1] = b * unitRect[k] + d * unitRect[k + 1] + f;
            }
            float llx = r[0];
            float lly = r[1];
            float urx = llx;
            float ury = lly;
            for (int k = 2; k < r.Length; k += 2) {
                llx = Math.Min(llx, r[k]);
                lly = Math.Min(lly, r[k + 1]);
                urx = Math.Max(urx, r[k]);
                ury = Math.Max(ury, r[k + 1]);
            }
            annot = new Annotation(annot);
            annot.SetDimensions(llx, lly, urx, ury);
            PdfAnnotation an = PdfAnnotationsImp.ConvertAnnotation(writer, annot, new Rectangle(llx, lly, urx, ury));
            if (an == null)
                return;
            AddAnnotation(an);
        }