ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C# PuppeteerSharp html转pdf

2026/8/16 19:53:41 拓冰建站 浏览量
C# PuppeteerSharp html转pdf
using PuppeteerSharp.Media;
using PuppeteerSharp;namespace Html2pdf
{class Program{static async Task Main(string[] args){try{Console.WriteLine("HTML转PDF演示程序");Console.WriteLine("=================");//@page {//size: A5 landscape; /* A5横向 *///margin: 5mm;//}// 1. 准备HTML内容(模拟您的打印模板)string htmlContent1 = @"
<!DOCTYPE html>
<html>
<head><meta charset='UTF-8'><title>中药饮片库存明细表</title><style>@page {size: 241mm 105mm landscape; /* Com10横向 */margin: 3mm;}body { font-family: 'Microsoft YaHei', SimSun, sans-serif; margin: 20px; font-size: 14px;}.header { text-align: center; margin-bottom: 30px;}.title {font-size: 18px;font-weight: bold;margin-bottom: 10px;}table {width: 100%;border-collapse: collapse;margin-top: 20px;}th, td {border: 1px solid #000;padding: 8px;text-align: center;}th {background-color: #f2f2f2;font-weight: bold;}.footer {margin-top: 30px;text-align: center;font-size: 12px;}.signature-area {margin-top: 40px;display: flex;justify-content: space-between;}.signature {width: 18%;text-align: center;}</style>
</head>
<body><div class='header'><div class='title'>在库中药饮片明细</div><div>单据编号: ZY-20230001</div><div>打印日期: 2023-11-16 14:30:25</div></div><div><div>仓库信息: 中药仓库-001</div><div>温控要求: 常温10-30摄氏度  相对湿度:35%-75%</div><div>仓库地址: 四川省成都市某某某某某公司</div></div><table><thead><tr><th>序号</th><th>品名</th><th>规格</th><th>生产厂家</th><th>批号</th><th>数量</th><th>单价</th><th>金额</th></tr></thead><tbody><tr><td>1</td><td>当归片(酒炙)</td><td>10g/袋</td><td>安徽某某某某某某某公司</td><td>DG-202309</td><td>120袋</td><td>¥15.80</td><td>¥1896.00</td></tr><tr><td>2</td><td>黄芪</td><td>500g/包</td><td>甘肃某某某某某某某基地</td><td>HQ-202308</td><td>30包</td><td>¥86.50</td><td>¥2595.00</td></tr><tr><td>3</td><td>金银花</td><td>250g/罐</td><td>山东某某某某某合作社</td><td>JYH-202307</td><td>45罐</td><td>¥58.20</td><td>¥2619.00</td></tr></tbody></table><div style='margin-top: 20px;'><div>合计金额(大写): 贰万捌仟叁佰捌拾壹元陆角整</div><div>合计金额(小写): ¥28381.60</div></div><div class='signature-area'><div class='signature'>开票人: 刘开票</div><div class='signature'>备货人: 李备货</div><div class='signature'>复核人: 王复核</div><div class='signature'>发货人: 张发货</div><div class='signature'>收货人: __________</div></div><div class='footer'><div>客服电话: 888-888-8888</div><div>© 2023 中药管理系统</div></div>
</body>
</html>";// 1. 定义文件路径string filePath = @"D:\test3.html";// 2. 检查文件是否存在if (!File.Exists(filePath)){Console.WriteLine("错误: 文件不存在!");return;}// 3. 读取文件内容string htmlContent = File.ReadAllText(filePath);// 4. 输出内容长度验证Console.WriteLine($"成功读取文件,内容长度: {htmlContent.Length}字符");// 5. 这里可以继续处理htmlContent,比如传递给PuppeteerSharp生成PDF// GeneratePdf(htmlContent);// 2. 获取输出PDF路径//Console.Write("请输入输出PDF路径(默认: output.pdf): ");string pdfOutputPath = "D:\\output1.pdf";if (string.IsNullOrWhiteSpace(pdfOutputPath)){pdfOutputPath = "output.pdf";}Console.WriteLine("正在转换HTML为PDF...");// 3. 初始化浏览器实例var browser = await InitializeBrowser();// 4. 生成PDFvar pdfBytes = await GeneratePdf(browser, htmlContent);// 5. 保存PDF文件await File.WriteAllBytesAsync(pdfOutputPath, pdfBytes);Console.WriteLine($"转换完成! PDF已保存到: {Path.GetFullPath(pdfOutputPath)}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}Console.WriteLine("按任意键退出...");Console.ReadKey();}static async Task<IBrowser> InitializeBrowser(){Console.WriteLine("您可以手动下载Chromium并指定路径");//Console.Write("请输入本地Chrome/Chromium路径: ");var path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";return await Puppeteer.LaunchAsync(new LaunchOptions{ExecutablePath = path,Headless = true});}static async Task<byte[]> GeneratePdf(IBrowser browser, string htmlContent){using var page = await browser.NewPageAsync();// 设置HTML内容await page.SetContentAsync(htmlContent, new NavigationOptions{WaitUntil = new[] { WaitUntilNavigation.Networkidle0 },Timeout = 30000});// 生成PDF选项var pdfOptions = new PdfOptions{Format = PaperFormat.A4,PrintBackground = true,MarginOptions = new MarginOptions{Top = "20mm",Right = "20mm",Bottom = "20mm",Left = "20mm"},Scale = 0.7m};//var pdfOptions = new PdfOptions//{//    Width = "148mm",  // A5宽度//    Height = "210mm", // A5高度//    Landscape = true, // 设置为横向//    PrintBackground = true,//    MarginOptions = new MarginOptions//    {//        Top = "10mm",//        Right = "10mm",//        Bottom = "10mm",//        Left = "10mm"//    }//};//var pdfOptions = new PdfOptions//{//    // 设置A5横向尺寸(148mm × 210mm)//    Width = "210mm",  // 横向时宽度为210mm//    Height = "148mm", // 横向时高度为148mm//    Landscape = true, // 横向模式//    PrintBackground = true,//    MarginOptions = new MarginOptions//    {//        Top = "5mm",//        Right = "5mm",//        Bottom = "5mm",//        Left = "5mm"//    },//    Scale = 0.8m, // 确保不缩放//    PreferCSSPageSize = true // 使用CSS中定义的页面尺寸//};//var pdfOptions = new PdfOptions//{//    // 设置Com10横向尺寸(241mm × 105mm)//    Width = "241mm",  // 横向时宽度为241mm//    Height = "105mm", // 横向时高度为105mm//    Landscape = false, // 横向模式//    PrintBackground = true,//    MarginOptions = new MarginOptions//    {//        Top = "3mm",//        Right = "3mm",//        Bottom = "3mm",//        Left = "3mm"//    },//    Scale = 0.7m, // 建议保持1.0不缩放//    PreferCSSPageSize = false // 使用代码中定义的尺寸//};return await page.PdfDataAsync(pdfOptions);}}
}