Esempio n. 1
0
        private void InsertFormXObj(PdfContentByte canvas, PdfDictionary pageDict, PdfStream formXObj, IList <Rectangle> clippingRects, Rectangle annotRect)
        {
            PdfName xobjName = GenerateNameForXObj(pageDict);

            canvas.SaveState();

            foreach (Rectangle rect in clippingRects)
            {
                canvas.Rectangle(rect.Left, rect.Bottom, rect.Width, rect.Height);
            }

            canvas.Clip();
            canvas.NewPath();

            canvas.AddFormXObj(formXObj, xobjName, 1, 0, 0, 1, annotRect.Left, annotRect.Bottom);

            canvas.RestoreState();
        }
Esempio n. 2
0
        /**
         * Writes the selected rows to the document.
         * This method clips the columns; this is only important
         * if there are columns with colspan at boundaries.
         * <P>
         * The table event is only fired for complete rows.
         *
         * @param colStart the first column to be written, zero index
         * @param colEnd the last column to be written + 1. If it is -1 all the
         * @param rowStart the first row to be written, zero index
         * @param rowEnd the last row to be written + 1. If it is -1 all the
         * rows to the end are written
         * @param xPos the x write coodinate
         * @param yPos the y write coodinate
         * @param canvas the <CODE>PdfContentByte</CODE> where the rows will
         * be written to
         * @return the y coordinate position of the bottom of the last row
         */
        public float WriteSelectedRows(int colStart, int colEnd, int rowStart, int rowEnd, float xPos, float yPos, PdfContentByte canvas)
        {
            if (colEnd < 0)
            {
                colEnd = absoluteWidths.Length;
            }
            colEnd = Math.Min(colEnd, absoluteWidths.Length);
            if (colStart < 0)
            {
                colStart = 0;
            }
            colStart = Math.Min(colStart, absoluteWidths.Length);
            if (colStart != 0 || colEnd != absoluteWidths.Length)
            {
                float w = 0;
                for (int k = colStart; k < colEnd; ++k)
                {
                    w += absoluteWidths[k];
                }
                canvas.SaveState();
                float lx = 0;
                float rx = 0;
                if (colStart == 0)
                {
                    lx = 10000;
                }
                if (colEnd == absoluteWidths.Length)
                {
                    rx = 10000;
                }
                canvas.Rectangle(xPos - lx, -10000, w + lx + rx, 20000);
                canvas.Clip();
                canvas.NewPath();
            }
            PdfContentByte[] canvases = BeginWritingRows(canvas);
            float            y        = WriteSelectedRows(colStart, colEnd, rowStart, rowEnd, xPos, yPos, canvases);

            EndWritingRows(canvases);
            if (colStart != 0 || colEnd != absoluteWidths.Length)
            {
                canvas.RestoreState();
            }
            return(y);
        }
Esempio n. 3
0
        public virtual void DeviceNCmykRedRgbBlueGradient()
        {
            Document document = new Document();
            // step 2
            String    dest_file = DEST_FOLDER + "/device_n_gradient_CmykRedRgbBlue.pdf";
            PdfWriter writer    = PdfWriter.GetInstance(document, new FileStream(dest_file, FileMode.Create));

            // step 3
            document.Open();
            // step 4
            PdfContentByte  canvas       = writer.DirectContent;
            PdfSpotColor    psc_red      = new PdfSpotColor("Spot Red", new CMYKColor(0f, 1f, 1f, 0f));
            PdfSpotColor    psc_blue     = new PdfSpotColor("Spot Blue", new BaseColor(0, 0, 255));
            PdfDeviceNColor deviceNColor = new PdfDeviceNColor(new PdfSpotColor[] { psc_red, psc_blue });

            canvas.SaveState();
            canvas.Rectangle(418, 412, -329, 189);
            canvas.Clip();
            canvas.NewPath();
            canvas.SaveState();
            canvas.ConcatCTM(329f, 0f, 0f, -329f, 89f, 506.5f);
            canvas.PaintShading(PdfShading.SimpleAxial(writer, 0, 0, 1, 0, new DeviceNColor(deviceNColor, new float[] { 1, 0 }),
                                                       new DeviceNColor(deviceNColor, new float[] { 0, 1 })));
            canvas.RestoreState();
            canvas.RestoreState();
            canvas.SetCMYKColorStroke(0, 0, 0, 0xFF);
            canvas.Rectangle(418, 412, -329, 189);
            canvas.Stroke();
            document.Close();

            CompareTool compareTool = new CompareTool();
            String      error       = compareTool.Compare(dest_file, TEST_RESOURCES_PATH + "cmp_device_n_gradient_CmykRedRgbBlue.pdf", DEST_FOLDER, "diff_");

            if (error != null)
            {
                Assert.Fail(error);
            }
        }
Esempio n. 4
0
        public void ReadAll()
        {
            if (meta.ReadInt() != unchecked ((int)0x9AC6CDD7))
            {
                throw new DocumentException(MessageLocalization.GetComposedMessage("not.a.placeable.windows.metafile"));
            }
            meta.ReadWord();
            left           = meta.ReadShort();
            top            = meta.ReadShort();
            right          = meta.ReadShort();
            bottom         = meta.ReadShort();
            inch           = meta.ReadWord();
            state.ScalingX = (float)(right - left) / (float)inch * 72f;
            state.ScalingY = (float)(bottom - top) / (float)inch * 72f;
            state.OffsetWx = left;
            state.OffsetWy = top;
            state.ExtentWx = right - left;
            state.ExtentWy = bottom - top;
            meta.ReadInt();
            meta.ReadWord();
            meta.Skip(18);

            int tsize;
            int function;

            cb.SetLineCap(1);
            cb.SetLineJoin(1);
            for (;;)
            {
                int lenMarker = meta.Length;
                tsize = meta.ReadInt();
                if (tsize < 3)
                {
                    break;
                }
                function = meta.ReadWord();
                switch (function)
                {
                case 0:
                    break;

                case META_CREATEPALETTE:
                case META_CREATEREGION:
                case META_DIBCREATEPATTERNBRUSH:
                    state.AddMetaObject(new MetaObject());
                    break;

                case META_CREATEPENINDIRECT:
                {
                    MetaPen pen = new MetaPen();
                    pen.Init(meta);
                    state.AddMetaObject(pen);
                    break;
                }

                case META_CREATEBRUSHINDIRECT:
                {
                    MetaBrush brush = new MetaBrush();
                    brush.Init(meta);
                    state.AddMetaObject(brush);
                    break;
                }

                case META_CREATEFONTINDIRECT:
                {
                    MetaFont font = new MetaFont();
                    font.Init(meta);
                    state.AddMetaObject(font);
                    break;
                }

                case META_SELECTOBJECT:
                {
                    int idx = meta.ReadWord();
                    state.SelectMetaObject(idx, cb);
                    break;
                }

                case META_DELETEOBJECT:
                {
                    int idx = meta.ReadWord();
                    state.DeleteMetaObject(idx);
                    break;
                }

                case META_SAVEDC:
                    state.SaveState(cb);
                    break;

                case META_RESTOREDC:
                {
                    int idx = meta.ReadShort();
                    state.RestoreState(idx, cb);
                    break;
                }

                case META_SETWINDOWORG:
                    state.OffsetWy = meta.ReadShort();
                    state.OffsetWx = meta.ReadShort();
                    break;

                case META_SETWINDOWEXT:
                    state.ExtentWy = meta.ReadShort();
                    state.ExtentWx = meta.ReadShort();
                    break;

                case META_MOVETO:
                {
                    int y = meta.ReadShort();
                    System.Drawing.Point p = new System.Drawing.Point(meta.ReadShort(), y);
                    state.CurrentPoint = p;
                    break;
                }

                case META_LINETO:
                {
                    int y = meta.ReadShort();
                    int x = meta.ReadShort();
                    System.Drawing.Point p = state.CurrentPoint;
                    cb.MoveTo(state.TransformX(p.X), state.TransformY(p.Y));
                    cb.LineTo(state.TransformX(x), state.TransformY(y));
                    cb.Stroke();
                    state.CurrentPoint = new System.Drawing.Point(x, y);
                    break;
                }

                case META_POLYLINE:
                {
                    state.LineJoinPolygon = cb;
                    int len = meta.ReadWord();
                    int x   = meta.ReadShort();
                    int y   = meta.ReadShort();
                    cb.MoveTo(state.TransformX(x), state.TransformY(y));
                    for (int k = 1; k < len; ++k)
                    {
                        x = meta.ReadShort();
                        y = meta.ReadShort();
                        cb.LineTo(state.TransformX(x), state.TransformY(y));
                    }
                    cb.Stroke();
                    break;
                }

                case META_POLYGON:
                {
                    if (IsNullStrokeFill(false))
                    {
                        break;
                    }
                    int len = meta.ReadWord();
                    int sx  = meta.ReadShort();
                    int sy  = meta.ReadShort();
                    cb.MoveTo(state.TransformX(sx), state.TransformY(sy));
                    for (int k = 1; k < len; ++k)
                    {
                        int x = meta.ReadShort();
                        int y = meta.ReadShort();
                        cb.LineTo(state.TransformX(x), state.TransformY(y));
                    }
                    cb.LineTo(state.TransformX(sx), state.TransformY(sy));
                    StrokeAndFill();
                    break;
                }

                case META_POLYPOLYGON:
                {
                    if (IsNullStrokeFill(false))
                    {
                        break;
                    }
                    int   numPoly = meta.ReadWord();
                    int[] lens    = new int[numPoly];
                    for (int k = 0; k < lens.Length; ++k)
                    {
                        lens[k] = meta.ReadWord();
                    }
                    for (int j = 0; j < lens.Length; ++j)
                    {
                        int len = lens[j];
                        int sx  = meta.ReadShort();
                        int sy  = meta.ReadShort();
                        cb.MoveTo(state.TransformX(sx), state.TransformY(sy));
                        for (int k = 1; k < len; ++k)
                        {
                            int x = meta.ReadShort();
                            int y = meta.ReadShort();
                            cb.LineTo(state.TransformX(x), state.TransformY(y));
                        }
                        cb.LineTo(state.TransformX(sx), state.TransformY(sy));
                    }
                    StrokeAndFill();
                    break;
                }

                case META_ELLIPSE:
                {
                    if (IsNullStrokeFill(state.LineNeutral))
                    {
                        break;
                    }
                    int b = meta.ReadShort();
                    int r = meta.ReadShort();
                    int t = meta.ReadShort();
                    int l = meta.ReadShort();
                    cb.Arc(state.TransformX(l), state.TransformY(b), state.TransformX(r), state.TransformY(t), 0, 360);
                    StrokeAndFill();
                    break;
                }

                case META_ARC:
                {
                    if (IsNullStrokeFill(state.LineNeutral))
                    {
                        break;
                    }
                    float yend   = state.TransformY(meta.ReadShort());
                    float xend   = state.TransformX(meta.ReadShort());
                    float ystart = state.TransformY(meta.ReadShort());
                    float xstart = state.TransformX(meta.ReadShort());
                    float b      = state.TransformY(meta.ReadShort());
                    float r      = state.TransformX(meta.ReadShort());
                    float t      = state.TransformY(meta.ReadShort());
                    float l      = state.TransformX(meta.ReadShort());
                    float cx     = (r + l) / 2;
                    float cy     = (t + b) / 2;
                    float arc1   = GetArc(cx, cy, xstart, ystart);
                    float arc2   = GetArc(cx, cy, xend, yend);
                    arc2 -= arc1;
                    if (arc2 <= 0)
                    {
                        arc2 += 360;
                    }
                    cb.Arc(l, b, r, t, arc1, arc2);
                    cb.Stroke();
                    break;
                }

                case META_PIE:
                {
                    if (IsNullStrokeFill(state.LineNeutral))
                    {
                        break;
                    }
                    float yend   = state.TransformY(meta.ReadShort());
                    float xend   = state.TransformX(meta.ReadShort());
                    float ystart = state.TransformY(meta.ReadShort());
                    float xstart = state.TransformX(meta.ReadShort());
                    float b      = state.TransformY(meta.ReadShort());
                    float r      = state.TransformX(meta.ReadShort());
                    float t      = state.TransformY(meta.ReadShort());
                    float l      = state.TransformX(meta.ReadShort());
                    float cx     = (r + l) / 2;
                    float cy     = (t + b) / 2;
                    float arc1   = GetArc(cx, cy, xstart, ystart);
                    float arc2   = GetArc(cx, cy, xend, yend);
                    arc2 -= arc1;
                    if (arc2 <= 0)
                    {
                        arc2 += 360;
                    }
                    List <float[]> ar = PdfContentByte.BezierArc(l, b, r, t, arc1, arc2);
                    if (ar.Count == 0)
                    {
                        break;
                    }
                    float[] pt = ar[0];
                    cb.MoveTo(cx, cy);
                    cb.LineTo(pt[0], pt[1]);
                    for (int k = 0; k < ar.Count; ++k)
                    {
                        pt = ar[k];
                        cb.CurveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
                    }
                    cb.LineTo(cx, cy);
                    StrokeAndFill();
                    break;
                }

                case META_CHORD:
                {
                    if (IsNullStrokeFill(state.LineNeutral))
                    {
                        break;
                    }
                    float yend   = state.TransformY(meta.ReadShort());
                    float xend   = state.TransformX(meta.ReadShort());
                    float ystart = state.TransformY(meta.ReadShort());
                    float xstart = state.TransformX(meta.ReadShort());
                    float b      = state.TransformY(meta.ReadShort());
                    float r      = state.TransformX(meta.ReadShort());
                    float t      = state.TransformY(meta.ReadShort());
                    float l      = state.TransformX(meta.ReadShort());
                    float cx     = (r + l) / 2;
                    float cy     = (t + b) / 2;
                    float arc1   = GetArc(cx, cy, xstart, ystart);
                    float arc2   = GetArc(cx, cy, xend, yend);
                    arc2 -= arc1;
                    if (arc2 <= 0)
                    {
                        arc2 += 360;
                    }
                    List <float[]> ar = PdfContentByte.BezierArc(l, b, r, t, arc1, arc2);
                    if (ar.Count == 0)
                    {
                        break;
                    }
                    float[] pt = ar[0];
                    cx = pt[0];
                    cy = pt[1];
                    cb.MoveTo(cx, cy);
                    for (int k = 0; k < ar.Count; ++k)
                    {
                        pt = ar[k];
                        cb.CurveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
                    }
                    cb.LineTo(cx, cy);
                    StrokeAndFill();
                    break;
                }

                case META_RECTANGLE:
                {
                    if (IsNullStrokeFill(true))
                    {
                        break;
                    }
                    float b = state.TransformY(meta.ReadShort());
                    float r = state.TransformX(meta.ReadShort());
                    float t = state.TransformY(meta.ReadShort());
                    float l = state.TransformX(meta.ReadShort());
                    cb.Rectangle(l, b, r - l, t - b);
                    StrokeAndFill();
                    break;
                }

                case META_ROUNDRECT:
                {
                    if (IsNullStrokeFill(true))
                    {
                        break;
                    }
                    float h = state.TransformY(0) - state.TransformY(meta.ReadShort());
                    float w = state.TransformX(meta.ReadShort()) - state.TransformX(0);
                    float b = state.TransformY(meta.ReadShort());
                    float r = state.TransformX(meta.ReadShort());
                    float t = state.TransformY(meta.ReadShort());
                    float l = state.TransformX(meta.ReadShort());
                    cb.RoundRectangle(l, b, r - l, t - b, (h + w) / 4);
                    StrokeAndFill();
                    break;
                }

                case META_INTERSECTCLIPRECT:
                {
                    float b = state.TransformY(meta.ReadShort());
                    float r = state.TransformX(meta.ReadShort());
                    float t = state.TransformY(meta.ReadShort());
                    float l = state.TransformX(meta.ReadShort());
                    cb.Rectangle(l, b, r - l, t - b);
                    cb.EoClip();
                    cb.NewPath();
                    break;
                }

                case META_EXTTEXTOUT:
                {
                    int y     = meta.ReadShort();
                    int x     = meta.ReadShort();
                    int count = meta.ReadWord();
                    int flag  = meta.ReadWord();
                    int x1    = 0;
                    int y1    = 0;
                    int x2    = 0;
                    int y2    = 0;
                    if ((flag & (MetaFont.ETO_CLIPPED | MetaFont.ETO_OPAQUE)) != 0)
                    {
                        x1 = meta.ReadShort();
                        y1 = meta.ReadShort();
                        x2 = meta.ReadShort();
                        y2 = meta.ReadShort();
                    }
                    byte[] text = new byte[count];
                    int    k;
                    for (k = 0; k < count; ++k)
                    {
                        byte c = (byte)meta.ReadByte();
                        if (c == 0)
                        {
                            break;
                        }
                        text[k] = c;
                    }
                    string s;
                    try {
                        s = System.Text.Encoding.GetEncoding(1252).GetString(text, 0, k);
                    }
                    catch  {
                        s = System.Text.ASCIIEncoding.ASCII.GetString(text, 0, k);
                    }
                    OutputText(x, y, flag, x1, y1, x2, y2, s);
                    break;
                }

                case META_TEXTOUT:
                {
                    int    count = meta.ReadWord();
                    byte[] text  = new byte[count];
                    int    k;
                    for (k = 0; k < count; ++k)
                    {
                        byte c = (byte)meta.ReadByte();
                        if (c == 0)
                        {
                            break;
                        }
                        text[k] = c;
                    }
                    string s;
                    try {
                        s = System.Text.Encoding.GetEncoding(1252).GetString(text, 0, k);
                    }
                    catch {
                        s = System.Text.ASCIIEncoding.ASCII.GetString(text, 0, k);
                    }
                    count = (count + 1) & 0xfffe;
                    meta.Skip(count - k);
                    int y = meta.ReadShort();
                    int x = meta.ReadShort();
                    OutputText(x, y, 0, 0, 0, 0, 0, s);
                    break;
                }

                case META_SETBKCOLOR:
                    state.CurrentBackgroundColor = meta.ReadColor();
                    break;

                case META_SETTEXTCOLOR:
                    state.CurrentTextColor = meta.ReadColor();
                    break;

                case META_SETTEXTALIGN:
                    state.TextAlign = meta.ReadWord();
                    break;

                case META_SETBKMODE:
                    state.BackgroundMode = meta.ReadWord();
                    break;

                case META_SETPOLYFILLMODE:
                    state.PolyFillMode = meta.ReadWord();
                    break;

                case META_SETPIXEL:
                {
                    BaseColor color = meta.ReadColor();
                    int       y     = meta.ReadShort();
                    int       x     = meta.ReadShort();
                    cb.SaveState();
                    cb.SetColorFill(color);
                    cb.Rectangle(state.TransformX(x), state.TransformY(y), .2f, .2f);
                    cb.Fill();
                    cb.RestoreState();
                    break;
                }

                case META_DIBSTRETCHBLT:
                case META_STRETCHDIB: {
                    int rop = meta.ReadInt();
                    if (function == META_STRETCHDIB)
                    {
                        /*int usage = */ meta.ReadWord();
                    }
                    int    srcHeight  = meta.ReadShort();
                    int    srcWidth   = meta.ReadShort();
                    int    ySrc       = meta.ReadShort();
                    int    xSrc       = meta.ReadShort();
                    float  destHeight = state.TransformY(meta.ReadShort()) - state.TransformY(0);
                    float  destWidth  = state.TransformX(meta.ReadShort()) - state.TransformX(0);
                    float  yDest      = state.TransformY(meta.ReadShort());
                    float  xDest      = state.TransformX(meta.ReadShort());
                    byte[] b          = new byte[(tsize * 2) - (meta.Length - lenMarker)];
                    for (int k = 0; k < b.Length; ++k)
                    {
                        b[k] = (byte)meta.ReadByte();
                    }
                    try {
                        MemoryStream inb = new MemoryStream(b);
                        Image        bmp = BmpImage.GetImage(inb, true, b.Length);
                        cb.SaveState();
                        cb.Rectangle(xDest, yDest, destWidth, destHeight);
                        cb.Clip();
                        cb.NewPath();
                        bmp.ScaleAbsolute(destWidth * bmp.Width / srcWidth, -destHeight * bmp.Height / srcHeight);
                        bmp.SetAbsolutePosition(xDest - destWidth * xSrc / srcWidth, yDest + destHeight * ySrc / srcHeight - bmp.ScaledHeight);
                        cb.AddImage(bmp);
                        cb.RestoreState();
                    }
                    catch {
                        // empty on purpose
                    }
                    break;
                }
                }
                meta.Skip((tsize * 2) - (meta.Length - lenMarker));
            }
            state.Cleanup(cb);
        }
Esempio n. 5
0
    private static Boolean PrintShape(Shape shape, FrameworkElement relativeTo, PdfContentByte dc)
    {
      var noBorder = Helper.IsNullOrZero(shape.StrokeThickness) || Helper.IsTransparent(shape.Stroke);
      var noBackground = Helper.IsTransparent(shape.Fill);
      if (noBorder && noBackground)
        return true;

      dc.SaveState();

      try
      {
        var clipRect = GetClipRectange(shape, relativeTo);
        if (clipRect != null)
        {
          dc.Rectangle(clipRect.Value.Left, clipRect.Value.Top - clipRect.Value.Height, clipRect.Value.Width, clipRect.Value.Height);
          dc.Clip();
          dc.NewPath();
        }

        dc.SetColorFill(GetBaseColor(shape.Fill));
        dc.SetColorStroke(GetBaseColor(shape.Stroke));
        dc.SetLineWidth(shape.StrokeThickness);
        if (shape.StrokeDashArray != null && shape.StrokeDashArray.Any())
          dc.SetLineDash(shape.StrokeDashArray.Select(p => p * shape.StrokeThickness).ToArray(), 0);

        float left, top;
        if (!GetElementLocation(shape, relativeTo, out left, out top))
          return false;

        var lineGeometry = shape.RenderedGeometry as LineGeometry;
        if (lineGeometry != null)
        {
          var startPoint = shape.RenderedGeometry.Transform.Transform(lineGeometry.StartPoint);
          var endPoint = shape.RenderedGeometry.Transform.Transform(lineGeometry.EndPoint);
          dc.MoveTo(left + startPoint.X, top - startPoint.Y);
          dc.LineTo(left + endPoint.X, top - endPoint.Y);
        }
        var rectangleGeometry = shape.RenderedGeometry as RectangleGeometry;
        if (rectangleGeometry != null)
        {
          if (!rectangleGeometry.Rect.IsNaNOrZeroOrEmpty())
          {
            var bottomLeft = shape.RenderedGeometry.Transform.Transform(rectangleGeometry.Rect.BottomLeft);
            var widthHeight = shape.RenderedGeometry.Transform.Transform(new Point(rectangleGeometry.Rect.Width, rectangleGeometry.Rect.Height));
            dc.Rectangle(left + bottomLeft.X, top - bottomLeft.Y, widthHeight.X, widthHeight.Y);
          }
        }
        var ellipseGeometry = shape.RenderedGeometry as EllipseGeometry;
        if (ellipseGeometry != null)
        {
          var center = shape.RenderedGeometry.Transform.Transform(ellipseGeometry.Center);
          center = new Point(left + center.X, top - center.Y);
          if (Helper.IsNullOrZero(ellipseGeometry.RadiusX) && Helper.IsNullOrZero(ellipseGeometry.RadiusY))
            dc.Circle(center.X, center.Y, 0.01);
          else
          {
            var radius = shape.RenderedGeometry.Transform.Transform(new Point(ellipseGeometry.RadiusX, ellipseGeometry.RadiusY));
            var x1 = (Int32)Math.Max(1, Math.Round(center.X - radius.X));
            var y1 = (Int32)Math.Max(1, Math.Round(center.Y - radius.Y));
            var x2 = (Int32)Math.Max(1, Math.Round(center.X + radius.X));
            var y2 = (Int32)Math.Max(1, Math.Round(center.Y + radius.Y));
            dc.Ellipse(x1, y1, x2, y2);
          }
        }
        var streamGeometry = shape.RenderedGeometry as StreamGeometry;
        if (streamGeometry != null)
        {
          var figures = GeometryDataParser.GetDataFigures(streamGeometry.ToString());
          foreach (var figure in figures)
          {
            if (!figure.Draw(left, top, dc, shape.LayoutTransform))
              break;
          }
        }
        var pathGrometry = shape.RenderedGeometry as PathGeometry;
        if (pathGrometry != null)
        {
          var pathFigure = pathGrometry.Figures.First(p => p != null);
          if (pathFigure != null)
          {
            var points = new List<Point>();
            points.Add(shape.RenderedGeometry.Transform.Transform(pathFigure.StartPoint));

            var lineSegments = pathFigure.Segments.OfType<LineSegment>();
            if (lineSegments != null)
              points.AddRange(lineSegments.Select(p => shape.RenderedGeometry.Transform.Transform(p.Point)));

            var polyLineSegment = pathFigure.Segments.OfType<PolyLineSegment>().FirstOrDefault();
            if (polyLineSegment != null)
              points.AddRange(polyLineSegment.Points.Select(p => shape.RenderedGeometry.Transform.Transform(p)));

            points = points.Select(p => new Point(left + p.X, top - p.Y)).ToList();
            foreach (var point in points)
            {
              if (points.IndexOf(point) == 0)
                dc.MoveTo(point.X, point.Y);
              else
                dc.LineTo(point.X, point.Y);
            }
          }
        }

        if (!noBorder && !noBackground)
          dc.FillStroke();
        else
        {
          if (!noBorder)
            dc.Stroke();
          if (!noBackground)
            dc.Fill();
        }

        return true;
      }
      catch (Exception ex)
      {
        ExceptionHandler.ThrowException(ex);
        return false;
      }
      finally
      {
        dc.RestoreState();
      }
    }
        public void ReadAll()
        {
            if (Meta.ReadInt() != unchecked ((int)0x9AC6CDD7))
            {
                throw new DocumentException("Not a placeable windows metafile");
            }
            Meta.ReadWord();
            _left           = Meta.ReadShort();
            _top            = Meta.ReadShort();
            _right          = Meta.ReadShort();
            _bottom         = Meta.ReadShort();
            _inch           = Meta.ReadWord();
            _state.ScalingX = (_right - _left) / (float)_inch * 72f;
            _state.ScalingY = (_bottom - _top) / (float)_inch * 72f;
            _state.OffsetWx = _left;
            _state.OffsetWy = _top;
            _state.ExtentWx = _right - _left;
            _state.ExtentWy = _bottom - _top;
            Meta.ReadInt();
            Meta.ReadWord();
            Meta.Skip(18);

            int tsize;
            int function;

            Cb.SetLineCap(1);
            Cb.SetLineJoin(1);
            for (; ;)
            {
                var lenMarker = Meta.Length;
                tsize = Meta.ReadInt();
                if (tsize < 3)
                {
                    break;
                }

                function = Meta.ReadWord();
                switch (function)
                {
                case 0:
                    break;

                case META_CREATEPALETTE:
                case META_CREATEREGION:
                case META_DIBCREATEPATTERNBRUSH:
                    _state.AddMetaObject(new MetaObject());
                    break;

                case META_CREATEPENINDIRECT:
                {
                    var pen = new MetaPen();
                    pen.Init(Meta);
                    _state.AddMetaObject(pen);
                    break;
                }

                case META_CREATEBRUSHINDIRECT:
                {
                    var brush = new MetaBrush();
                    brush.Init(Meta);
                    _state.AddMetaObject(brush);
                    break;
                }

                case META_CREATEFONTINDIRECT:
                {
                    var font = new MetaFont();
                    font.Init(Meta);
                    _state.AddMetaObject(font);
                    break;
                }

                case META_SELECTOBJECT:
                {
                    var idx = Meta.ReadWord();
                    _state.SelectMetaObject(idx, Cb);
                    break;
                }

                case META_DELETEOBJECT:
                {
                    var idx = Meta.ReadWord();
                    _state.DeleteMetaObject(idx);
                    break;
                }

                case META_SAVEDC:
                    _state.SaveState(Cb);
                    break;

                case META_RESTOREDC:
                {
                    var idx = Meta.ReadShort();
                    _state.RestoreState(idx, Cb);
                    break;
                }

                case META_SETWINDOWORG:
                    _state.OffsetWy = Meta.ReadShort();
                    _state.OffsetWx = Meta.ReadShort();
                    break;

                case META_SETWINDOWEXT:
                    _state.ExtentWy = Meta.ReadShort();
                    _state.ExtentWx = Meta.ReadShort();
                    break;

                case META_MOVETO:
                {
                    var y = Meta.ReadShort();
                    var p = new System.Drawing.Point(Meta.ReadShort(), y);
                    _state.CurrentPoint = p;
                    break;
                }

                case META_LINETO:
                {
                    var y = Meta.ReadShort();
                    var x = Meta.ReadShort();
                    var p = _state.CurrentPoint;
                    Cb.MoveTo(_state.TransformX(p.X), _state.TransformY(p.Y));
                    Cb.LineTo(_state.TransformX(x), _state.TransformY(y));
                    Cb.Stroke();
                    _state.CurrentPoint = new System.Drawing.Point(x, y);
                    break;
                }

                case META_POLYLINE:
                {
                    _state.LineJoinPolygon = Cb;
                    var len = Meta.ReadWord();
                    var x   = Meta.ReadShort();
                    var y   = Meta.ReadShort();
                    Cb.MoveTo(_state.TransformX(x), _state.TransformY(y));
                    for (var k = 1; k < len; ++k)
                    {
                        x = Meta.ReadShort();
                        y = Meta.ReadShort();
                        Cb.LineTo(_state.TransformX(x), _state.TransformY(y));
                    }
                    Cb.Stroke();
                    break;
                }

                case META_POLYGON:
                {
                    if (IsNullStrokeFill(false))
                    {
                        break;
                    }

                    var len = Meta.ReadWord();
                    var sx  = Meta.ReadShort();
                    var sy  = Meta.ReadShort();
                    Cb.MoveTo(_state.TransformX(sx), _state.TransformY(sy));
                    for (var k = 1; k < len; ++k)
                    {
                        var x = Meta.ReadShort();
                        var y = Meta.ReadShort();
                        Cb.LineTo(_state.TransformX(x), _state.TransformY(y));
                    }
                    Cb.LineTo(_state.TransformX(sx), _state.TransformY(sy));
                    StrokeAndFill();
                    break;
                }

                case META_POLYPOLYGON:
                {
                    if (IsNullStrokeFill(false))
                    {
                        break;
                    }

                    var numPoly = Meta.ReadWord();
                    var lens    = new int[numPoly];
                    for (var k = 0; k < lens.Length; ++k)
                    {
                        lens[k] = Meta.ReadWord();
                    }

                    for (var j = 0; j < lens.Length; ++j)
                    {
                        var len = lens[j];
                        var sx  = Meta.ReadShort();
                        var sy  = Meta.ReadShort();
                        Cb.MoveTo(_state.TransformX(sx), _state.TransformY(sy));
                        for (var k = 1; k < len; ++k)
                        {
                            var x = Meta.ReadShort();
                            var y = Meta.ReadShort();
                            Cb.LineTo(_state.TransformX(x), _state.TransformY(y));
                        }
                        Cb.LineTo(_state.TransformX(sx), _state.TransformY(sy));
                    }
                    StrokeAndFill();
                    break;
                }

                case META_ELLIPSE:
                {
                    if (IsNullStrokeFill(_state.LineNeutral))
                    {
                        break;
                    }

                    var b = Meta.ReadShort();
                    var r = Meta.ReadShort();
                    var t = Meta.ReadShort();
                    var l = Meta.ReadShort();
                    Cb.Arc(_state.TransformX(l), _state.TransformY(b), _state.TransformX(r), _state.TransformY(t), 0, 360);
                    StrokeAndFill();
                    break;
                }

                case META_ARC:
                {
                    if (IsNullStrokeFill(_state.LineNeutral))
                    {
                        break;
                    }

                    var yend   = _state.TransformY(Meta.ReadShort());
                    var xend   = _state.TransformX(Meta.ReadShort());
                    var ystart = _state.TransformY(Meta.ReadShort());
                    var xstart = _state.TransformX(Meta.ReadShort());
                    var b      = _state.TransformY(Meta.ReadShort());
                    var r      = _state.TransformX(Meta.ReadShort());
                    var t      = _state.TransformY(Meta.ReadShort());
                    var l      = _state.TransformX(Meta.ReadShort());
                    var cx     = (r + l) / 2;
                    var cy     = (t + b) / 2;
                    var arc1   = GetArc(cx, cy, xstart, ystart);
                    var arc2   = GetArc(cx, cy, xend, yend);
                    arc2 -= arc1;
                    if (arc2 <= 0)
                    {
                        arc2 += 360;
                    }

                    Cb.Arc(l, b, r, t, arc1, arc2);
                    Cb.Stroke();
                    break;
                }

                case META_PIE:
                {
                    if (IsNullStrokeFill(_state.LineNeutral))
                    {
                        break;
                    }

                    var yend   = _state.TransformY(Meta.ReadShort());
                    var xend   = _state.TransformX(Meta.ReadShort());
                    var ystart = _state.TransformY(Meta.ReadShort());
                    var xstart = _state.TransformX(Meta.ReadShort());
                    var b      = _state.TransformY(Meta.ReadShort());
                    var r      = _state.TransformX(Meta.ReadShort());
                    var t      = _state.TransformY(Meta.ReadShort());
                    var l      = _state.TransformX(Meta.ReadShort());
                    var cx     = (r + l) / 2;
                    var cy     = (t + b) / 2;
                    var arc1   = GetArc(cx, cy, xstart, ystart);
                    var arc2   = GetArc(cx, cy, xend, yend);
                    arc2 -= arc1;
                    if (arc2 <= 0)
                    {
                        arc2 += 360;
                    }

                    var ar = PdfContentByte.BezierArc(l, b, r, t, arc1, arc2);
                    if (ar.Count == 0)
                    {
                        break;
                    }

                    var pt = (float[])ar[0];
                    Cb.MoveTo(cx, cy);
                    Cb.LineTo(pt[0], pt[1]);
                    for (var k = 0; k < ar.Count; ++k)
                    {
                        pt = (float[])ar[k];
                        Cb.CurveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
                    }
                    Cb.LineTo(cx, cy);
                    StrokeAndFill();
                    break;
                }

                case META_CHORD:
                {
                    if (IsNullStrokeFill(_state.LineNeutral))
                    {
                        break;
                    }

                    var yend   = _state.TransformY(Meta.ReadShort());
                    var xend   = _state.TransformX(Meta.ReadShort());
                    var ystart = _state.TransformY(Meta.ReadShort());
                    var xstart = _state.TransformX(Meta.ReadShort());
                    var b      = _state.TransformY(Meta.ReadShort());
                    var r      = _state.TransformX(Meta.ReadShort());
                    var t      = _state.TransformY(Meta.ReadShort());
                    var l      = _state.TransformX(Meta.ReadShort());
                    var cx     = (r + l) / 2;
                    var cy     = (t + b) / 2;
                    var arc1   = GetArc(cx, cy, xstart, ystart);
                    var arc2   = GetArc(cx, cy, xend, yend);
                    arc2 -= arc1;
                    if (arc2 <= 0)
                    {
                        arc2 += 360;
                    }

                    var ar = PdfContentByte.BezierArc(l, b, r, t, arc1, arc2);
                    if (ar.Count == 0)
                    {
                        break;
                    }

                    var pt = (float[])ar[0];
                    cx = pt[0];
                    cy = pt[1];
                    Cb.MoveTo(cx, cy);
                    for (var k = 0; k < ar.Count; ++k)
                    {
                        pt = (float[])ar[k];
                        Cb.CurveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
                    }
                    Cb.LineTo(cx, cy);
                    StrokeAndFill();
                    break;
                }

                case META_RECTANGLE:
                {
                    if (IsNullStrokeFill(true))
                    {
                        break;
                    }

                    var b = _state.TransformY(Meta.ReadShort());
                    var r = _state.TransformX(Meta.ReadShort());
                    var t = _state.TransformY(Meta.ReadShort());
                    var l = _state.TransformX(Meta.ReadShort());
                    Cb.Rectangle(l, b, r - l, t - b);
                    StrokeAndFill();
                    break;
                }

                case META_ROUNDRECT:
                {
                    if (IsNullStrokeFill(true))
                    {
                        break;
                    }

                    var h = _state.TransformY(0) - _state.TransformY(Meta.ReadShort());
                    var w = _state.TransformX(Meta.ReadShort()) - _state.TransformX(0);
                    var b = _state.TransformY(Meta.ReadShort());
                    var r = _state.TransformX(Meta.ReadShort());
                    var t = _state.TransformY(Meta.ReadShort());
                    var l = _state.TransformX(Meta.ReadShort());
                    Cb.RoundRectangle(l, b, r - l, t - b, (h + w) / 4);
                    StrokeAndFill();
                    break;
                }

                case META_INTERSECTCLIPRECT:
                {
                    var b = _state.TransformY(Meta.ReadShort());
                    var r = _state.TransformX(Meta.ReadShort());
                    var t = _state.TransformY(Meta.ReadShort());
                    var l = _state.TransformX(Meta.ReadShort());
                    Cb.Rectangle(l, b, r - l, t - b);
                    Cb.EoClip();
                    Cb.NewPath();
                    break;
                }

                case META_EXTTEXTOUT:
                {
                    var y     = Meta.ReadShort();
                    var x     = Meta.ReadShort();
                    var count = Meta.ReadWord();
                    var flag  = Meta.ReadWord();
                    var x1    = 0;
                    var y1    = 0;
                    var x2    = 0;
                    var y2    = 0;
                    if ((flag & (MetaFont.ETO_CLIPPED | MetaFont.ETO_OPAQUE)) != 0)
                    {
                        x1 = Meta.ReadShort();
                        y1 = Meta.ReadShort();
                        x2 = Meta.ReadShort();
                        y2 = Meta.ReadShort();
                    }
                    var text = new byte[count];
                    int k;
                    for (k = 0; k < count; ++k)
                    {
                        var c = (byte)Meta.ReadByte();
                        if (c == 0)
                        {
                            break;
                        }

                        text[k] = c;
                    }
                    string s;
                    try
                    {
                        s = EncodingsRegistry.Instance.GetEncoding(1252).GetString(text, 0, k);
                    }
                    catch
                    {
                        s = System.Text.Encoding.ASCII.GetString(text, 0, k);
                    }
                    OutputText(x, y, flag, x1, y1, x2, y2, s);
                    break;
                }

                case META_TEXTOUT:
                {
                    var count = Meta.ReadWord();
                    var text  = new byte[count];
                    int k;
                    for (k = 0; k < count; ++k)
                    {
                        var c = (byte)Meta.ReadByte();
                        if (c == 0)
                        {
                            break;
                        }

                        text[k] = c;
                    }
                    string s;
                    try
                    {
                        s = EncodingsRegistry.Instance.GetEncoding(1252).GetString(text, 0, k);
                    }
                    catch
                    {
                        s = System.Text.Encoding.ASCII.GetString(text, 0, k);
                    }
                    count = (count + 1) & 0xfffe;
                    Meta.Skip(count - k);
                    var y = Meta.ReadShort();
                    var x = Meta.ReadShort();
                    OutputText(x, y, 0, 0, 0, 0, 0, s);
                    break;
                }

                case META_SETBKCOLOR:
                    _state.CurrentBackgroundColor = Meta.ReadColor();
                    break;

                case META_SETTEXTCOLOR:
                    _state.CurrentTextColor = Meta.ReadColor();
                    break;

                case META_SETTEXTALIGN:
                    _state.TextAlign = Meta.ReadWord();
                    break;

                case META_SETBKMODE:
                    _state.BackgroundMode = Meta.ReadWord();
                    break;

                case META_SETPOLYFILLMODE:
                    _state.PolyFillMode = Meta.ReadWord();
                    break;

                case META_SETPIXEL:
                {
                    var color = Meta.ReadColor();
                    var y     = Meta.ReadShort();
                    var x     = Meta.ReadShort();
                    Cb.SaveState();
                    Cb.SetColorFill(color);
                    Cb.Rectangle(_state.TransformX(x), _state.TransformY(y), .2f, .2f);
                    Cb.Fill();
                    Cb.RestoreState();
                    break;
                }

                case META_DIBSTRETCHBLT:
                case META_STRETCHDIB:
                {
                    var rop = Meta.ReadInt();
                    if (function == META_STRETCHDIB)
                    {
                        /*int usage = */
                        Meta.ReadWord();
                    }
                    var srcHeight  = Meta.ReadShort();
                    var srcWidth   = Meta.ReadShort();
                    var ySrc       = Meta.ReadShort();
                    var xSrc       = Meta.ReadShort();
                    var destHeight = _state.TransformY(Meta.ReadShort()) - _state.TransformY(0);
                    var destWidth  = _state.TransformX(Meta.ReadShort()) - _state.TransformX(0);
                    var yDest      = _state.TransformY(Meta.ReadShort());
                    var xDest      = _state.TransformX(Meta.ReadShort());
                    var b          = new byte[(tsize * 2) - (Meta.Length - lenMarker)];
                    for (var k = 0; k < b.Length; ++k)
                    {
                        b[k] = (byte)Meta.ReadByte();
                    }

                    try
                    {
                        var inb = new MemoryStream(b);
                        var bmp = BmpImage.GetImage(inb, true, b.Length);
                        Cb.SaveState();
                        Cb.Rectangle(xDest, yDest, destWidth, destHeight);
                        Cb.Clip();
                        Cb.NewPath();
                        bmp.ScaleAbsolute(destWidth * bmp.Width / srcWidth, -destHeight * bmp.Height / srcHeight);
                        bmp.SetAbsolutePosition(xDest - destWidth * xSrc / srcWidth, yDest + destHeight * ySrc / srcHeight - bmp.ScaledHeight);
                        Cb.AddImage(bmp);
                        Cb.RestoreState();
                    }
                    catch
                    {
                        // empty on purpose
                    }
                    break;
                }
                }
                Meta.Skip((tsize * 2) - (Meta.Length - lenMarker));
            }
            _state.Cleanup(Cb);
        }
        public virtual void LabSpotBasedGradient()
        {
            // step 1
            Document document = new Document(PageSize.A3);
            // step 2
            String    dest_file = DEST_FOLDER + "/lab_spot_based_gradient.pdf";
            PdfWriter writer    = PdfWriter.GetInstance(document, new FileStream(dest_file, FileMode.Create));

            // step 3
            document.Open();
            // step 4
            PdfContentByte canvas      = writer.DirectContent;
            PdfLabColor    pdfLabColor = new PdfLabColor(new float[] { 0.9505f, 1.0f, 1.0890f }, new float[] { 0f, 0.5f, 1.5f },
                                                         new float[] { -10, 100, -10, 100 });
            PdfDeviceNColor pdfDeviceNNChannelColor =
                new PdfDeviceNColor(new PdfSpotColor[] {
                new PdfSpotColor("lab3", pdfLabColor.Rgb2lab(new BaseColor(0, 217, 83))),
                new PdfSpotColor("labBlue", pdfLabColor.Rgb2lab(new BaseColor(0, 0, 255)))
            });
            PdfSpotColor psc_lab3     = new PdfSpotColor("lab3", pdfLabColor.Rgb2lab(new BaseColor(0, 217, 83)));
            PdfSpotColor psc_lab2     = new PdfSpotColor("lab2", pdfLabColor.Rgb2lab(new BaseColor(70, 138, 96)));
            PdfSpotColor psc_lab1     = new PdfSpotColor("lab1", pdfLabColor.Rgb2lab(new BaseColor(255, 0, 0)));
            PdfSpotColor psc_lab_blue = new PdfSpotColor("labBlue", new BaseColor(0, 0, 100));

            PdfDeviceNColor pdfDeviceNNChannelColor2 = new PdfDeviceNColor(new PdfSpotColor[] { psc_lab_blue, psc_lab2, psc_lab1 });

            ColorRectangle(canvas, pdfLabColor.Rgb2lab(new BaseColor(0, 0, 255)), 36, 878, 36, 36);
            ColorRectangle(canvas, pdfLabColor.Rgb2lab(new BaseColor(70, 138, 96)), 90, 878, 36, 36);
            ColorRectangle(canvas, pdfLabColor.Rgb2lab(new BaseColor(0, 217, 83)), 144, 878, 36, 36);
            ColorRectangle(canvas, pdfLabColor.Rgb2lab(new BaseColor(0, 50, 50)), 198, 878, 36, 36);

            ColorRectangle(canvas, pdfLabColor.Rgb2lab(new BaseColor(0, 0, 255)).ToRgb(), 36, 824, 36, 36);
            ColorRectangle(canvas, pdfLabColor.Rgb2lab(new BaseColor(70, 138, 96)).ToRgb(), 90, 824, 36, 36);
            ColorRectangle(canvas, pdfLabColor.Rgb2lab(new BaseColor(0, 217, 83)).ToRgb(), 144, 824, 36, 36);
            ColorRectangle(canvas, pdfLabColor.Rgb2lab(new BaseColor(0, 50, 50)).ToRgb(), 198, 824, 36, 36);


            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab1", pdfLabColor.Rgb2lab(new BaseColor(255, 0, 0))), 1f), 36, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab1", pdfLabColor.Rgb2lab(new BaseColor(255, 0, 0))), 0.8f), 90, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab1", pdfLabColor.Rgb2lab(new BaseColor(255, 0, 0))), 0.6f), 144, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab1", pdfLabColor.Rgb2lab(new BaseColor(255, 0, 0))), 0.2f), 198, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab2", pdfLabColor.Rgb2lab(new BaseColor(70, 138, 96))), 1f), 252, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab2", pdfLabColor.Rgb2lab(new BaseColor(70, 138, 96))), 0.8f), 306, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab2", pdfLabColor.Rgb2lab(new BaseColor(70, 138, 96))), 0.6f), 360, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab2", pdfLabColor.Rgb2lab(new BaseColor(70, 138, 96))), 0.2f), 416, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab3", pdfLabColor.Rgb2lab(new BaseColor(0, 217, 83))), 1.0f), 470, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab3", pdfLabColor.Rgb2lab(new BaseColor(0, 217, 83))), 0.8f), 524, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab3", pdfLabColor.Rgb2lab(new BaseColor(0, 217, 83))), 0.6f), 578, 986, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("lab3", pdfLabColor.Rgb2lab(new BaseColor(0, 217, 83))), 0.2f), 634, 986, 36, 36);

            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb1", new BaseColor(255, 0, 0)), 1f), 36, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb1", new BaseColor(255, 0, 0)), 0.8f), 90, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb1", new BaseColor(255, 0, 0)), 0.6f), 144, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb1", new BaseColor(255, 0, 0)), 0.2f), 198, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb2", new BaseColor(70, 138, 96)), 1f), 252, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb2", new BaseColor(70, 138, 96)), 0.8f), 306, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb2", new BaseColor(70, 138, 96)), 0.6f), 360, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb2", new BaseColor(70, 138, 96)), 0.2f), 416, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb3", new BaseColor(0, 217, 83)), 1.0f), 470, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb3", new BaseColor(0, 217, 83)), 0.8f), 524, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb3", new BaseColor(0, 217, 83)), 0.6f), 578, 932, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("rgb3", new BaseColor(0, 217, 83)), 0.2f), 634, 932, 36, 36);

            ColorRectangle(canvas, new DeviceNColor(new PdfDeviceNColor(new PdfSpotColor[] { psc_lab2, psc_lab_blue, psc_lab1 }), new float[] { 0, 0.0f, 1 }), 36, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.1f, 0.1f }), 90, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.2f, 0.2f }), 144, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.3f, 0.3f }), 198, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.4f, 0.4f }), 252, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(new PdfDeviceNColor(new PdfSpotColor[] { psc_lab2, psc_lab_blue, psc_lab1, psc_lab3 }), new float[] { 0.5f, 0.5f, 1, 0.5f }), 306, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor2, new float[] { 0.6f, 0.1f, 0.5f }), 360, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.7f, 0.7f }), 416, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.8f, 0.8f }), 470, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(new PdfDeviceNColor(new PdfSpotColor[] { psc_lab2, psc_lab_blue, psc_lab1 }), new float[] { 0.9f, 0.9f, 1 }), 524, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 1, 1 }), 578, 770, 36, 36);

            canvas.SaveState();
            canvas.Rectangle(418, 412, -329, 189);
            canvas.Clip();
            canvas.NewPath();
            canvas.SaveState();
            canvas.ConcatCTM(329f, 0f, 0f, -329f, 89f, 506.5f);
            canvas.PaintShading(PdfShading.SimpleAxial(writer, 0, 0, 1, 0, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 1, 0 }), new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0, 1 })));
            canvas.RestoreState();
            canvas.RestoreState();
            canvas.SetColorStroke(new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 1, 1 }));
            canvas.Rectangle(418, 412, -329, 189);
            canvas.Stroke();

            // step 5
            document.Close();

            CompareTool compareTool = new CompareTool();
            String      error       = compareTool.Compare(dest_file, TEST_RESOURCES_PATH + "cmp_lab_spot_based_gradient.pdf", DEST_FOLDER, "diff");

            if (error != null)
            {
                Assert.Fail(error);
            }
        }
Esempio n. 8
0
        public virtual void DeviceNSpotBasedGradient()
        {
            // step 1
            Document document = new Document(PageSize.A3);
            // step 2
            String    dest_file = DEST_FOLDER + "/device_n_gradient_base.pdf";
            PdfWriter writer    = PdfWriter.GetInstance(document, new FileStream(dest_file, FileMode.Create));

            // step 3
            document.Open();
            // step 4
            PdfContentByte canvas         = writer.DirectContent;
            PdfSpotColor   psc_gray       = new PdfSpotColor("iTextGray", new GrayColor(0f));
            PdfSpotColor   psc_cmyk_yell  = new PdfSpotColor("iTextYellow", new CMYKColor(0f, 0f, 1f, 0f));
            PdfSpotColor   psc_cmyk_magen = new PdfSpotColor("iTextMagenta", new CMYKColor(0f, 1f, 0f, 0f));
            PdfSpotColor   psc_rgb_blue   = new PdfSpotColor("iTextBlue", new BaseColor(0, 0, 255));

            PdfDeviceNColor pdfDeviceNNChannelColor =
                new PdfDeviceNColor(new PdfSpotColor[] { psc_cmyk_yell, psc_cmyk_magen, psc_rgb_blue });
            PdfDeviceNColor pdfDeviceNNChannelColor2 =
                new PdfDeviceNColor(new PdfSpotColor[] { psc_cmyk_magen, psc_cmyk_yell, psc_rgb_blue });

            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("iTextGray", new GrayColor(0f)), 0.8f), 36, 824, 36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("iTextYellow", new CMYKColor(0f, 0f, 1f, 0f)), 0.8f), 90, 824,
                           36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("iTextMagenta", new CMYKColor(0f, 1f, 0f, 0f)), 0.4f), 144, 824,
                           36, 36);
            ColorRectangle(canvas, new SpotColor(new PdfSpotColor("iTextBlue", new BaseColor(0, 0, 255)), 0.7f), 198, 824, 36, 36);

            ColorRectangle(canvas,
                           new DeviceNColor(new PdfDeviceNColor(new PdfSpotColor[] { psc_cmyk_yell, psc_cmyk_magen, psc_rgb_blue }),
                                            new float[] { 0, 0.0f, 1 }), 36, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.1f, 0.1f, 1 }), 90, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.2f, 0.2f, 1 }), 144, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.3f, 0.3f, 1 }), 198, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.4f, 0.4f, 1 }), 252, 770, 36, 36);
            ColorRectangle(canvas,
                           new DeviceNColor(new PdfDeviceNColor(new PdfSpotColor[] { psc_cmyk_yell, psc_cmyk_magen, psc_rgb_blue, psc_gray }),
                                            new float[] { 0.5f, 0.5f, 1, 0.5f }), 306, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor2, new float[] { 0.6f, 0.1f, 1 }), 360, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.7f, 0.7f, 1 }), 416, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0.8f, 0.8f, 1 }), 470, 770, 36, 36);
            ColorRectangle(canvas,
                           new DeviceNColor(new PdfDeviceNColor(new PdfSpotColor[] { psc_cmyk_yell, psc_cmyk_magen, psc_rgb_blue }),
                                            new float[] { 0.9f, 0.9f, 1 }), 524, 770, 36, 36);
            ColorRectangle(canvas, new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 1, 1, 1 }), 578, 770, 36, 36);

            PdfDeviceNColor pdfDeviceNColor = new PdfDeviceNColor(new PdfSpotColor[] { psc_cmyk_yell, psc_cmyk_magen, psc_rgb_blue });

            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 0, 0, 1 }));
            canvas.Rectangle(36, 716, 36, 36);
            canvas.FillStroke();
            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 0.1f, 0.1f, 1 }));
            canvas.Rectangle(90, 716, 36, 36);
            canvas.FillStroke();
            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 0.2f, 0.2f, 1 }));
            canvas.Rectangle(144, 716, 36, 36);
            canvas.FillStroke();
            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 0.3f, 0.3f, 1 }));
            canvas.Rectangle(198, 716, 36, 36);
            canvas.FillStroke();
            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 0.4f, 0.4f, 1 }));
            canvas.Rectangle(252, 716, 36, 36);
            canvas.FillStroke();
            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 0.5f, 0.5f, 1 }));
            canvas.Rectangle(306, 716, 36, 36);
            canvas.FillStroke();
            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 0.6f, 0.1f, 1 }));
            canvas.Rectangle(360, 716, 36, 36);
            canvas.FillStroke();
            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 0.7f, 0.7f, 1 }));
            canvas.Rectangle(416, 716, 36, 36);
            canvas.FillStroke();
            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 0.8f, 0.8f, 1 }));
            canvas.Rectangle(470, 716, 36, 36);
            canvas.FillStroke();
            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 0.9f, 0.9f, 1 }));
            canvas.Rectangle(524, 716, 36, 36);
            canvas.FillStroke();
            canvas.SetColorFill(new DeviceNColor(pdfDeviceNColor, new float[] { 1, 1, 1 }));
            canvas.Rectangle(578, 716, 36, 36);
            canvas.FillStroke();

            canvas.SaveState();
            canvas.Rectangle(418, 412, -329, 189);
            canvas.Clip();
            canvas.NewPath();
            canvas.SaveState();
            canvas.ConcatCTM(329f, 0f, 0f, -329f, 89f, 506.5f);
            canvas.PaintShading(PdfShading.SimpleAxial(writer, 0, 0, 1, 0,
                                                       new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 1, 1, 0 }),
                                                       new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 0, 0, 1 })));
            canvas.RestoreState();
            canvas.RestoreState();
            canvas.SetColorStroke(new DeviceNColor(pdfDeviceNNChannelColor, new float[] { 1, 1, 1 }));
            canvas.Rectangle(418, 412, -329, 189);
            canvas.Stroke();

            // step 5
            document.Close();

            CompareTool compareTool = new CompareTool();
            String      error       = compareTool.Compare(dest_file, TEST_RESOURCES_PATH + "cmp_device_n_gradient_base.pdf", DEST_FOLDER, "diff_");

            if (error != null)
            {
                Assert.Fail(error);
            }
        }
Esempio n. 9
0
        /**
        * Writes the selected rows to the document.
        * This method clips the columns; this is only important
        * if there are columns with colspan at boundaries.
        * <P>
        * The table event is only fired for complete rows.
        *
        * @param colStart the first column to be written, zero index
        * @param colEnd the last column to be written + 1. If it is -1 all the
        * @param rowStart the first row to be written, zero index
        * @param rowEnd the last row to be written + 1. If it is -1 all the
        * rows to the end are written
        * @param xPos the x write coodinate
        * @param yPos the y write coodinate
        * @param canvas the <CODE>PdfContentByte</CODE> where the rows will
        * be written to
        * @return the y coordinate position of the bottom of the last row
        */
        public float WriteSelectedRows(int colStart, int colEnd, int rowStart, int rowEnd, float xPos, float yPos, PdfContentByte canvas)
        {
            int totalCols = NumberOfColumns;
            if (colStart < 0)
                colStart = 0;
            else
                colStart = Math.Min(colStart, totalCols);

            if (colEnd < 0)
                colEnd = totalCols;
            else
                colEnd = Math.Min(colEnd, totalCols);

            bool clip = (colStart != 0 || colEnd != totalCols);

            if (clip) {
                float w = 0;
                for (int k = colStart; k < colEnd; ++k)
                    w += absoluteWidths[k];
                canvas.SaveState();
                float lx = (colStart == 0) ? 10000 : 0;
                float rx = (colEnd == totalCols) ? 10000 : 0;
                canvas.Rectangle(xPos - lx, -10000, w + lx + rx, PdfPRow.RIGHT_LIMIT);
                canvas.Clip();
                canvas.NewPath();
            }

            PdfContentByte[] canvases = BeginWritingRows(canvas);
            float y = WriteSelectedRows(colStart, colEnd, rowStart, rowEnd, xPos, yPos, canvases);
            EndWritingRows(canvases);

            if (clip)
                canvas.RestoreState();

            return y;
        }
Esempio n. 10
0
// ---------------------------------------------------------------------------
        public byte[] CreatePdf()
        {
            using (MemoryStream ms = new MemoryStream()) {
                // step 1
                using (Document document = new Document(new Rectangle(850, 600))) {
                    // step 2
                    PdfWriter writer = PdfWriter.GetInstance(document, ms);
                    // step 3
                    document.Open();
                    // step 4
                    PdfContentByte canvas = writer.DirectContent;
                    // add the clipped image
                    Image img = Image.GetInstance(
                        Path.Combine(Utility.ResourceImage, RESOURCE)
                        );
                    float w = img.ScaledWidth;
                    float h = img.ScaledHeight;
                    canvas.Ellipse(1, 1, 848, 598);
                    canvas.Clip();
                    canvas.NewPath();
                    canvas.AddImage(img, w, 0, 0, h, 0, -600);

                    // Create a transparent PdfTemplate
                    PdfTemplate          t2         = writer.DirectContent.CreateTemplate(850, 600);
                    PdfTransparencyGroup transGroup = new PdfTransparencyGroup();
                    transGroup.Put(PdfName.CS, PdfName.DEVICEGRAY);
                    transGroup.Isolated = true;
                    transGroup.Knockout = false;
                    t2.Group            = transGroup;

                    // Add transparent ellipses to the template
                    int     gradationStep      = 30;
                    float[] gradationRatioList = new float[gradationStep];
                    for (int i = 0; i < gradationStep; i++)
                    {
/*
 * gotta love .NET, guess they forgot to copy java.lang.Math.toRadians
 */
                        double radians = (Math.PI / 180) * 90.0f / gradationStep * (i + 1);
                        gradationRatioList[i] = 1 - (float)Math.Sin(radians);
                    }
                    for (int i = 1; i < gradationStep + 1; i++)
                    {
                        t2.SetLineWidth(5 * (gradationStep + 1 - i));
                        t2.SetGrayStroke(gradationRatioList[gradationStep - i]);
                        t2.Ellipse(0, 0, 850, 600);
                        t2.Stroke();
                    }

                    // Create an image mask for the direct content
                    PdfDictionary maskDict = new PdfDictionary();
                    maskDict.Put(PdfName.TYPE, PdfName.MASK);
                    maskDict.Put(PdfName.S, new PdfName("Luminosity"));
                    maskDict.Put(new PdfName("G"), t2.IndirectReference);
                    PdfGState gState = new PdfGState();
                    gState.Put(PdfName.SMASK, maskDict);
                    canvas.SetGState(gState);

                    canvas.AddTemplate(t2, 0, 0);
                }
                return(ms.ToArray());
            }
        }
Esempio n. 11
0
        // 画像をクリッピングして貼り付ける
        public static PdfContentByte AddClippedImage(PdfContentByte pdfContentByte, string imagePath, float x, float y, float frmW, float frmH, int align)
        {
            void DoNothing()
            {
            }                       // 何もしない関数を定義

            using (Stream inputImageStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                Image image = Image.GetInstance(inputImageStream);
                float imgW  = image.ScaledWidth;
                float imgH  = image.ScaledHeight;
                float scale;

                pdfContentByte.SaveState();   // クリッピングパス削除のため使用
                pdfContentByte.Rectangle(x, y, frmW, frmH);
                pdfContentByte.Clip();
                pdfContentByte.NewPath();

                // 画像縦長の場合
                if ((align != PDFAppend.CENTER && (frmW / frmH > imgW / imgH)) || (align == PDFAppend.CENTER && (frmW / frmH < imgW / imgH)))
                {
                    float scaledWidth = frmW;
                    scale = frmW / imgW;
                    float scaledHeight = imgH * scale;

                    if (align == PDFAppend.TOP)
                    {
                        y = y - (scaledHeight - frmH);
                    }
                    else if (align == PDFAppend.BOTTOM)
                    {
                        DoNothing();
                    }
                    else
                    {
                        y = y - ((scaledHeight - frmH) / 2);
                    }
                }
                else  // 画像横長の場合
                {
                    float scaledHeight = frmH;
                    scale = frmH / imgH;
                    float scaledWidth = imgW * scale;

                    if (align == PDFAppend.LEFT)
                    {
                        DoNothing();
                    }
                    else if (align == PDFAppend.RIGHT)
                    {
                        x = x - (scaledWidth - frmW);
                    }
                    else
                    {
                        x = x - ((scaledWidth - frmW) / 2);
                    }
                }
                image.ScalePercent(scale * 100);
                image.SetAbsolutePosition(x, y);
                pdfContentByte.AddImage(image);
                pdfContentByte.RestoreState();
            }
            return(pdfContentByte);
        }