java 结合Jaspersoft和PDF.js实现预览和打印的功能

在现代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 则负责在浏览器中高效地显示和打印这些报表。这种方法不仅提高了用户的体验,还简化了开发者的实现过程。

希望这些示例对你实现报表的预览和打印功能有所帮助。

上一篇:【Linux课程学习】:站在文件系统之上理解:软硬链接,软硬链接的区别


下一篇:[TLS] 使用 OpenSSL 命令行测试 TLS13 0-RTT-Client command