批量导出多个报表为一个PDF文件

概述

通过form表单POST方式访问multipdf地址,可以将多个报表文件合并导出为一个PDF文件。每个报表文件可以指定不同的参数值,服务端会依次解析每个报表及其对应的参数,最终将所有报表合并输出为一个PDF文件流。

访问地址

multipdf接口的URL格式如下:

http[s]://host[:port]/[context-path]/baskserver/baskreport/multipdf?print=true

其中baskserver为报表引擎的servlet路径,baskreport为报表模块路径,multipdf为多报表合并导出PDF的接口地址。print=true表示为预览模式,不导出PDF文件,直接在浏览器中预览, print=false表示导出PDF文件,并返回PDF文件流。

请求方式

该接口通过POST方式访问,URL中的query参数和表单POST参数说明如下:

URL Query参数:

参数名 必填 说明
print 预览模式标识。设为true时,响应头Content-Dispositioninline,PDF将在浏览器中直接预览;不传或为其他值时,响应头为attachment,浏览器将直接下载PDF文件

表单POST参数:

参数名 必填 说明
files JSON字符串,表示要导出的多个报表文件集合
_n 导出后的文件名称,默认采用第一个报表文件名
tenantId 团队ID,当使用code访问报表时建议指定

print参数通过URL的query string传递,而非表单的POST body中。例如:/multipdf?print=true

files参数说明

files参数是一个JSON字符串,对应一个数组,数组中每个元素是一个JSON对象,表示一个报表文件及其参数,结构如下:

[
  {
    "id": 报表文件ID,
    "parameters": {
      "参数名1": 参数值1,
      "参数名2": 参数值2
    }
  },
  {
    "id": 报表文件ID,
    "parameters": {
      "参数名1": 参数值1,
      "参数名2": 参数值2
    }
  }
]

每个报表文件对象支持以下属性:

属性名 必填 说明
id 与code二选一 报表文件的数字ID
code 与id二选一 报表文件的CODE
version 报表文件版本号
parameters 报表参数,JSON对象格式

举例

1. 使用form表单预览多个报表(print=true)

通过在URL中添加print=true参数,可以将多个报表合并后在浏览器中直接预览PDF:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>预览多个报表为PDF</title>
</head>
<body>
<form id="multiPdfForm" method="post" action="http://192.168.18.106:8080/baskserver-test/baskserver/baskreport/multipdf?print=true">
    <input type="hidden" name="files" id="files" />
    <button type="button" onclick="previewMultiPdf()">合并多个报表并预览</button>
</form>
<script>
function previewMultiPdf(){
    var filesData = [
        {
            id: 2001,
            parameters: {
                deptId: "D11",
                date: "2026-01-01"
            }
        },
        {
            id: 1501,
            parameters: {
                deptId: "D22",
                date: "2026-03-01"
            }
        }
    ];
    document.getElementById('files').value = JSON.stringify(filesData);
    document.getElementById('multiPdfForm').submit();
}
</script>
</body>
</html>

print=true时,服务端返回的响应头为Content-Disposition: inline,浏览器会将PDF以内嵌方式直接展示在页面中,而不是触发文件下载。适合在页面中通过iframe嵌入预览的场景。

2. 使用form表单下载多个报表为PDF(不带print参数)

不传print参数或传print=false时,服务端返回的响应头为Content-Disposition: attachment,浏览器将直接下载PDF文件:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>导出多个报表为PDF文件</title>
</head>
<body>
<form id="multiPdfForm" method="post" action="http://192.168.18.106:8080/baskserver-test/baskserver/baskreport/multipdf">
    <input type="hidden" name="files" id="files" />
    <input type="hidden" name="_n" value="合并报表导出" />
    <button type="button" onclick="exportMultiPdf()">导出多个报表为一个PDF</button>
</form>
<script>
function exportMultiPdf(){
    var filesData = [
        {
            id: 2001,
            parameters: {
                deptId: "D11",
                date: "2026-01-01"
            }
        },
        {
            id: 1501,
            parameters: {
                deptId: "D22",
                date: "2026-03-01"
            }
        }
    ];
    document.getElementById('files').value = JSON.stringify(filesData);
    document.getElementById('multiPdfForm').submit();
}
</script>
</body>
</html>

3. 使用code访问报表

如果希望通过报表CODE而不是ID来访问,files参数中可以使用code属性:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>批量导出多个报表为PDF</title>
</head>
<body>
<form id="multiPdfForm" method="post" action="http://192.168.18.106:8080/baskserver-test/baskserver/baskreport/multipdf?print=true">
    <input type="hidden" name="files" id="files" />
    <input type="hidden" name="tenantId" value="yourTenantId" />
    <button type="button" onclick="previewMultiPdf()">合并多个报表并预览</button>
</form>
<script>
function previewMultiPdf(){
    var filesData = [
        {
            code: "report_sales",
            parameters: {
                year: 2025
            }
        },
        {
            code: "report_inventory",
            parameters: {
                year: 2026
            }
        }
    ];
    document.getElementById('files').value = JSON.stringify(filesData);
    document.getElementById('multiPdfForm').submit();
}
</script>
</body>
</html>

4. 使用Javascript方式调用

也可以通过引入BaskReport.bundle.js,使用BaskReport.doExportMultiPdf方法导出PDF文件,或使用BaskReport.doMultiPrint方法直接打印多个报表,这两种方法内部都是通过访问multipdf地址实现的:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>批量操作多个报表</title>
<script type="text/javascript" src="http://192.168.18.106:8080/baskserver-test/baskserver/res/baskreport/js/view/BaskReport.bundle.js"></script>
</head>
<body>
<button onClick="multiexport()">导出多个报表为一个PDF文件</button>
<button onClick="multiprint()">直接打印多个报表</button>
<script>
var REPORT_BASE_URL = 'http://192.168.18.106:8080/baskserver-test';
function multiexport(){
    BaskReport.doExportMultiPdf({
        baseUrl: REPORT_BASE_URL,
        name: '合并报表导出',
        files:[
            {
                id: 2001,
                parameters: {
                    deptId: "D11",
                    date: "2026-01-01"
                }
            },
            {
                id: 1501,
                parameters: {
                    deptId: "D22",
                    date: "2026-03-01"
                }
            }
        ]
    });
}
function multiprint(){
    BaskReport.doMultiPrint({
        baseUrl: REPORT_BASE_URL,
        files:[
            {
                id: 2001,
                parameters: {
                    deptId: "D11",
                    date: "2026-01-01"
                }
            },
            {
                id: 1501,
                parameters: {
                    deptId: "D22",
                    date: "2026-03-01"
                }
            }
        ]
    });
}
</script>
</body>
</html>

上面的例子当中,REPORT_BASE_URL的值为:http://192.168.18.106:8080/baskserver-test ,这里的baskserver-test为应用的contextpath,如果应用没有contextpath,那么REPORT_BASE_URL的值就应该为:http://192.168.18.106:8080。

其中:

  • doExportMultiPdf:调用multipdf接口导出PDF文件,不传print参数,浏览器直接下载PDF。
  • doMultiPrint:调用multipdf接口并传print=true,通过隐藏的iframe加载PDF后触发浏览器打印功能。

print参数对响应行为的影响

场景 print参数 Content-Disposition 浏览器行为
预览/打印 print=true inline;filename="xxx.pdf" 浏览器内嵌显示PDF,可调用浏览器打印功能
下载导出 不传或print=false attachment;filename="xxx.pdf" 浏览器直接下载PDF文件

注意事项

  • 访问的报表文件必须是已发布状态,否则会提示文件未发布不能访问。
  • 需要保证访问的URL处于登录状态,如果报表引擎与应用分别位于不同的系统当中,需要解决登录问题,具体可参考单点登录相关介绍。
  • 如果不指定_n参数,导出的PDF文件名将默认采用files数组中第一个报表文件的名称。
  • 每个报表文件的parameters参数对应报表设计器中定义的参数列表,不同的报表可以传递不同的参数值。
  • print参数通过URL的query string传递(如?print=true),而不是放在表单的POST body中。

results matching ""

    No results matching ""