using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Drawing; using System.Drawing.Imaging; using System.Globalization; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Rendering; using FastReport.Export; using FastReport.Utils; using FastReport.Export.Html; using System.Threading.Tasks; using ImageFormat = System.Drawing.Imaging.ImageFormat; using System.Threading; namespace FastReport.Web.Blazor.Export { public partial class BlazorExport : ExportBase { #region Private fields private readonly struct HTMLData { public readonly int PageNumber; public readonly int CurrentPage; public readonly ReportPage page; public HTMLData(int pageNumber, int curPage, ReportPage page) { PageNumber = pageNumber; CurrentPage = curPage; this.page = page; } } private int pagesCount; private ImageFormat imageFormat; private bool singlePage; private bool pictures; private bool embedPictures; private string? stylePrefix; private int prevStyleListIndex; private bool pageBreaks; private List cssStyles; private string pageStyleName; private const string NBSP = " "; private int currentPage = 0; private HTMLData d; private IGraphics htmlMeasureGraphics; private float maxWidth, maxHeight; private float leftMargin, topMargin; private bool enableMargins = false; #endregion Private fields #region Public properties private RenderContext globalContext; private CancellationToken cancellationToken; /// /// Sets an onclick event handler /// public EventHandler OnClick; /// /// Gets or sets images, embedded in html (hash:base64Image) /// public Dictionary EmbeddedImages { get; set; } /// /// For internal use only. /// public string? StylePrefix { get { return stylePrefix; } set { stylePrefix = value; } } /// /// For internal use only. /// public string? WebImagePrefix { get; set; } /// /// For internal use only. /// public List PreparedPages { get; } /// /// Enable or disable the breaks between pages in print preview when single page mode is enabled /// public bool PageBreaks { get { return pageBreaks; } set { pageBreaks = value; } } /// /// Enable or disable the pictures in HTML export /// public bool Pictures { get { return pictures; } set { pictures = value; } } /// /// Enable or disable embedding pictures in HTML export /// public bool EmbedPictures { get { return embedPictures; } set { embedPictures = value; } } /// /// Enable or disable the single HTML page creation /// public bool SinglePage { get { return singlePage; } set { singlePage = value; } } /// /// Gets or sets the image format. /// public ImageFormat ImageFormat { get { return imageFormat; } set { imageFormat = value; } } /// /// Enable or disable margins for pages. /// public bool EnableMargins { get { return enableMargins; } set { enableMargins = value; } } #endregion Public properties #region Private methods private void ExportHTMLPageStart(int PageNumber, int CurrentPage) { PreparedPages[CurrentPage].PageNumber = PageNumber; } private void ExportHTMLPageFinal(in HTMLData d, float MaxWidth, float MaxHeight) { // CalcPageSize var page = PreparedPages[d.CurrentPage]; page.Width = MaxWidth; page.Height = MaxHeight; } private void Init() { htmlMeasureGraphics = Report.MeasureGraphics; cssStyles = new List(); pagesCount = 0; prevStyleListIndex = 0; //GeneratedStreams = new List(); } private void StartWeb() { PreparedPages.Clear(); for (int i = 0; i < Report.PreparedPages.Count; i++) PreparedPages.Add(new BlazorPageData()); } #endregion Private methods #region Protected methods /// protected override void Start() { base.Start(); Init(); StartWeb(); } /// protected override void ExportPageBegin(ReportPage page) { pagesCount++; // Web ProcessPageBegin(CurPage, page); } /// protected override void ExportPageEnd(ReportPage page) { // Web ProcessPageEnd(); } public void Export(Report report, RenderTreeBuilder builder) { Export(report, builder, default); } public void Export(Report report, RenderTreeBuilder builder, CancellationToken cancellationToken = default) { var context = new RenderContext(builder, OnClick); globalContext = context; this.cancellationToken = cancellationToken; Export(report, (Stream)null); } /// /// Process Page with number p and real page ReportPage /// /// /// public void ProcessPageBegin(int p, ReportPage page) { d = new HTMLData(pagesCount, p, page); ExportHTMLPageLayeredBegin(d); } /// /// Process Page with number p and real page ReportPage /// /// /// public void ProcessPageEnd() { ExportHTMLPageLayeredEnd(d); } #endregion Protected methods /// /// Initializes a new instance of the class. /// public BlazorExport() { Zoom = 1.0f; //HasMultipleFiles = true; pictures = true; singlePage = false; imageFormat = ImageFormat.Png; prevStyleListIndex = 0; pageBreaks = true; EmbeddedImages = new Dictionary(); // Init_WebMode ShowProgress = false; PreparedPages = new List(); OpenAfterExport = false; } } }