diff --git a/src/components/BootstrapBlazor.Html2Pdf/BootstrapBlazor.Html2Pdf.csproj b/src/components/BootstrapBlazor.Html2Pdf/BootstrapBlazor.Html2Pdf.csproj index bd24f1a0..4d9cb2a5 100644 --- a/src/components/BootstrapBlazor.Html2Pdf/BootstrapBlazor.Html2Pdf.csproj +++ b/src/components/BootstrapBlazor.Html2Pdf/BootstrapBlazor.Html2Pdf.csproj @@ -1,7 +1,7 @@ - 9.0.2 + 9.0.3 diff --git a/src/components/BootstrapBlazor.Html2Pdf/Services/DefaultPdfService.cs b/src/components/BootstrapBlazor.Html2Pdf/Services/DefaultPdfService.cs index 9bc34db9..935e3bbc 100644 --- a/src/components/BootstrapBlazor.Html2Pdf/Services/DefaultPdfService.cs +++ b/src/components/BootstrapBlazor.Html2Pdf/Services/DefaultPdfService.cs @@ -2,25 +2,41 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ +using Microsoft.Extensions.Logging; using PuppeteerSharp; +using System.Net; namespace BootstrapBlazor.Components; /// /// 默认 Html to Pdf 实现 /// -class DefaultPdfService : IHtml2Pdf +class DefaultPdfService(ILogger logger) : IHtml2Pdf { + /// + /// 获得/设置 WebProxy 对象用于网络请求代理 + /// Get or set the WebProxy object for network request proxy + /// + public IWebProxy? WebProxy { get; set; } + /// /// /// public async Task PdfDataAsync(string url) { - await using var browser = await LaunchBrowserAsync(); - await using var page = await browser.NewPageAsync(); - await page.GoToAsync(url); + try + { + await using var browser = await LaunchBrowserAsync(); + await using var page = await browser.NewPageAsync(); - return await page.PdfDataAsync(); + await page.GoToAsync(url); + return await page.PdfDataAsync(); + } + catch (Exception ex) + { + Log(ex, "Error generating PDF from URL: {Url}", url); + throw; + } } /// @@ -28,11 +44,19 @@ public async Task PdfDataAsync(string url) /// public async Task PdfStreamAsync(string url) { - await using var browser = await LaunchBrowserAsync(); - await using var page = await browser.NewPageAsync(); - await page.GoToAsync(url); + try + { + await using var browser = await LaunchBrowserAsync(); + await using var page = await browser.NewPageAsync(); + await page.GoToAsync(url); - return await page.PdfStreamAsync(); + return await page.PdfStreamAsync(); + } + catch (Exception ex) + { + Log(ex, "Error generating PDF from URL: {Url}", url); + throw; + } } /// @@ -43,14 +67,22 @@ public async Task PdfStreamAsync(string url) /// public async Task PdfDataFromHtmlAsync(string html, IEnumerable? links = null, IEnumerable? scripts = null) { - await using var browser = await LaunchBrowserAsync(); - await using var page = await browser.NewPageAsync(); - await page.SetContentAsync(html); + try + { + await using var browser = await LaunchBrowserAsync(); + await using var page = await browser.NewPageAsync(); + await page.SetContentAsync(html); - await AddStyleTagAsync(page, links); - await AddScriptTagAsync(page, scripts); + await AddStyleTagAsync(page, links); + await AddScriptTagAsync(page, scripts); - return await page.PdfDataAsync(); + return await page.PdfDataAsync(); + } + catch (Exception ex) + { + Log(ex, "Error generating PDF from HTML content"); + throw; + } } /// @@ -61,14 +93,22 @@ public async Task PdfDataFromHtmlAsync(string html, IEnumerable? /// public async Task PdfStreamFromHtmlAsync(string html, IEnumerable? links = null, IEnumerable? scripts = null) { - await using var browser = await LaunchBrowserAsync(); - await using var page = await browser.NewPageAsync(); - await page.SetContentAsync(html); + try + { + await using var browser = await LaunchBrowserAsync(); + await using var page = await browser.NewPageAsync(); + await page.SetContentAsync(html); - await AddStyleTagAsync(page, links); - await AddScriptTagAsync(page, scripts); + await AddStyleTagAsync(page, links); + await AddScriptTagAsync(page, scripts); - return await page.PdfStreamAsync(); + return await page.PdfStreamAsync(); + } + catch (Exception ex) + { + Log(ex, "Error generating PDF from HTML content"); + throw; + } } private static async Task AddStyleTagAsync(IPage page, IEnumerable? links = null) @@ -103,11 +143,31 @@ private static async Task AddScriptTagAsync(IPage page, IEnumerable? scr private static LaunchOptions CreateOptions() => new() { Headless = true, Args = ["--no-sandbox", "--disable-setuid-sandbox", "--disable-web-security"] }; - private static async Task LaunchBrowserAsync() + private async Task LaunchBrowserAsync() { - var browserFetcher = new BrowserFetcher(); - await browserFetcher.DownloadAsync(); + var browserFetcher = new BrowserFetcher + { + WebProxy = WebProxy + }; + + Log(null, "Ready to start downloading browser"); + var browser = await browserFetcher.DownloadAsync(); + Log(null, $"Browser downloaded successfully. installed browser {browser.BuildId}"); - return await Puppeteer.LaunchAsync(CreateOptions()); + var options = CreateOptions(); + Log(null, "Start your browser", "--no-sandbox", "--disable-setuid-sandbox", "--disable-web-security"); + return await Puppeteer.LaunchAsync(options); + } + + private void Log(Exception? exception, string? message, params object?[] args) + { + if (args.Length != 0) + { + logger.LogInformation(exception, "{Message} | Args: {Args}", message, args); + } + else + { + logger.LogInformation(exception, "{Message}", message); + } } }