public static void ToFile(string fileName, IEnumerable <IVisual> visuals) { using var doc = SKDocument.CreatePdf(fileName); foreach (var visual in visuals) { var bounds = visual.Bounds; var page = doc.BeginPage((float)bounds.Width, (float)bounds.Height); using var context = new DrawingContext(DrawingContextHelper.WrapSkiaCanvas(page, SkiaPlatform.DefaultDpi)); ImmediateRenderer.Render(visual, context); doc.EndPage(); } doc.Close(); }
public void Render(IDrawingContextImpl context) { if (context is not ISkiaDrawingContextImpl skia) { return; } if (!skia.SkCanvas.TotalMatrix.TryInvert(out var currentInvertedTransform)) { return; } // One or both dimensions has zero size. // Skia doesnt like that. if (_bounds.Size.AspectRatio == 0) { return; } using var backgroundSnapshot = skia.SkSurface.Snapshot(); using var preBlur = DrawingContextHelper.CreateDrawingContext( new Size(backgroundSnapshot.Width, backgroundSnapshot.Height), new Vector(96, 96), skia.GrContext); using (var filter = SKImageFilter.CreateBlur((int)_blurRadius.X, (int)_blurRadius.Y, SKShaderTileMode.Clamp)) using (var blurPaint = new SKPaint { ImageFilter = filter }) { var canvas = preBlur.SkSurface.Canvas; canvas.DrawSurface(skia.SkSurface, 0f, 0f, blurPaint); canvas.Flush(); } using var preBlurredSnapshot = preBlur.SkSurface.Snapshot(); using var backdropShader = SKShader.CreateImage(preBlurredSnapshot, SKShaderTileMode.Clamp, SKShaderTileMode.Clamp, currentInvertedTransform); using var blurred = DrawingContextHelper.CreateDrawingContext(_bounds.Size, new Vector(96, 96), skia.GrContext); using (var blurPaint = new SKPaint { Shader = backdropShader }) { blurred.SkSurface.Canvas.DrawRect(0, 0, (float)_bounds.Width, (float)_bounds.Height, blurPaint); } blurred.DrawTo(skia); }
public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { return(DrawingContextHelper.WrapSkiaCanvas(_canvas, new Vector(_dpi, _dpi), visualBrushRenderer)); }
/// <summary> /// ページを描画する /// </summary> /// <param name="dch">ドローイングコンテキスト</param> /// <param name="arg">レポート引数</param> protected override void DrawingPage(DrawingContextHelper dch, ReportArgument arg) { var titleFont = new FontInfo("Meiryo", true, 32, Brushes.Black); // ヘッダの描画 dch.DrawText("蔵書リスト", titleFont, CM2PX(1.0d), CM2PX(1.5d)); dch.DrawText(string.Format("Page.{0}", arg.PageNo), CM2PX(26.5d), CM2PX(1.4d)); Table.HeaderColumns[0].DrawText("No", TextAlignment.Right, dch); Table.HeaderColumns[1].DrawText("書名", TextAlignment.Left, dch); Table.HeaderColumns[2].DrawText("著者名", TextAlignment.Left, dch); Table.HeaderColumns[3].DrawText("出版社", TextAlignment.Left, dch); Table.HeaderColumns[4].DrawText("カテゴリ", TextAlignment.Left, dch); Table.HeaderColumns[5].DrawText("価格", TextAlignment.Right, dch); Table.HeaderColumns[6].DrawText("購入日", TextAlignment.Center, dch); Table.HeaderColumns[7].DrawText("評価点", TextAlignment.Left, dch); // 明細の描画 Table.RowIndex = 0; while (DataRowIndex < BookList.Count) { // 1ページ分明細行を印刷したらブレイク if (Table.PageBreak) { break; } if (Table.RowIndex % 2 != 0) { Table.DrawRowBorder(Table.RowIndex, null, new Thickness(0.0d), Brushes.WhiteSmoke, dch); } var book = BookList[DataRowIndex]; Table[0].DrawText(book.Id.ToString(), TextAlignment.Right, dch); Table[1].DrawText(book.Title, TextAlignment.Left, dch); Table[2].DrawText(book.Author, TextAlignment.Left, dch); Table[3].DrawText(book.Publisher, TextAlignment.Left, dch); if (book.Category.HasValue) { Table[4].DrawText(AttributeUtil.GetEnumFieldDisplayName(book.Category.Value), TextAlignment.Left, dch); } if (book.Price.HasValue) { Table[5].DrawText(book.Price.Value.ToString("#,##0円"), TextAlignment.Right, dch); } if (book.PurchaseDate.HasValue) { Table[6].DrawText(book.PurchaseDate.Value.ToString("yyyy/MM/dd"), TextAlignment.Center, dch); } if (book.ReviewPoint.HasValue) { Table[7].DrawText(new String('★', book.ReviewPoint.Value), TextAlignment.Left, dch); } DataRowIndex++; Table.RowIndex++; } // 枠線の描画 Table.DrawBorder(dch.DefaulBrush, new Thickness(1.0d), null, dch); Table.DrawHeaderBorder(dch.DefaulBrush, new Thickness(0.0d, 0.0d, 0.0d, 1.0d), null, dch); // 印刷すべきデータがまだあれば印刷を継続する arg.PrintTerminate = (DataRowIndex >= BookList.Count); }
private DrawingContextImpl CreateTarget() { var canvas = new SKCanvas(new SKBitmap(100, 100)); return((DrawingContextImpl)DrawingContextHelper.WrapSkiaCanvas(canvas, new Vector(96, 96))); }