dotnet new console -n Html2Imagecd Html2Imagedotnet add package PuppeteerSharp --version 20.*
--Input
: File HTML, hoặc URL hoặc đọc từ stdin--Output
: File ảnh đầu ra (mặc định jpg)--width
, --height
: Kích thước viewport (tùy chọn)--dpr
: Device pixel ratio, mặc định 2 (Retina)--quality
: Chất lượng ảnh JPEG (1-100)--fullpage
: Chụp toàn trang hay chỉ viewport--delay
: Trì hoãn trước khi chụp để trang tải xong--from-stdin
: Đọc nội dung HTML từ stdin thay vì filevar input = Get(cfg, "Input", "triangle.html");var output = Get(cfg, "Output", "output.jpg");var width = GetInt(cfg, "width");var height = GetInt(cfg, "height");var dpr = double.Parse(Get(cfg, "dpr", "2"), CultureInfo.InvariantCulture);// ...await HTMLConverter.ConvertHtmlToJpegAsync(input, output, width, height, dpr, quality, full, delay, stdin);
fromStdin
, đọc HTML từ đầu vào tiêu chuẩn.Input
là URL, điều hướng trang web.public static async Task ConvertHtmlToJpegAsync( string input, string output, int? width, int? height, double deviceScaleFactor, int quality, bool fullPage, int delayMs, bool fromStdin){ // Tải và khởi chạy Chromium var fetcher = new BrowserFetcher(); await fetcher.DownloadAsync(); var exe = fetcher.GetInstalledBrowsers().Last().GetExecutablePath();
var browser = await Puppeteer.LaunchAsync(new LaunchOptions { ExecutablePath = exe, Headless = true });
var page = await browser.NewPageAsync();
int vw = width ?? 1200; int vh = height ?? 800; await page.SetViewportAsync(new ViewPortOptions { Width = vw, Height = vh, DeviceScaleFactor = deviceScaleFactor });
// Nạp nội dung if (fromStdin) { var html = await Console.In.ReadToEndAsync(); await page.SetContentAsync(html); } else if (input.StartsWith("http")) { await page.GoToAsync(input, WaitUntilNavigation.Networkidle0); } else { var uri = new Uri(Path.GetFullPath(input)).AbsoluteUri; await page.GoToAsync(uri, WaitUntilNavigation.Networkidle0); }
if (delayMs > 0) await Task.Delay(delayMs);
// Auto-size nếu chưa xác định kích thước if (!width.HasValue || !height.HasValue) { var size = await page.EvaluateFunctionAsync<dynamic>("() => ({ w: document.documentElement.scrollWidth, h: document.documentElement.scrollHeight })"); vw = width ?? Math.Min((int)size.w, 16_384); vh = height ?? Math.Min((int)size.h, 16_384); await page.SetViewportAsync(new ViewPortOptions { Width = vw, Height = vh, DeviceScaleFactor = deviceScaleFactor }); }
// Chụp ảnh await page.ScreenshotAsync(output, new ScreenshotOptions { Type = ScreenshotType.Jpeg, Quality = quality, FullPage = fullPage });
await browser.CloseAsync();}
dotnet run -- --Input triangle.html --Output triangle.jpg --fullpage true
dotnet run -- --Input triangle.html --Output triangle-mobile.jpg --width 375 --dpr 3 --fullpage false
dotnet run -- --Input https://example.com --Output site.jpg --width 1440 --dpr 2
type Input\triangle.html | dotnet run -- --from-stdin true --Output tri-stdin.jpg
Vấn Đề | Giải Pháp |
---|---|
Ảnh chất lượng/khối lượng | Chọn quality jpeg từ 80-90. Chọn PNG nếu cần trong suốt. |
Lần chạy đầu lâu | Chromium tải xuống (~1 phút). Các lần sau nhanh. |
Timeout khi tải trang dài | Tăng timeout hoặc tách nội dung web ra nhỏ hơn. |
Trang dài vượt giới hạn | Chia nhỏ trang hoặc chuyển sang xuất PDF đa trang. |