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);
+ }
}
}