在现代Web应用中,实现复杂的报表预览和打印功能是一项常见的需求。Java 结合 Jaspersoft 和 PDF.js 是一种高效的方法来满足这些需求。Jaspersoft 是一个强大的报表生成工具,而 PDF.js 是一个用于在浏览器中渲染 PDF 文件的 JavaScript 库。下面将详细介绍如何结合这两种技术实现报表的预览和打印功能。
1. 环境准备
1.1 添加依赖
首先,确保你的项目中包含了必要的依赖。如果你使用的是 Maven,可以在 pom.xml
中添加以下依赖:
<!-- Jaspersoft -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.17.0</version>
</dependency>
<!-- PDF.js -->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>pdfjs</artifactId>
<version>2.10.377</version>
</dependency>
1.2 下载 PDF.js
你需要下载 PDF.js 并将其放置在项目的静态资源目录中。可以从 PDF.js 官方网站 下载最新版本的 PDF.js。
2. 使用 Jaspersoft 生成 PDF 报表
2.1 创建报表模板
使用 Jaspersoft Studio 创建报表模板。Jaspersoft Studio 是一个基于 Eclipse 的报表设计器,可以用来创建复杂的报表布局。保存报表模板为 .jrxml
文件。
2.2 编译报表模板
在 Java 代码中,使用 JasperReports 库编译报表模板并生成 PDF 文件。
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.HashMap;
import java.util.Map;
public class JasperReportGenerator {
public static byte[] generateReport(String templatePath, Map<String, Object> parameters, List<?> data) {
try {
// 加载报表模板
JasperReport jasperReport = JasperCompileManager.compileReport(templatePath);
// 创建数据源
JRDataSource dataSource = new JRBeanCollectionDataSource(data);
// 填充报表
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
// 导出为 PDF
byte[] pdfBytes = JasperExportManager.exportReportToPdf(jasperPrint);
return pdfBytes;
} catch (JRException e) {
e.printStackTrace();
return null;
}
}
}
3. 使用 PDF.js 实现 PDF 预览
3.1 创建 HTML 页面
创建一个 HTML 页面来显示 PDF 文件。使用 PDF.js 提供的 viewer.html
文件来实现预览功能。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PDF Preview</title>
<script src="webjars/pdfjs/2.10.377/build/pdf.min.js"></script>
<link rel="stylesheet" href="webjars/pdfjs/2.10.377/web/viewer.css">
</head>
<body>
<div id="pdf-viewer"></div>
<script>
// 初始化 PDF.js 查看器
pdfjsLib.GlobalWorkerOptions.workerSrc = 'webjars/pdfjs/2.10.377/build/pdf.worker.min.js';
const viewer = new pdfjsLib.PDFViewer({
container: document.getElementById('pdf-viewer'),
// 其他配置选项
});
// 加载 PDF 文件
const url = 'path/to/your/pdf-file.pdf';
pdfjsLib.getDocument(url).promise.then(function(pdf) {
viewer.setDocument(pdf);
});
</script>
</body>
</html>
3.2 控制器代码
在 Spring Boot 控制器中,提供一个接口来生成 PDF 文件并返回给前端。
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/report")
public class ReportController {
@GetMapping("/generate")
public ResponseEntity<byte[]> generateReport(@RequestParam String templatePath, @RequestParam List<?> data) {
Map<String, Object> parameters = new HashMap<>();
byte[] pdfBytes = JasperReportGenerator.generateReport(templatePath, parameters, data);
return ResponseEntity.ok()
.header("Content-Type", "application/pdf")
.body(pdfBytes);
}
}
4. 实现打印功能
4.1 使用浏览器的打印功能
最简单的方法是利用浏览器的内置打印功能。你可以在 PDF.js 查看器中添加一个打印按钮,点击按钮时调用浏览器的打印功能。
<button onclick="printPDF()">打印</button>
<script>
function printPDF() {
window.print();
}
</script>
4.2 使用 PDF.js 打印
如果你需要更细粒度的控制,可以使用 PDF.js 提供的打印功能。PDF.js 提供了一个 print
方法,可以用来打印当前显示的 PDF 文件。
<button onclick="printPDF()">打印</button>
<script>
function printPDF() {
viewer.currentPresentationMode = 'print';
viewer.requestPresentationMode();
}
</script>
5. 总结
通过结合 Jaspersoft 和 PDF.js,你可以轻松实现报表的生成、预览和打印功能。Jaspersoft 负责生成高质量的 PDF 报表,而 PDF.js 则负责在浏览器中高效地显示和打印这些报表。这种方法不仅提高了用户的体验,还简化了开发者的实现过程。
希望这些示例对你实现报表的预览和打印功能有所帮助。