ASP .NET WebForms ReportViewer如何配置本地打印机打印(免PDF)
RDLC ReportViewer Web端打印逻辑调整指南
为什么点打印按钮只会导出PDF
你现在遇到的状态完全是控件的默认兜底行为:当内置打印组件加载失败、未正确配置时,ReportViewer的打印按钮不会唤起本地打印机,会自动降级为导出PDF文件,也就是你当前看到的点击后直接触发PDF下载的效果。
调整步骤
1. 替换匹配现代浏览器的控件版本
老版本(SQL Server 2008/2012时代随安装包附带的ReportViewer)仅支持IE内核的ActiveX打印,在Chrome/Edge/Firefox等现代浏览器上完全无法运行,必然退化为导出PDF。
- 从Nuget安装官方维护的最新WebForms版ReportViewer包:
Microsoft.ReportingServices.ReportViewerControl.WebForms(版本选15.0及以上) - 安装完成后必须在Web.config中配对打印组件依赖的HTTP Handler,否则组件脚本无法加载,还是会走导出逻辑:
<!-- 兼容旧版经典应用池 --> <system.web> <httpHandlers> <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms" validate="false" /> </httpHandlers> </system.web> <!-- 兼容IIS集成模式 --> <system.webServer> <handlers> <add name="ReportViewerWebControlHandler" path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms" preCondition="integratedMode" /> </handlers> </system.webServer>
注意:Handler的程序集版本号要和你Nuget实际安装的包版本完全一致,不要硬抄参考值,否则会出现类型加载失败的错误。
2. 修改控件打印模式配置
这是一步就能解决问题的核心配置:
- 在aspx页面的ReportViewer控件标签上,把默认的导出PDF模式改成本地打印模式:
<rs:ReportViewer ID="rvDailyReport" runat="server" ShowPrintButton="True" PrintMode="LocalPrint" AsyncRendering="True"> </rs:ReportViewer>
- 控件默认的
PrintMode值就是ExportToPdf,这就是为啥点按钮直接下文件的根本原因 - 改成
LocalPrint之后,控件会自动加载内置的跨浏览器HTML5打印模块,点击按钮直接唤起系统标准的打印机选择弹窗,会列出所有本地连接的可用打印机,支持设置打印份数、纸张范围、双面打印等系统原生选项,完全不需要用户手动保存PDF再打开打印。
3. 旧版本兼容的替代方案
如果你因为项目依赖没法升级到15.0以上的控件版本,可以直接在后端覆盖打印按钮的默认点击行为:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 替换默认的导出PDF逻辑,绑定浏览器原生打印行为 rvDailyReport.PrintButton.ClientClick = "function() { window.print(); }"; } }
常见踩坑排查
- 改完配置还是触发导出PDF:打开浏览器开发者工具的控制台,看有没有
Reserved.ReportViewerWebControl.axd 404的报错,基本都是Web.config的Handler配置路径不对,对照包版本修正即可,别硬抄网上的版本号字符串,很多都是老版本的 - 现代浏览器下打印组件加载失败:检查站点是否开启HTTPS,HTTP站点下浏览器会拦截第三方组件的打印权限,导致组件加载失败自动降级为导出,别信老教程说要开IE兼容模式的方案,15.0以上版本的打印组件是纯HTML5实现,根本不需要ActiveX支持
- 点打印按钮没反应:不要把控件的
AsyncRendering属性设为False,否则打印组件的脚本会在页面渲染完成后才加载,按钮点击时脚本还没初始化,就会走默认的导出分支
内容的提问来源于stack exchange,提问作者Ejrr1085
相关产品推荐
相关产品推荐

