润乾报表实现静默打印超长参数 POST 传递方案

一、背景与问题

润乾报表的本地打印功能(directprint_local.jsp)是实现静默打印的比较好的方式,因为它通过客户端打印控件直接调用打印机,无需经过浏览器预览,整个过程无任何打印预览弹窗,能够完全满足业务系统对自动化、无干预打印的需求。
目前客户在使用过程中遇到了一个问题:该 JSP 采用 GET 方式传递报表参数,所有参数拼接在 printrpx:// 协议的 URL 中。当报表参数包含大量 JSON 数据、长文本描述或复杂嵌套对象时,极易超出浏览器对 URL 长度的限制,导致打印失败。
故本文档主要介绍如何通过 POST 方式传递超长参数,以解决该问题,同时保持静默打印能力。

二、解决思路

通过 HTML 表单 POST 提交 替代直接 URL 拼接,将超长参数放在 HTTP 请求体中,彻底规避浏览器 URL 长度限制。

三、实现步骤

创建 HTML 文件 post.html(静态参数示例)
在页面中构建一个隐藏表单,将 report 参数通过隐藏字段传递。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>润乾报表打印 - POST方式</title>
</head>
<body>
    <!-- 1. 构建一个隐藏的表单 -->
    <form id="reportForm" method="POST" action="http://localhost:28080/demo/reportJsp/directprint_local.jsp">
        <!-- 隐藏字段,name 必须是 "report" -->
        <input type="hidden" id="reportParam" name="report" value="">
    </form>
    <script>
        // 2. 组装你的超长参数(Json数据)
        var reportData = {
            "code": 200,
            "msg": "成功",
            "data": {
                "patId": 11,
                "name": "测试"
          }
        }; 
        // 构建完整的 report 参数字符串(润乾格式:test.rpx(arg1=JSON))
        var fullReportParam = '{test.rpx(arg1=' + JSON.stringify(reportData) + ')}';
        // 去掉编码:直接将原始参数字符串(包含大括号、引号、中文等)填入隐藏字段,不进行 encodeURIComponent
        document.getElementById('reportParam').value = fullReportParam;
        // 自动提交表单
        document.getElementById('reportForm').submit();
    </script>
</body>
</html>

上述 post.html 为固定参数的静默打印示例,适用于参数固定的场景。但在实际业务中,报表参数往往需要用户动态填写(如患者 ID、日期范围、诊断信息等)。为此,可构建一个可视化参数配置页面,提供表单控件(输入框、下拉选择、文本域等)供用户录入数据,点击打印按钮后自动组装为 report 参数字符串并通过 POST 方式提交即可。

注意:

1、确保客户端已安装润乾打印控件,下载地址 润乾报表 - 本地打印
2、 指定的 printerName 打印机参数存在且可用。
3. 当参数数据量较大时(如包含长文本、嵌套对象等),会遇到以下错误:

1png

该错误表明 HTTP 请求头超出了 Tomcat 容器的默认大小限制。
服务端配置调整
在 tomcat 的 server.xml 的 中添加

<Connector port="28080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               maxThreads="150"
               redirectPort="8443"
               URIEncoding="UTF-8"
	       maxHttpHeaderSize="1048576"
               maxPostSize="-1"
               maxSavePostSize="-1" />
参数 说明 推荐值
maxHttpHeaderSize HTTP 请求头最大字节数 1048576(1MB)
maxPostSize POST 请求体最大字节数 -1(不限制)
maxSavePostSize 重定向时保存 POST 数据的最大字节数 -1(不限制)

报表单元格中如何读取使用 json 数据,可参考文档 润乾报表中 JSON 数据的单元格直读与展示

post.html 点击下载。

postzip

【扩展】PDF 打印方式参考
若业务上不介意弹出打印预览界面,PDF 打印方式(pdfBatchPrint.jsp)也可借鉴本文的 POST 传递方式:
html

<form method="POST" action="http://localhost:6868/demo/reportJsp/pdfBatchPrint.jsp">    
<input type="hidden" name="report" value='{test.rpx(arg1={"code":200})}'>    
<input type="hidden" name="printerName" value="HP LaserJet"></form>