
本文详解如何通过 webview2 原生 api 在 delphi 的 tedgebrowser 组件中动态设置打印时的页眉(header)和页脚(footer)文本,替代已废弃的 twebbrowser 注册表方案,并提供完整可运行代码及接口准备说明。
本文详解如何通过 webview2 原生 api 在 delphi 的 tedgebrowser 组件中动态设置打印时的页眉(header)和页脚(footer)文本,替代已废弃的 twebbrowser 注册表方案,并提供完整可运行代码及接口准备说明。
在迁移到 TEdgeBrowser 后,传统基于 IE 注册表(如 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\PageSetup)控制打印页眉页脚的方式已完全失效——Edge WebView2 不读取这些键值,也不支持全局策略自定义内容。但 WebView2 提供了更现代、更可控的打印 API:通过 ICoreWebView2PrintSettings 接口,开发者可在调用 Print() 方法时实时指定页眉标题、页脚文本、是否启用页眉页脚、纸张方向、打印机名称等参数,实现精细化打印控制。
以下是一个完整的 Delphi 示例,展示如何在按钮点击事件中触发自定义打印:
uses
Winapi.Windows, System.SysUtils, Vcl.Controls, Vcl.Forms,
Web.WebView2, Web.WebView2Environment, Winapi.ActiveX;
procedure TForm1.Button1Click(Sender: TObject);
var
PrintSettings: ICoreWebView2PrintSettings;
Environment6: ICoreWebView2Environment6;
WebView2_16: ICoreWebView2_16;
begin
// 确保 WebView2 已初始化且环境就绪
if not Assigned(EdgeBrowser1.EnvironmentInterface) then
begin
ShowMessage('WebView2 environment not ready. Please wait for initialization.');
Exit;
end;
// 获取扩展环境接口(需 Delphi 11.2+ 或手动导入类型)
if Succeeded((EdgeBrowser1.EnvironmentInterface as IUnknown).QueryInterface(
ICoreWebView2Environment6, Environment6)) then
begin
// 创建打印设置对象
Environment6.CreatePrintSettings(PrintSettings);
// 启用页眉页脚
PrintSettings.Set_ShouldPrintHeaderAndFooter(True);
// 设置自定义页眉(显示在每页顶部中央)
PrintSettings.Set_HeaderTitle('销售报表 — 2024年Q3');
// 设置自定义页脚(显示在每页底部中央;注意:Set_FooterUri 实际用于页脚文本,非 URI)
PrintSettings.Set_FooterUri('第 &p 页,共 &P 页 | 生成时间:&D &T');
// 可选:指定打印机名称(需精确匹配系统中已安装的打印机名)
// PrintSettings.Set_PrinterName('Microsoft Print to PDF');
// 调用打印(需确保 WebView2 接口版本 ≥ 1.0.1829-prerelease,对应 ICoreWebView2_16)
if Succeeded((EdgeBrowser1.DefaultInterface as IUnknown).QueryInterface(
ICoreWebView2_16, WebView2_16)) then
begin
WebView2_16.Print(PrintSettings, nil);
end
else
ShowMessage('ICoreWebView2_16 interface not supported. Update WebView2 runtime.');
end
else
ShowMessage('ICoreWebView2Environment6 not available. Check WebView2 SDK version.');
end;⚠️ 关键前提与注意事项:
- 接口类型需手动补充:Delphi 官方单元 Web.WebView2.pas 默认未包含 ICoreWebView2PrintSettings、ICoreWebView2Environment6 和 ICoreWebView2_16 等较新接口。你必须按 Marcodor 的 StackOverflow 方案 手动声明这些 COM 接口(含 GUID 和方法签名),或使用社区维护的 WebView2-Delphi 开源封装库。
- 运行时版本要求:Print() 方法自 WebView2 Runtime v1.0.1829-prerelease 起可用,建议部署至少 v1.0.2249.41 或更高稳定版(可通过 WebView2Loader.dll 版本号验证)。
-
页眉页脚格式说明:
- Set_HeaderTitle:仅接受纯文本,不支持页码(&p)、日期(&D)等 IE 风格宏;实际渲染效果取决于 WebView2 内部实现,当前版本中该字段常作为左对齐主标题。
- Set_FooterUri:命名易误导,实为页脚主文本字段;支持 &p(当前页)、&P(总页数)、&D(短日期)、&T(时间)等标准打印宏,推荐在此处设置动态信息。
- 异步与错误处理:Print() 是异步方法,若需监听完成状态,应传入 ICoreWebView2PrintCompletedHandler 回调(本例中传 nil 表示忽略)。生产环境建议添加 try...except 并检查 Succeeded() 返回值。
综上,TEdgeBrowser 的打印定制不再依赖系统级注册表,而是转向面向接口的编程范式。通过合理组合 ICoreWebView2PrintSettings 属性,你不仅能完全掌控页眉页脚内容,还可无缝集成纸张大小、边距、彩色/灰度等高级选项,真正实现企业级打印需求。



















