public override async Task <bool> SetDocumentAsync(string doc) { _ready = false; _litehtml = null; _htmlBitmap = null; Document = doc; return(await Task.FromResult(true)); }
public async override Task <string> LoadAsync(string filePath) { litehtml = null; htmlBitmap = null; document = await base.LoadAsync(filePath); return(document); }
/// <summary> /// Get total count of pages. Set any local page-size related values (e.g. linesPerPage) /// </summary> /// <param name="e"></param> /// <returns></returns> public override async Task <int> RenderAsync(System.Drawing.Printing.PrinterResolution printerResolution) { Helpers.Logging.TraceMessage("HtmlFileContent.RenderAsync()"); await base.RenderAsync(printerResolution); int width = (int)PageSize.Width; // (printerResolution.X * PageSize.Width / 100); int height = (int)PageSize.Height; // (printerResolution.Y * PageSize.Height / 100); Helpers.Logging.TraceMessage($"HtmlFileContent.RenderAsync - Page size: {width}x{height} @ {printerResolution.X}x{printerResolution.Y} dpi"); string css; try { // TODO: Make sure wiprint.css is in the same dir as .config file once setup is impl using StreamReader cssStream = new StreamReader("winprint.css"); css = await cssStream.ReadToEndAsync(); cssStream.Close(); } catch { css = IncludedWinPrintCss.CssString; } var resources = new HtmlResources(filePath); litehtml = new GDIPlusContainer(css, resources.GetResourceString, resources.GetResourceBytes); litehtml.Size = new LiteHtmlSize(width, 0); litehtml.PageHeight = height; htmlBitmap = new Bitmap(width, height); //htmlBitmap.SetResolution(printerResolution.X, printerResolution.Y); var g = Graphics.FromImage(htmlBitmap); g.PageUnit = GraphicsUnit.Display; //g.FillRectangle(Brushes.LightYellow, new Rectangle(0, 0, width, height)); Helpers.Logging.TraceMessage($"HtmlFileContent.RenderAsync() Graphic is {htmlBitmap.Width}x{htmlBitmap.Height} @ {g.DpiX}x{g.DpiY} dpi. PageUnit = {g.PageUnit.ToString()}"); litehtml.Graphics = g; Helpers.Logging.TraceMessage($"PageUnit = {g.PageUnit.ToString()}"); litehtml.Document.CreateFromString(document); litehtml.Document.OnMediaChanged(); // TODO: Use return of Render() to get "best width" int bestWidth = litehtml.Document.Render((int)width); //litehtml.SetViewport(new LiteHtmlPoint(0, 0), new LiteHtmlSize(width, height)); //litehtml.Draw(); litehtml.Graphics = null; Helpers.Logging.TraceMessage($"Litehtml_DocumentSizeKnown {litehtml.Document.Width()}x{litehtml.Document.Height()} bestWidth = {bestWidth}"); var n = (int)(litehtml.Document.Height() / height) + 1; Helpers.Logging.TraceMessage($"HtmlFileContent.RenderAsync - {n} pages."); return(n); }
/// <summary> /// Get total count of pages. Set any local page-size related values (e.g. linesPerPage) /// </summary> /// <param name="e"></param> /// <returns></returns> public override async Task <int> RenderAsync(System.Drawing.Printing.PrinterResolution printerResolution, EventHandler <string> reflowProgress) { LogService.TraceMessage(); _ready = false; reflowProgress?.Invoke(this, "HtmlFileContent.RenderAsync"); await base.RenderAsync(printerResolution, reflowProgress).ConfigureAwait(false); var width = (int)PageSize.Width; // (printerResolution.X * PageSize.Width / 100); var height = (int)PageSize.Height; // (printerResolution.Y * PageSize.Height / 100); LogService.TraceMessage($"HtmlFileContent.RenderAsync - Page size: {width}x{height} @ {printerResolution.X}x{printerResolution.Y} dpi"); string css; try { // TODO: Make sure winprint.css is in the same dir as .config file once setup is impl using var cssStream = new StreamReader("winprint.css"); css = await cssStream.ReadToEndAsync(); cssStream.Close(); reflowProgress?.Invoke(this, "Read winprint.css"); } catch { css = IncludedWinPrintCss.CssString; } // BUGBUG: wihtout knowing the relative root path fo the html document we can't load any resources var resources = new HtmlResources(""); _litehtml = new GDIPlusContainer(css, resources.GetResourceString, resources.GetResourceBytes) { Diagnostics = ContentSettings.Diagnostics, Size = new LiteHtmlSize(width, 0), PageHeight = height }; _htmlBitmap = new Bitmap(width, height); //htmlBitmap.SetResolution(printerResolution.X, printerResolution.Y); var g = Graphics.FromImage(_htmlBitmap); g.PageUnit = GraphicsUnit.Display; g.TextRenderingHint = ContentTypeEngineBase.TextRenderingHint; //g.FillRectangle(Brushes.LightYellow, new Rectangle(0, 0, width, height)); LogService.TraceMessage($"HtmlFileContent.RenderAsync() Graphic is {_htmlBitmap.Width} x {_htmlBitmap.Height} @ {g.DpiX} x {g.DpiY} dpi. PageUnit = {g.PageUnit.ToString()}"); _litehtml.Graphics = g; _litehtml.StringFormat = ContentTypeEngineBase.StringFormat; _litehtml.Grayscale = ContentSettings.Grayscale; _litehtml.Darkness = ContentSettings.Darkness; _litehtml.PrintBackground = ContentSettings.PrintBackground; //Logging.TraceMessage("litehtml.Document.CreateFromString(document)"); reflowProgress?.Invoke(this, "litehtml.Document.CreateFromString(document)"); _litehtml.Document.CreateFromString(Document); //Logging.TraceMessage("back from litehtml.Document.CreateFromString(document)"); reflowProgress?.Invoke(this, "back from litehtml.Document.CreateFromString(document)"); _litehtml.Document.OnMediaChanged(); // TODO: Use return of Render() to get "best width" var bestWidth = _litehtml.Document.Render(width); reflowProgress?.Invoke(this, "Done with Render"); // Note, setting viewport does nothing //litehtml.SetViewport(new LiteHtmlPoint(0, 0), new LiteHtmlSize(width, height)); _litehtml.Graphics = null; //Logging.TraceMessage($"Litehtml_DocumentSizeKnown {_litehtml.Document.Width()}x{_litehtml.Document.Height()} bestWidth = {bestWidth}"); var n = _litehtml.Document.Height() / height + 1; Logging.TraceMessage($"HtmlFileContent.RenderAsync - {n} pages."); _ready = true; return(n); }