批量导出多个报表为一个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参数:
| 参数名 | 必填 | 说明 |
|---|---|---|
| 否 | 预览模式标识。设为true时,响应头Content-Disposition为inline,PDF将在浏览器中直接预览;不传或为其他值时,响应头为attachment,浏览器将直接下载PDF文件 |
表单POST参数:
| 参数名 | 必填 | 说明 |
|---|---|---|
| files | 是 | JSON字符串,表示要导出的多个报表文件集合 |
| _n | 否 | 导出后的文件名称,默认采用第一个报表文件名 |
| tenantId | 否 | 团队ID,当使用code访问报表时建议指定 |
/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中。