C# - 使用 CefSharp Chromium Web 浏览器打印到 PDF 并适合页面

C# - Using CefSharp Chromium Web Browser to Print To PDF and Fit to Page

提问人:Majd Odeh 提问时间:11/4/2022 更新时间:11/5/2022 访问量:1422

问:

我用于将可能包含图像的本地 html 页面转换为 PDF,以便在自助服务终端打印机上打印。PDF 的尺寸应为 80 毫米 x 200 毫米。以下是到目前为止的代码:ChromiumWebBrowser

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 页面仅包含文本,则可以完美转换。此外,如果它的图像适合指定的打印宽度和高度,则可以正常转换。当 html 中包含大图像时,会出现此问题。这会导致部分图像从右侧裁剪掉。

在普通浏览器中手动打印到 PDF 时,显示的弹出窗口有一个“适合可打印区域”的复选框,可缩小整个页面以适合整个图像。我想通过代码来模拟它。

在类中,有一个名为 的属性。当我将其从 100% 更改为 50% 时,图像非常适合创建的 PDF 页面。但是,这个 50% 的值是任意的,我想根据图像对其进行缩放。PdfPrintSettingsScaleFactor

我尝试更改视口宽度和高度或浏览器缩放级别,但这不会影响打印的 PDF。

我也不想截取 PDF 的屏幕截图,因为这会影响打印质量;打印文本要清晰得多。

如何使用 CefSharp 的 ChromiumWebBrowser 缩放页面以适应 PDF 页面?或者我怎样才能弄清楚应该是什么?ScaleFactor

以下是生成的 PDF 的第一页和第二页的屏幕截图:

enter image description here

C# PDF 打印 Chromium Cefsharp

评论


答:

1赞 amaitland 11/5/2022 #1

PrintToPdfAsync 使用与 https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF 相同的代码路径

没有对适合页面的特定支持。在 chromium 添加支持之前,不会有内置选项。

可能要考虑的选项:

  • 添加一些 css 媒体打印规则
  • 根据内容大小计算比例。

评论

0赞 amaitland 11/5/2022
在计算比例方面,stackoverflow.com/a/59468341/4583726 可能会给你一些灵感。
0赞 Majd Odeh 11/9/2022
谢谢你的回答!我考虑使用内容宽度和高度来确定比例因子,但无法到达任何地方。最后,如果我设法调整整个 pdf 的大小,文本将变得非常小。出于这个原因,在与我的主管讨论后,我们决定在以适合收据页面的方式创建 html 时,必须有一定程度的用户责任。因此,我们保留了当前的实现。我会将您的答案标记为正确。再次感谢!