使用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
相关产品推荐
相关产品推荐

