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(); }
/** * 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); }
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); } }
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); }
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); } }
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); } }
/** * 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; }
// --------------------------------------------------------------------------- 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()); } }
// 画像をクリッピングして貼り付ける 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); }