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();
                    }
        }