22// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33// Website: https://www.blazor.zone or https://argozhang.github.io/
44
5+ using Microsoft . Extensions . Logging ;
56using PuppeteerSharp ;
7+ using System . Net ;
68
79namespace BootstrapBlazor . Components ;
810
911/// <summary>
1012/// 默认 Html to Pdf 实现
1113/// </summary>
12- class DefaultPdfService : IHtml2Pdf
14+ class DefaultPdfService ( ILogger < DefaultPdfService > logger ) : IHtml2Pdf
1315{
16+ /// <summary>
17+ /// 获得/设置 WebProxy 对象用于网络请求代理
18+ /// <para>Get or set the WebProxy object for network request proxy</para>
19+ /// </summary>
20+ public IWebProxy ? WebProxy { get ; set ; }
21+
1422 /// <summary>
1523 /// <inheritdoc/>
1624 /// </summary>
1725 public async Task < byte [ ] > PdfDataAsync ( string url )
1826 {
19- await using var browser = await LaunchBrowserAsync ( ) ;
20- await using var page = await browser . NewPageAsync ( ) ;
21- await page . GoToAsync ( url ) ;
27+ try
28+ {
29+ await using var browser = await LaunchBrowserAsync ( ) ;
30+ await using var page = await browser . NewPageAsync ( ) ;
2231
23- return await page . PdfDataAsync ( ) ;
32+ await page . GoToAsync ( url ) ;
33+ return await page . PdfDataAsync ( ) ;
34+ }
35+ catch ( Exception ex )
36+ {
37+ Log ( ex , "Error generating PDF from URL: {Url}" , url ) ;
38+ throw ;
39+ }
2440 }
2541
2642 /// <summary>
2743 /// <inheritdoc/>
2844 /// </summary>
2945 public async Task < Stream > PdfStreamAsync ( string url )
3046 {
31- await using var browser = await LaunchBrowserAsync ( ) ;
32- await using var page = await browser . NewPageAsync ( ) ;
33- await page . GoToAsync ( url ) ;
47+ try
48+ {
49+ await using var browser = await LaunchBrowserAsync ( ) ;
50+ await using var page = await browser . NewPageAsync ( ) ;
51+ await page . GoToAsync ( url ) ;
3452
35- return await page . PdfStreamAsync ( ) ;
53+ return await page . PdfStreamAsync ( ) ;
54+ }
55+ catch ( Exception ex )
56+ {
57+ Log ( ex , "Error generating PDF from URL: {Url}" , url ) ;
58+ throw ;
59+ }
3660 }
3761
3862 /// <summary>
@@ -43,14 +67,22 @@ public async Task<Stream> PdfStreamAsync(string url)
4367 /// <param name="scripts"></param>
4468 public async Task < byte [ ] > PdfDataFromHtmlAsync ( string html , IEnumerable < string > ? links = null , IEnumerable < string > ? scripts = null )
4569 {
46- await using var browser = await LaunchBrowserAsync ( ) ;
47- await using var page = await browser . NewPageAsync ( ) ;
48- await page . SetContentAsync ( html ) ;
70+ try
71+ {
72+ await using var browser = await LaunchBrowserAsync ( ) ;
73+ await using var page = await browser . NewPageAsync ( ) ;
74+ await page . SetContentAsync ( html ) ;
4975
50- await AddStyleTagAsync ( page , links ) ;
51- await AddScriptTagAsync ( page , scripts ) ;
76+ await AddStyleTagAsync ( page , links ) ;
77+ await AddScriptTagAsync ( page , scripts ) ;
5278
53- return await page . PdfDataAsync ( ) ;
79+ return await page . PdfDataAsync ( ) ;
80+ }
81+ catch ( Exception ex )
82+ {
83+ Log ( ex , "Error generating PDF from HTML content" ) ;
84+ throw ;
85+ }
5486 }
5587
5688 /// <summary>
@@ -61,14 +93,22 @@ public async Task<byte[]> PdfDataFromHtmlAsync(string html, IEnumerable<string>?
6193 /// <param name="scripts"></param>
6294 public async Task < Stream > PdfStreamFromHtmlAsync ( string html , IEnumerable < string > ? links = null , IEnumerable < string > ? scripts = null )
6395 {
64- await using var browser = await LaunchBrowserAsync ( ) ;
65- await using var page = await browser . NewPageAsync ( ) ;
66- await page . SetContentAsync ( html ) ;
96+ try
97+ {
98+ await using var browser = await LaunchBrowserAsync ( ) ;
99+ await using var page = await browser . NewPageAsync ( ) ;
100+ await page . SetContentAsync ( html ) ;
67101
68- await AddStyleTagAsync ( page , links ) ;
69- await AddScriptTagAsync ( page , scripts ) ;
102+ await AddStyleTagAsync ( page , links ) ;
103+ await AddScriptTagAsync ( page , scripts ) ;
70104
71- return await page . PdfStreamAsync ( ) ;
105+ return await page . PdfStreamAsync ( ) ;
106+ }
107+ catch ( Exception ex )
108+ {
109+ Log ( ex , "Error generating PDF from HTML content" ) ;
110+ throw ;
111+ }
72112 }
73113
74114 private static async Task AddStyleTagAsync ( IPage page , IEnumerable < string > ? links = null )
@@ -103,11 +143,31 @@ private static async Task AddScriptTagAsync(IPage page, IEnumerable<string>? scr
103143
104144 private static LaunchOptions CreateOptions ( ) => new ( ) { Headless = true , Args = [ "--no-sandbox" , "--disable-setuid-sandbox" , "--disable-web-security" ] } ;
105145
106- private static async Task < IBrowser > LaunchBrowserAsync ( )
146+ private async Task < IBrowser > LaunchBrowserAsync ( )
107147 {
108- var browserFetcher = new BrowserFetcher ( ) ;
109- await browserFetcher . DownloadAsync ( ) ;
148+ var browserFetcher = new BrowserFetcher
149+ {
150+ WebProxy = WebProxy
151+ } ;
152+
153+ Log ( null , "Ready to start downloading browser" ) ;
154+ var browser = await browserFetcher . DownloadAsync ( ) ;
155+ Log ( null , $ "Browser downloaded successfully. installed browser { browser . BuildId } ") ;
110156
111- return await Puppeteer . LaunchAsync ( CreateOptions ( ) ) ;
157+ var options = CreateOptions ( ) ;
158+ Log ( null , "Start your browser" , "--no-sandbox" , "--disable-setuid-sandbox" , "--disable-web-security" ) ;
159+ return await Puppeteer . LaunchAsync ( options ) ;
160+ }
161+
162+ private void Log ( Exception ? exception , string ? message , params object ? [ ] args )
163+ {
164+ if ( args . Length != 0 )
165+ {
166+ logger . LogInformation ( exception , "{Message} | Args: {Args}" , message , args ) ;
167+ }
168+ else
169+ {
170+ logger . LogInformation ( exception , "{Message}" , message ) ;
171+ }
112172 }
113173}
0 commit comments