| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- using System.Diagnostics;
- using System.Reflection;
- using Microsoft.AspNetCore.Builder;
- using QuestPDF.Fluent;
- using QuestPDF.Helpers;
- using QuestPDF.Infrastructure;
- namespace QuestPDF.Previewer;
- public static class DocumentPreviewerExtensions
- {
- public static void ShowInPreviewer(this IDocument document)
- {
- ArgumentNullException.ThrowIfNull(document);
- var builder = WebApplication.CreateBuilder();
- var app = builder.Build();
-
- var pdfDocumentCache = GeneratePdf(document);
- var refreshFlag = false;
- static byte[] GenerateDocumentAboutException(Exception exception)
- {
- return Document.Create(document =>
- {
- document.Page(page =>
- {
- page.Size(PageSizes.A4);
- page.Margin(1, Unit.Inch);
- page.PageColor(Colors.Red.Lighten4);
- page.DefaultTextStyle(x => x.FontSize(16));
- page.Header()
- .BorderBottom(2)
- .BorderColor(Colors.Red.Medium)
- .PaddingBottom(5)
- .Text("Ooops! Something went wrong...").FontSize(28).FontColor(Colors.Red.Medium).Bold();
- page.Content().PaddingVertical(20).Column(column =>
- {
- var currentException = exception;
- while (currentException != null)
- {
- column.Item().Text(exception.GetType().Name).FontSize(20).SemiBold();
- column.Item().Text(exception.Message).FontSize(14);
- column.Item().PaddingTop(10).Text(exception.StackTrace).FontSize(10).Light();
- currentException = currentException.InnerException;
- if (currentException != null)
- column.Item().PaddingVertical(15).LineHorizontal(2).LineColor(Colors.Red.Medium);
- }
- });
- });
- }).GeneratePdf();
- }
- static byte[] GeneratePdf(IDocument document)
- {
- try
- {
- return document.GeneratePdf();
- }
- catch(Exception exception)
- {
- return GenerateDocumentAboutException(exception);
- }
- }
- HotReloadManager.OnApplicationChanged += () =>
- {
- pdfDocumentCache = GeneratePdf(document);
- refreshFlag = true;
- };
-
- app.MapGet("/", () =>
- {
- var assembly = Assembly.GetExecutingAssembly();
- var resourceName = "QuestPDF.Previewer.index.html";
-
- using var stream = assembly.GetManifestResourceStream(resourceName);
- using var reader = new StreamReader(stream);
- var result = reader.ReadToEnd();
- return Results.Content(result, "text/html");
- });
-
- app.MapGet("/render", () =>
- {
- refreshFlag = false;
- return Results.File(pdfDocumentCache, "application/pdf");
- });
-
- app.MapGet("/listen", async () =>
- {
- foreach (var i in Enumerable.Range(0, 1000))
- {
- await Task.Delay(TimeSpan.FromMilliseconds(100));
- if (!refreshFlag)
- continue;
- return Results.Text("true");
- }
- return Results.Text("false");
- });
- app.Lifetime.ApplicationStarted.Register(() =>
- {
- var openBrowserProcess = new Process()
- {
- StartInfo = new()
- {
- UseShellExecute = true,
- FileName = app.Urls.First()
- }
- };
- openBrowserProcess.Start();
- });
- app.Run();
- }
- }
|