예제 #1
0
        private Point2D[] TransformPoints(Matrix transormationMatrix, bool inverse, params Point2D[] points) {
            AffineTransform t = new AffineTransform(transormationMatrix[Matrix.I11], transormationMatrix[Matrix.I12],
                                                    transormationMatrix[Matrix.I21], transormationMatrix[Matrix.I22],
                                                    transormationMatrix[Matrix.I31], transormationMatrix[Matrix.I32]);
            Point2D[] transformed = new Point2D[points.Length];

            if (inverse) {
                t = t.CreateInverse();
            }

            t.Transform(points, 0, transformed, 0, points.Length);

            return transformed;
        }
예제 #2
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 (IsTagged()) {
         if (inText)
             EndText();
         AffineTransform transform = new AffineTransform(a, b, c, d, e, f);
         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);
     }
     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);
 }
예제 #3
0
 virtual public PdfRectangle Transform(AffineTransform transform) {
     float[] pts = {llx, lly, urx, ury};
     transform.Transform(pts, 0, pts, 0, 2);
     float[] dstPts = {pts[0], pts[1], pts[2], pts[3]};
     if (pts[0] > pts[2])
     {
         dstPts[0] = pts[2];
         dstPts[2] = pts[0];
     }
     if (pts[1] > pts[3])
     {
         dstPts[1] = pts[3];
         dstPts[3] = pts[1];
     }
     return new PdfRectangle(dstPts[0], dstPts[1], dstPts[2], dstPts[3]);
 }