public async Task Render(IDocument document, Stream stream) { var children = document.Children.Count; if (children == 0) { return; } var svg = document.RootElement; if (svg == null) { throw new Exception("No svg element"); } var pageSize = new PxSize(1024, 1024); var context = FrameContext.CreateRoot(pageSize); var size = svg.GetSize(context, pageSize); var viewPort = svg.GetViewBox()?.AsRectangle() ?? size.AsRectangle(); var newContext = context.Create(viewPort.Size); using (var render = Create(viewPort.Size, out var bm)) { var dc = render.Target; dc.BeginDraw(); dc.Clear(new RawColor4(1f, 1f, 1f, 1f)); await render.GetRenderer("svg")(svg, newContext, render); dc.EndDraw(); if (stream != null) { Save(bm, stream); } } }
public async Task Render(IEnumerable <string> docNames, Stream outStream) { var ticket = Printing.Printing.CreateTicketForPrinter("Microsoft Print to PDF"); var pms = ticket.PageMediaSize; var pageSize = new PxSize( (pms.Width != null) ? (float)pms.Width : 4962, (pms.Height != null) ? (float)pms.Height : 7014 ); using (var target = Printing.Printing.CreatePrintTarget(ticket, "Microsoft Print to PDF", outStream)) using (var printControl = new D2D1.PrintControl(D2DDevice, WicFactory, target)) using (var dc = new D2D1.DeviceContext(D2DDevice, D2D1.DeviceContextOptions.None)) { dc.DotsPerInch = new DX.Size2F(600, 600); var pageStack = new List <RendererDirect2D> (); var pageY = 0; var frameContext = FrameContext.CreateRoot(pageSize); D2D1.CommandList commandList = null; foreach (var fn in docNames) { try { var document = await Loader.Load(new Uri(fn, UriKind.RelativeOrAbsolute)); var children = document.Children.Count; if (children == 0) { continue; } var svg = document.RootElement; if (svg == null) { continue; } var size = svg.GetSize(frameContext, pageSize); var viewPort = svg.GetViewBox()?.AsRectangle() ?? size.AsRectangle(); var ratio = svg.GetPreserveAspectRatio().CalcMatrix(size, viewPort); var renderSize = new PxSize( (int)(0.5f + (viewPort.Width * ratio.M11)), (int)(0.5f + (viewPort.Height * ratio.M22)) ); if (pageStack.Count > 0 && pageY + renderSize.Height > pms.Height) { dc.EndDraw(); commandList.Close(); printControl.AddPage(commandList, new DX.Size2F(pageSize.Width, pageSize.Height)); commandList.Dispose(); foreach (var r in pageStack) { r.Dispose(); } pageStack.Clear(); pageY = 0; commandList = null; } dc.Transform = DX.Matrix3x2.Translation(0, pageY); if (commandList == null) { commandList = new D2D1.CommandList(dc); dc.Target = commandList; dc.BeginDraw(); } var render = new RendererDirect2D(this, dc); await render.GetRenderer(svg.ElementType)(svg, FrameContext.CreateRoot(renderSize), render); pageStack.Add(render); pageY += (int)renderSize.Height; } catch (Exception ex) { Console.WriteLine("Skipping {0}", ex); //throw ex; } } if (pageStack.Count > 0) { dc.EndDraw(); commandList.Close(); printControl.AddPage(commandList, new DX.Size2F(pageSize.Width, pageSize.Height)); commandList.Dispose(); foreach (var r in pageStack) { r.Dispose(); } pageStack.Clear(); } // Send the job to the printing subsystem and discard // printing-specific resources. printControl.Close(); } }