如何通过TWebBrowser在后台进程中无弹窗打印输出PDF文件
解决方案
你遇到的问题根源是用打印机索引定位设备,不同设备的打印机顺序不同自然会出问题,改成通过固定打印机名称定位目标PDF打印机即可实现跨设备的静默后台打印,不需要修改默认打印机配置。
前置操作
- 先在3台计算机上将你要用的PDF打印机重命名为完全相同的名称,比如统一用系统自带的
Microsoft Print to PDF(Win10/11系统默认自带,无需安装第三方软件),也可以用福昕、Adobe等第三方PDF打印机,只要名称统一即可。
修正后的实现代码
uses Printers, OleCtrls, SHDocVw; // 确保引入必要单元 procedure TfmNavegador.btnImprimirClick(Sender: TObject); const OLECMDID_PRINT = $00000006; OLECMDEXECOPT_DONTPROMPTUSER = $00000002; // 不弹窗的参数值为2,你之前定义的1是弹框的参数 var vIn, vOut: OleVariant; PrintTarget: string; OutputPath: string; begin // 先确认WebBrowser文档已加载完成,避免输出空白PDF if wbNotificacion.ReadyState <> READYSTATE_COMPLETE then Exit; // 固定目标PDF打印机名称,和三台设备上的命名保持一致即可 PrintTarget := 'Microsoft Print to PDF'; // 指定PDF输出的完整路径,直接写死即可完全隐藏保存弹窗 OutputPath := 'C:\Temp\导出附件.pdf'; // 构造打印参数:指定打印机、输出路径、禁用所有弹窗 vIn := VarArrayCreate([0, 4], varVariant); vIn[0] := 2; // 打印到指定打印机模式 vIn[1] := PrintTarget; // 目标打印机名称 vIn[2] := OutputPath; // PDF输出路径 vIn[3] := False; // 隐藏打印到文件的确认弹窗 vIn[4] := False; // 隐藏打印进度弹窗 // 执行静默打印 wbNotificacion.ControlInterface.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vIn, vOut); end;
注意事项
- 如果不需要固定输出路径,删掉
vIn[2]、vIn[3]的赋值即可,不过会弹出保存文件的对话框 - 如果不想依赖打印设备,也可以直接将TWebBrowser里的HTML内容存为临时文件,调用本地HTML转PDF工具直接生成文件,不需要走打印流程,兼容性更好
内容的提问来源于stack exchange,提问作者Lucho
相关产品推荐
相关产品推荐

