2
2
using System ;
3
3
using System . Diagnostics . CodeAnalysis ;
4
4
using System . IO ;
5
- using System . Net ;
6
5
using System . Runtime . InteropServices ;
7
6
using System . Threading . Tasks ;
8
7
@@ -46,8 +45,10 @@ public Renderer(LaunchOptions? launchOptions = null)
46
45
}
47
46
}
48
47
49
- private IBrowser Browser { get ; set ; } = default ! ;
50
- private int LastProgressValue { get ; set ; }
48
+ /// <summary>
49
+ /// Provides methods to interact with a browser.
50
+ /// </summary>
51
+ public IBrowser ? Browser { get ; set ; }
51
52
52
53
/// <summary>
53
54
/// Browser fetcher - used to get chromium bins
@@ -62,8 +63,8 @@ public Renderer(LaunchOptions? launchOptions = null)
62
63
/// <returns>Initialized renderer</returns>
63
64
public static Task < Renderer > CreateAsync ( )
64
65
{
65
- var html2Pdf = new Renderer ( ) ;
66
- return html2Pdf . InitializeAsync ( new BrowserFetcher ( ) ) ;
66
+ var renderer = new Renderer ( ) ;
67
+ return renderer . InitializeAsync ( new BrowserFetcher ( ) ) ;
67
68
}
68
69
69
70
/// <summary>
@@ -91,21 +92,10 @@ public static Task<Renderer> CreateAsync(BrowserFetcher browserFetcher, LaunchOp
91
92
92
93
private async Task < Renderer > InitializeAsync ( BrowserFetcher browserFetcher )
93
94
{
94
- // for macsome reason the download progress is not called on macos
95
- if ( RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) )
96
- {
97
- using var browserFetcher1 = new BrowserFetcher ( ) ;
98
- await browserFetcher1 . DownloadAsync ( ) ;
99
- Browser = await Puppeteer . LaunchAsync ( new LaunchOptions { Headless = true } ) ;
100
- }
101
- else
102
- {
103
- BrowserFetcher = browserFetcher ;
104
- BrowserFetcher . DownloadProgressChanged += DownloadProgressChanged ;
105
- var revisionInfo = await BrowserFetcher . DownloadAsync ( PuppeteerSharp . BrowserData . Chrome . DefaultBuildId ) . ConfigureAwait ( false ) ;
106
- LaunchOptions . ExecutablePath = revisionInfo . GetExecutablePath ( ) ;
107
- Browser = await Puppeteer . LaunchAsync ( LaunchOptions ) . ConfigureAwait ( false ) ;
108
- }
95
+ BrowserFetcher = browserFetcher ;
96
+ var revisionInfo = await BrowserFetcher . DownloadAsync ( PuppeteerSharp . BrowserData . Chrome . DefaultBuildId ) . ConfigureAwait ( false ) ;
97
+ LaunchOptions . ExecutablePath = revisionInfo . GetExecutablePath ( ) ;
98
+ Browser = await Puppeteer . LaunchAsync ( LaunchOptions ) . ConfigureAwait ( false ) ;
109
99
110
100
return this ;
111
101
}
@@ -128,7 +118,7 @@ private static bool IsRunningOnAzureLinux()
128
118
return false ;
129
119
}
130
120
131
- return RuntimeInformation . IsOSPlatform ( OSPlatform . Linux ) && websiteSku . IndexOf ( "Linux" , StringComparison . OrdinalIgnoreCase ) >= 0 ;
121
+ return RuntimeInformation . IsOSPlatform ( OSPlatform . Linux ) && websiteSku . Contains ( "Linux" , StringComparison . OrdinalIgnoreCase ) ;
132
122
}
133
123
134
124
private static bool IsRunningOnWslOrAzure ( )
@@ -170,13 +160,23 @@ public async Task ConvertHtmlToPdf(string sourceHtmlFilePath, string destination
170
160
}
171
161
172
162
var absolutePath = Path . GetFullPath ( sourceHtmlFilePath ) ;
173
- await using var page = await Browser . NewPageAsync ( ) . ConfigureAwait ( false ) ;
163
+ await using var page = await GetPage ( ) . ConfigureAwait ( false ) ;
174
164
await page . GoToAsync ( $ "file://{ absolutePath } ") . ConfigureAwait ( false ) ;
175
165
// Wait for fonts to be loaded. Omitting this might result in no text rendered in PDF.
176
166
await page . EvaluateExpressionHandleAsync ( "document.fonts.ready" ) . ConfigureAwait ( false ) ;
177
167
await page . PdfAsync ( destinationPdfFilePath , pdfOptions ) . ConfigureAwait ( false ) ;
178
168
}
179
169
170
+ private async Task < IPage > GetPage ( )
171
+ {
172
+ if ( Browser == null )
173
+ {
174
+ throw new RendererException ( "Call CreateAsync first" ) ;
175
+ }
176
+
177
+ return await Browser . NewPageAsync ( ) . ConfigureAwait ( false ) ;
178
+ }
179
+
180
180
/// <summary>
181
181
/// Converts a HTML file to a PNG
182
182
/// </summary>
@@ -201,7 +201,7 @@ public async Task ConvertHtmlToPng(string sourceHtmlFilePath, string destination
201
201
}
202
202
203
203
var absolutePath = Path . GetFullPath ( sourceHtmlFilePath ) ;
204
- await using var page = await Browser . NewPageAsync ( ) . ConfigureAwait ( false ) ;
204
+ await using var page = await GetPage ( ) . ConfigureAwait ( false ) ;
205
205
await page . GoToAsync ( $ "file://{ absolutePath } ") . ConfigureAwait ( false ) ;
206
206
// Wait for fonts to be loaded. Omitting this might result in no text the screenshot.
207
207
await page . EvaluateExpressionHandleAsync ( "document.fonts.ready" ) . ConfigureAwait ( false ) ;
@@ -224,21 +224,13 @@ public Task<byte[]> ConvertHtmlStringToPngData(string sourceHtmlData)
224
224
/// <param name="screenshotOptions"></param>
225
225
public async Task < byte [ ] > ConvertHtmlStringToPngData ( string sourceHtmlData , ScreenshotOptions screenshotOptions )
226
226
{
227
- await using var page = await Browser . NewPageAsync ( ) . ConfigureAwait ( false ) ;
227
+ await using var page = await GetPage ( ) . ConfigureAwait ( false ) ;
228
228
await page . SetContentAsync ( sourceHtmlData ) . ConfigureAwait ( false ) ;
229
229
// Wait for fonts to be loaded. Omitting this might result in no text the screenshot.
230
230
await page . EvaluateExpressionHandleAsync ( "document.fonts.ready" ) . ConfigureAwait ( false ) ;
231
231
return await page . ScreenshotDataAsync ( screenshotOptions ) . ConfigureAwait ( false ) ;
232
232
}
233
233
234
- private void DownloadProgressChanged ( object sender , DownloadProgressChangedEventArgs e )
235
- {
236
- if ( LastProgressValue != e . ProgressPercentage )
237
- {
238
- LastProgressValue = e . ProgressPercentage ;
239
- }
240
- }
241
-
242
234
/// <summary>
243
235
/// Dispose
244
236
/// </summary>
0 commit comments