You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Rotativa生成PDF后如何自动调用打印对话框而非展示PDF?

解决Rotativa生成PDF后自动调用打印对话框的问题

我来帮你解决这个问题,之前我也遇到过类似的情况——直接用ActionAsPdf返回PDF会占满整个浏览器窗口,导致没法访问主程序菜单。这里有两种可行的方案,能让PDF生成后自动触发打印对话框,而不是直接展示:

方案一:在目标视图中添加自动打印的JavaScript

你可以在PrepareTicket视图的底部加入一段JS代码,让PDF加载完成后自动调用打印功能。同时要确保Rotativa允许执行JavaScript:

步骤1:修改PrintTicket方法,启用JavaScript支持

更新你的Action方法,给ActionAsPdf添加AllowJavaScript和延迟参数,确保PDF渲染完成后再触发打印:

public ActionResult PrintTicket(string tempTickID) { 
    var report = new ActionAsPdf("PrepareTicket", new { tempTickID = tempTickID })
    {
        AllowJavaScript = true,
        CustomSwitches = "--javascript-delay 1000" // 给PDF渲染留1秒延迟,避免打印空白内容
    }; 
    return report; 
}

步骤2:在PrepareTicket视图中添加打印脚本

在视图的最底部(比如</body>标签前)加入这段JS:

<script type="text/javascript">
    window.onload = function() {
        // 触发浏览器打印对话框
        window.print();
        // 打印完成后自动关闭PDF窗口(如果是弹出窗口的话)
        setTimeout(function() {
            window.close();
        }, 1500);
    };
</script>

方案二:通过中间视图间接触发打印(更友好的用户体验)

如果方案一的效果不理想,你可以创建一个中间视图,让它隐藏加载PDF,然后自动触发打印,这样用户只会看到打印对话框,不会被PDF窗口挡住主程序:

步骤1:创建中间视图PrintTrigger.cshtml

新建一个视图文件,内容如下:

<!DOCTYPE html>
<html>
<head>
    <title>打印票据</title>
    <script type="text/javascript">
        window.onload = function() {
            const pdfFrame = document.getElementById('pdfFrame');
            // 等待PDF加载完成后触发打印
            pdfFrame.onload = function() {
                pdfFrame.contentWindow.print();
                // 打印后自动关闭当前窗口,回到主程序
                setTimeout(function() {
                    window.close();
                }, 1500);
            };
        };
    </script>
</head>
<body style="margin:0; padding:0;">
    <!-- 隐藏的iframe用来加载PDF -->
    <iframe id="pdfFrame" src="@Url.Action("PrepareTicket", new { tempTickID = ViewBag.TempTickID })" style="display: none;"></iframe>
</body>
</html>

步骤2:修改PrintTicket方法,返回中间视图

把原来返回ActionAsPdf的逻辑改成返回中间视图:

public ActionResult PrintTicket(string tempTickID) { 
    ViewBag.TempTickID = tempTickID;
    return View("PrintTrigger"); 
}

额外说明

这种方式的优势是:用户打开打印功能后,只会看到系统的打印对话框,打印完成后窗口自动关闭,完全不会影响主程序菜单的访问。


内容的提问来源于stack exchange,提问作者unknown techh

火山引擎 最新活动