一、下载最新版本PowerShell

https://github.com/PowerShell/PowerShell/releases/tag/v7.4.11

二、新建netcore项目,安装包

<PackageReference Include="Microsoft.Playwright" Version="1.27.1" />

在项目目录下运行:

pwsh bin/Debug/net8.0/playwright.ps1 install

然后添加上代码:

using Autofac.Features.Metadata;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Playwright;
using System.Drawing.Printing;
using System.IO;
using System.Threading.Tasks;

namespace SaaS.OfficialWebSite.Web.Controllers
{
    public class PdfController : Controller
    {
        private readonly ILogger<PdfController> _logger;


        public PdfController(ILogger<PdfController> logger)
        {
            _logger = logger;

        }

        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> GeneratePdf([FromBody] PdfRequest request)
        {
            if (string.IsNullOrWhiteSpace(request.Url) || !Uri.TryCreate(request.Url, UriKind.Absolute, out _))
            {
                return BadRequest(new { message = "请输入有效的网址" });
            }

            try
            {
                // 生成PDF
                var pdfBytes = await GeneratePdfInternal(request.Url);
                return File(pdfBytes, "application/pdf", $"webpage_{DateTime.Now:yyyyMMddHHmmss}.pdf");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "生成PDF时出错");
                return StatusCode(500, new { message = $"生成PDF时出错: {ex.Message}" });
            }
        }

        private async Task<byte[]> GeneratePdfInternal(string url)
        {
            // 创建 Playwright 实例
            var playwright = await Playwright.CreateAsync().ConfigureAwait(false); 
            await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
            {
                Headless = true
            });

            var page = await browser.NewPageAsync();
            try
            {
                // 导航到目标URL
                await page.GotoAsync(url, new PageGotoOptions
                {
                    WaitUntil = WaitUntilState.NetworkIdle,
                    Timeout = 30000
                });

                // 生成PDF
                var datas = await page.PdfAsync();
                return datas;
            }
            finally
            {
                await page.CloseAsync();
            }
        }
    }

    public class PdfRequest
    {
        public string Url { get; set; }
    }
}

运行效果:在线网页转PDF工具

更多推荐