You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CefSharp ChromiumWebBrowser转HTML为PDF时如何适配页面尺寸

如何用CefSharp的ChromiumWebBrowser实现HTML转PDF时自动适配指定页面尺寸

我正在使用ChromiumWebBrowser将包含图片的本地HTML页面转换为80mm×200mm的PDF,用于自助终端打印。现有代码如下:

using (var browser = new ChromiumWebBrowser(url, browserSettings))
{        
    if (zoomLevel > 0)
    {
        browser.FrameLoadStart += (s, argsi) =>
        {
            var b = (ChromiumWebBrowser)s;
            if (argsi.Frame.IsMain)
            {
                b.SetZoomLevel(zoomLevel);
            }
        };
    }

    await browser.WaitForInitialLoadAsync();

    var contentSize = await browser.GetContentSizeAsync();

    var viewport = new Viewport
    {
        Height = contentSize.Height,
        Width = contentSize.Width,
        Scale = 1.0
    };

    var printSettings = new PdfPrintSettings();
    printSettings.PageWidth = 80000;   // 80mm
    printSettings.PageHeight = 200000; // 200mm
    printSettings.BackgroundsEnabled = true;

    await browser.PrintToPdfAsync("D:\\chromium_pdf.pdf", printSettings);
}

当HTML仅含文本或图片尺寸符合打印规格时转换正常,但包含大图片时,图片右侧会被裁剪。手动在浏览器打印PDF时勾选“适配打印区域”可完整显示图片,希望通过代码自动实现该功能,而非手动设置ScaleFactor,且不想用截图方式影响打印质量。


解决方案:自动计算适配的ScaleFactor

核心思路是对比页面内容的实际宽度与PDF页面宽度(统一单位后),计算出合适的缩放比例,确保内容完整放入PDF页面宽度内。

1. 单位转换逻辑

  • GetContentSizeAsync()返回的内容尺寸单位为像素,默认DPI为96。
  • PdfPrintSettings的PageWidth/PageHeight单位为0.01毫米,80mm对应80000。
  • 像素转毫米公式:内容宽度(mm) = 内容宽度(像素) * 96 / 25.4(25.4为英寸转毫米的系数)

2. 计算适配的ScaleFactor

对比内容宽度与PDF页面宽度,取最小比例作为缩放因子(避免放大内容,仅缩小超出的部分):

const double pdfPageWidthMm = 80;
var contentWidthMm = contentSize.Width * 96 / 25.4;
// 计算缩放比例,范围限制在0.1到2.0之间(符合ScaleFactor属性要求)
var scaleFactor = Math.Clamp(pdfPageWidthMm / contentWidthMm, 0.1, 2.0);
printSettings.ScaleFactor = scaleFactor;

3. 修改后的完整代码

using (var browser = new ChromiumWebBrowser(url, browserSettings))
{        
    if (zoomLevel > 0)
    {
        browser.FrameLoadStart += (s, argsi) =>
        {
            var b = (ChromiumWebBrowser)s;
            if (argsi.Frame.IsMain)
            {
                b.SetZoomLevel(zoomLevel);
            }
        };
    }

    await browser.WaitForInitialLoadAsync();

    var contentSize = await browser.GetContentSizeAsync();

    var printSettings = new PdfPrintSettings();
    printSettings.PageWidth = 80000;   // 80mm
    printSettings.PageHeight = 200000; // 200mm
    printSettings.BackgroundsEnabled = true;

    // 自动计算适配的ScaleFactor
    const double pdfPageWidthMm = 80;
    var contentWidthMm = contentSize.Width * 96 / 25.4;
    // 确保缩放比例在合法范围内,且仅缩小超出的内容
    printSettings.ScaleFactor = Math.Clamp(pdfPageWidthMm / contentWidthMm, 0.1, 1.0);

    await browser.PrintToPdfAsync("D:\\chromium_pdf.pdf", printSettings);
}

补充说明

  • 若页面使用自定义DPI,需替换公式中的96为实际DPI值,保证单位转换准确。
  • 如需同时适配高度,可分别计算宽度和高度的缩放因子,取更小的那个值,但自助终端打印通常优先保证宽度完整显示。
  • Viewport和浏览器缩放级别对PrintToPdfAsync无效,需通过PdfPrintSettings的参数控制打印效果。

内容的提问来源于stack exchange,提问作者Majd Odeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:31:10