颠覆Java报表开发!JQuickPDF:像写ECharts一样配置图表,直接在PDF中渲染,无需浏览器!

15 阅读6分钟

告别复杂渲染,拥抱极简开发体验

在日常开发中,我们经常需要生成各种 PDF 报告:企业信用报告、财务报表、股票分析、销售数据看板等。传统的 Java PDF 生成方案要么过于复杂(如 iText 需要深入理解文档结构),要么图表功能羸弱(如 Apache PDFBox 需要手动绘制每个图形元素)。

更痛苦的是,当我们需要在 PDF 中嵌入专业数据图表时,往往不得不:

  • 启动无头浏览器(Puppeteer、PhantomJS)渲染 ECharts,然后截图或转 PDF → 内存爆炸、性能差、部署复杂
  • 使用 JFreeChart 等库 → 图表样式陈旧、配置繁琐、与现代前端图表差距明显
  • 手动用 PDF 绘图 API 绘制 → 代码量巨大、难以维护、开发效率极低

有没有一种既能像 ECharts 一样声明式配置图表,又能直接在 JVM 内生成 PDF 矢量图表的方案?

答案是:JQuickPDF

今天给大家介绍这个开源项目 ——JQuickPDF,它采用类 HTML 模板语法 + 类 ECharts 图表配置,让 Java 开发者能够用熟悉的方式轻松生成包含专业图表的 PDF 文档!

🌟 核心亮点:像写 ECharts 一样配置图表,无需浏览器!

JQuickPDF 最吸引人的地方在于它的图表设计理念完全借鉴 ECharts 的声明式配置风格,但在 JVM 内部直接渲染成 PDF 矢量图形,无需任何浏览器环境!

对比一下,你就知道多爽:

传统方案(ECharts + Puppeteer):

java

运行

// 1. 前端或Node.js配置ECharts
option = {
    title: { text: '销售数据' },
    xAxis: { data: ['衬衫', '羊毛衫', '雪纺衫'] },
    yAxis: {},
    series: [{ type: 'bar', data: [35, 20, 15] }]
};

// 2. 启动无头浏览器渲染
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setContent(html);
await page.waitForSelector('canvas');

// 3. 截图或转PDF,性能差、内存高、部署复杂

JQuickPDF 方案(纯 Java,无浏览器):

java

运行

// 像配置ECharts一样配置图表
JOption option = new JOption();
option.title().text("销售数据").subtext("2023年度");
option.xAxis(new JCategoryAxis().data("衬衫", "羊毛衫", "雪纺衫"));
option.series(new JBar().name("销量").data(35, 20, 15));

// 直接渲染到PDF,无需浏览器!
JGraphContainer graphContainer = new JGraphContainer();
graphContainer.setOption(option);
graphContainer.setType(JChartType.BAR);

一模一样的数据结构,不需要浏览器,不需要额外转换,直接生成 PDF 矢量图表!

📊 支持 20 + 种图表类型,覆盖 99% 的报表场景

JQuickPDF支持的图表类型非常丰富,几乎涵盖了主流数据可视化需求,并且全部无需浏览器渲染:

图表类型 配置常量 应用场景 ECharts用户友好度
柱状图 BAR 销售数据对比、年度业绩分析 ⭐⭐⭐⭐⭐ 完全一致
折线图 LINE 趋势分析、股价走势、温度变化 ⭐⭐⭐⭐⭐ 完全一致
饼图 PIE 市场份额、预算分配、用户占比 ⭐⭐⭐⭐⭐ 完全一致
散点图 SCATTER 相关性分析、数据分布 ⭐⭐⭐⭐ 略有差异
K线图 K 股票、加密货币、期货分析 ⭐⭐⭐⭐⭐ 完全一致
雷达图 RADAR 能力评估、产品多维度对比 ⭐⭐⭐⭐⭐ 完全一致
热力图 HEATMAP 用户行为密度、温度分布 ⭐⭐⭐⭐ 略有差异
甘特图 Gantt 项目管理、资源调度 ⭐⭐⭐⭐ 专用格式
词云 WordsCloud 文本分析、关键词可视化 ⭐⭐⭐⭐ 专用格式
地图 GEO Json 区域数据分布、地理可视化 ⭐⭐⭐⭐ 支持GeoJSON
 

所有这些图表,都不需要浏览器,直接在 JVM 内渲染成矢量图形(SVG),嵌入 PDF!

🔥 实战案例:股票分析报告中的 K 线图

假设你要生成一份股票分析报告,需要展示股价的 K 线图(开盘、收盘、最高、最低)。用 JQuickPDF,几行代码搞定:

java

运行

// 1. 配置K线图数据(像ECharts一样)
JOption option = new JOption();
option.title().text("特斯拉股价走势").subtext("2025年1月");
JCategoryAxis xAxis = new JCategoryAxis();
xAxis.data("01/01", "01/02", "01/03", "01/04", "01/05");
option.xAxis(xAxis);
option.yAxis(new JValueAxis());

JCandlestick candlestick = new JCandlestick();
candlestick.name("股价").data(
    new Object[]{105.2, 108.5, 104.8, 109.1},
    new Object[]{108.6, 107.8, 106.5, 109.5},
    new Object[]{107.9, 105.3, 104.2, 108.0}
);
option.series(candlestick);

// 2. 将图表配置传入PDF模板
JGraphContainer graphContainer = new JGraphContainer();
graphContainer.setOption(option);
graphContainer.setType(JChartType.K);

JPdfConfig config = new JPdfConfig();
config.setGraphConfig(new JGraphConfig().put("stockChart", graphContainer));

// 3. 在PDF模板中引用(类HTML语法)
// <svg>&{stockChart}</svg>

// 4. 生成PDF
JQuickPdfXExecutor executor = new JQuickPdfXExecutor(config);
executor.execute(templateContent);

生成的 PDF 中,K 线图清晰可见,矢量无损,文字可选,无需浏览器!

🎯 为什么说它比 ECharts + 无头浏览器方案更强?

对比项 JQuickPDF ECharts + Puppeteer
是否需要浏览器 ❌ 不需要 ✅ 需要
内存占用 低(150MB) 高(800MB+)
启动速度 毫秒级 秒级
并发性能 高(无状态) 低(浏览器实例受限)
部署复杂度 简单(单个JAR) 复杂(需安装Chrome)
图表配置语法 类ECharts 原生ECharts
PDF渲染质量 矢量原生元素 截图可能模糊
文本可选中 ✅ 是 ❌ 否(截图形式)
文件大小

💡 完整示例:企业级报表中的多图表组合

JQuickPDF 的强大之处在于,一个 PDF 中可以嵌入多个不同类型图表,并且支持动态数据绑定和类 HTML 模板语法:

html

预览

<pdf>
    <body>
        <h1 style="textAlignment:center; color:#2c3e50">2025年度销售分析报告</h1>
        
        <h2>季度销售对比</h2>
        <div style="margin:20px; backgroundColor:#f8f9fa">
            <svg>&{barChart}</svg>
        </div>
        
        <h2>月度销售趋势</h2>
        <svg>&{lineChart}</svg>
        
        <h2>区域销售占比</h2>
        <svg>&{pieChart}</svg>
        
        <p>报告生成时间: ${generateTime}</p>
        <p>分析人员: ${analyst}</p>
    </body>
</pdf>

Java 代码中,你只需要分别配置各个图表,然后通过${变量}&{变量}实现数据绑定和图表引用。

🚀 快速开始

1. 添加依赖

xml

<dependency>
    <groupId>io.github.paohaijiao</groupId>
    <artifactId>jquick-pdf</artifactId>
    <version>1.5.4</version>
</dependency>

2. 创建图表配置(以雷达图为例)

java

运行

// 像配置ECharts一样配置雷达图
JOption option = new JOption();
option.title().text("团队能力评估").subtext("六维度对比");

JRadar radar = new JRadar();
radar.indicator(
    new JRadar.Indicator().name("技术能力").max(100),
    new JRadar.Indicator().name("沟通能力").max(100),
    new JRadar.Indicator().name("项目管理").max(100),
    new JRadar.Indicator().name("创新能力").max(100),
    new JRadar.Indicator().name("执行力").max(100),
    new JRadar.Indicator().name("团队协作").max(100)
);
option.radar(radar);

JRadarSeries series = new JRadarSeries();
series.name("当前团队").data(85, 90, 78, 88, 92, 87);
option.series(series);

3. 定义 PDF 模板(使用类 HTML 语法)

html

预览

<pdf>
    <body>
        <div style="textAlignment:center">
            <h1 style="color:#2c3e50">团队能力评估报告</h1>
        </div>
        <div style="margin:20px; padding:15px; backgroundColor:#ffffff">
            <svg>&{radarChart}</svg>
        </div>
        <div style="marginTop:20px">
            <p>评估日期: 2025年3月15日</p>
            <p>评估人: ${analyst}</p>
        </div>
    </body>
</pdf>

4. 生成 PDF

java

运行

// 将图表配置放入JPdfConfig
JGraphContainer graphContainer = new JGraphContainer();
graphContainer.setOption(option);
graphContainer.setType(JChartType.RADAR);

JPdfConfig config = new JPdfConfig();
config.setGraphConfig(new JGraphConfig().put("radarChart", graphContainer));

// 设置动态数据
JContext context = new JContext();
context.put("analyst", "张三");

// 读取模板
JReader fileReader = new JReSourceFileReader("report.html");
JAdaptor adaptor = new JAdaptor(fileReader);

// 执行生成
JQuickPdfXExecutor executor = new JQuickPdfXExecutor(context, config);
executor.execute(adaptor.getRuleContent());

支持 60+ CSS 样式属性:边距、内边距、对齐方式、字体、颜色、背景、边框、圆角、透明度、旋转等。

🎯 适用场景

  • 金融科技公司:股票分析报告、基金季报,需要 K 线图、箱线图
  • 企业级 BI 系统:自动生成周报 / 月报,需要柱状图、饼图、雷达图
  • 电商平台:销售分析报告、用户行为分析,需要热力图、词云
  • 科研与教育:实验报告、统计分析,需要散点图、相关系数矩阵
  • 项目管理软件:项目进度报告,需要甘特图、仪表盘

📊 项目活跃度

截止目前,JQuickPDF 在 GitHub 上已获得96 颗星,最新版本更新于 2026 年 1 月(v1.5.4),项目维护活跃,持续迭代中。

🎯 总结

JQuickPDF 为 Java 开发者提供了一个优雅的 PDF 生成方案:

  • ✅ 类 ECharts 配置体验:前端开发者熟悉的声明式语法
  • ✅ 彻底摆脱浏览器依赖:无需 Chrome、无头浏览器,纯 Java 实现
  • ✅ 20 + 种图表类型:覆盖金融、BI、科研等各个领域
  • ✅ 类 HTML 模板语法:布局简单直观,支持丰富样式
  • ✅ 性能优异:内存低、并发高、适合批量生成
  • ✅ 部署简单:单一 JAR 包,与 Spring Boot 无缝集成
  • ✅ 矢量无损:文字可选中、无限缩放不模糊