123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- 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<StringBuilder> 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;
- /// <summary>
- /// Sets an onclick event handler
- /// </summary>
- public EventHandler<OnClickEventArgs> OnClick;
- /// <summary>
- /// Gets or sets images, embedded in html (hash:base64Image)
- /// </summary>
- public Dictionary<string, string> EmbeddedImages
- {
- get;
- set;
- }
- /// <summary>
- /// For internal use only.
- /// </summary>
- public string? StylePrefix
- {
- get { return stylePrefix; }
- set { stylePrefix = value; }
- }
- /// <summary>
- /// For internal use only.
- /// </summary>
- public string? WebImagePrefix
- {
- get;
- set;
- }
- /// <summary>
- /// For internal use only.
- /// </summary>
- public List<BlazorPageData> PreparedPages { get; }
- /// <summary>
- /// Enable or disable the breaks between pages in print preview when single page mode is enabled
- /// </summary>
- public bool PageBreaks
- {
- get { return pageBreaks; }
- set { pageBreaks = value; }
- }
- /// <summary>
- /// Enable or disable the pictures in HTML export
- /// </summary>
- public bool Pictures
- {
- get { return pictures; }
- set { pictures = value; }
- }
- /// <summary>
- /// Enable or disable embedding pictures in HTML export
- /// </summary>
- public bool EmbedPictures
- {
- get { return embedPictures; }
- set { embedPictures = value; }
- }
- /// <summary>
- /// Enable or disable the single HTML page creation
- /// </summary>
- public bool SinglePage
- {
- get { return singlePage; }
- set { singlePage = value; }
- }
- /// <summary>
- /// Gets or sets the image format.
- /// </summary>
- public ImageFormat ImageFormat
- {
- get { return imageFormat; }
- set { imageFormat = value; }
- }
- /// <summary>
- /// Enable or disable margins for pages.
- /// </summary>
- 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<StringBuilder>();
- pagesCount = 0;
- prevStyleListIndex = 0;
- //GeneratedStreams = new List<Stream>();
- }
- private void StartWeb()
- {
- PreparedPages.Clear();
- for (int i = 0; i < Report.PreparedPages.Count; i++)
- PreparedPages.Add(new BlazorPageData());
- }
- #endregion Private methods
- #region Protected methods
- /// <inheritdoc/>
- protected override void Start()
- {
- base.Start();
- Init();
- StartWeb();
- }
- /// <inheritdoc/>
- protected override void ExportPageBegin(ReportPage page)
- {
- pagesCount++;
- // Web
- ProcessPageBegin(CurPage, page);
- }
- /// <inheritdoc/>
- 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);
- }
- /// <summary>
- /// Process Page with number p and real page ReportPage
- /// </summary>
- /// <param name="p"></param>
- /// <param name="page"></param>
- public void ProcessPageBegin(int p, ReportPage page)
- {
- d = new HTMLData(pagesCount, p, page);
- ExportHTMLPageLayeredBegin(d);
- }
- /// <summary>
- /// Process Page with number p and real page ReportPage
- /// </summary>
- /// <param name="p"></param>
- /// <param name="ReportPage"></param>
- public void ProcessPageEnd()
- {
- ExportHTMLPageLayeredEnd(d);
- }
- #endregion Protected methods
- /// <summary>
- /// Initializes a new instance of the <see cref="BlazorExport"/> class.
- /// </summary>
- public BlazorExport()
- {
- Zoom = 1.0f;
- //HasMultipleFiles = true;
- pictures = true;
- singlePage = false;
- imageFormat = ImageFormat.Png;
- prevStyleListIndex = 0;
- pageBreaks = true;
- EmbeddedImages = new Dictionary<string, string>();
- // Init_WebMode
- ShowProgress = false;
- PreparedPages = new List<BlazorPageData>();
- OpenAfterExport = false;
- }
- }
- }
|