Java 生成「联合奖惩清单」PDF 示例(Template)
Template1 页 A4 · 40 KB
联合奖惩清单 / 失信修复受理单版式。

输出规格
- PDF 页数
- 1
- 图表类型
- Template
- 模板行数
- 165
- 源码行数
- 128
Java 源码 · JQuickBiz166CreditRepairReceipt.java
以下代码即生成上方 PDF 的完整测试类,可直接复制运行;Maven 依赖见快速开始章节。
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Copyright (c) [2025-2099] Martin ([email protected])
*/
package com.github.paohaijiao.biz.gov;
import com.github.paohaijiao.config.JPdfConfig;
import com.github.paohaijiao.executor.JQuickPdfFactory;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 单据 166:联合奖惩清单 / 失信修复受理单(gov 领域第 12 项)。
*
* <p>本类为独立可运行 Demo:自带 {@code main} 方法、不依赖任何公共工具类或实体类,
* 数据以 key-value 形式通过 {@link JQuickPdfFactory#bindAll(Map)} 注入,
* 版式全部落在模板文件 {@code demo/biz/gov/166_credit_repair_receipt.txt} 中。</p>
*
* <p>视觉主题「紫棠·素雅·典式」:主色 #5B1EB1、辅色 #918C27、浅底 #F3F0F7;
* 版式为 classic 抬头 + strip 信息区 + light 明细表 + two 签章区 + plain 落款,
* 与同领域其它单据互不重样。</p>
*
* <p>联合奖惩清单 / 失信修复受理单:失信行为类别与认定文号、履行情况,</p>
* <p>逐项联合奖惩措施与执行状态、受理结论与办理时限、受理机关签章栏。</p>
*
* <p>运行后输出:{@code D:/test/pdf/166_credit_repair_receipt.pdf}。</p>
*
* @author Martin
* @version 1.0.0
*/
public class JQuickBiz166CreditRepairReceipt {
private static final String PDF_DIR = "D:/test/pdf/";
private static final String OUT_FILE = PDF_DIR + "166_credit_repair_receipt.pdf";
private static final String TEMPLATE = "demo/biz/gov/166_credit_repair_receipt.txt";
/** 模板固定明细行数,不足时补空行,避免占位符原样输出。 */
private static final int ITEM_ROWS = 6;
public static void main(String[] args) throws IOException {
new File(PDF_DIR).mkdirs();
// ---------- 1. 数据(无实体类,直接 bind)----------
String[][] items = {
{"1", "限制参与政府采购活动", "××市财政局", "惩戒", "已解除", "修复后解除"},
{"2", "限制取得政府供应土地", "××市自然资源和规划局", "惩戒", "已解除", "修复后解除"},
{"3", "纳入重点监管对象", "××市市场监督管理局", "惩戒", "已解除", "修复后解除"},
{"4", "金融机构信贷审慎参考", "××银保监分局", "惩戒", "参考类", "自行判断"},
{"5", "信用中国网站公示", "××市信用办", "惩戒", "已移除", "公示期满"},
{"6", "守信激励:绿色通道", "××市政务服务中心", "激励", "待申请", "修复后可申请"}
};
Map<String, Object> data = new LinkedHashMap<String, Object>();
data.put("acceptNo", "CRP-20261029-0077");
data.put("acceptDate", "2026年10月29日");
data.put("orgName", "××市社会信用体系建设领导小组办公室");
data.put("companyName", "××物资供应有限公司");
data.put("creditCode", "91320500MA1M8T3X7Y");
data.put("dishonestType", "一般失信行为(行政处罚类)");
data.put("recordNo", "××市监处罚〔2026〕118 号");
data.put("recordDate", "2026年04月18日");
data.put("performInfo", "罚款已缴纳,违法行为已整改完毕");
data.put("repairType", "信用修复(提前移除公示)");
data.put("acceptResult", "材料齐全,予以受理");
data.put("minPublicDate", "2026年10月18日");
data.put("timeLimit", "信用修复申请自受理之日起 15 个工作日内作出决定;符合条件的,终止公示并移除失信信息。");
data.put("remark", "申请主体须对提交材料的真实性负责;提供虚假材料的,记入信用记录并从重处理。");
data.put("acceptor", "苏见宁");
data.put("reviewer", "柳文渊");
data.put("companySign", "崔行知");
// 明细逐格展开
for (int i = 0; i < ITEM_ROWS; i++) {
int n = i + 1;
if (i >= items.length) {
data.put("itemName" + n, "—");
data.put("itemSpec" + n, "—");
data.put("itemUnit" + n, "—");
data.put("itemQty" + n, "—");
data.put("itemPrice" + n, "—");
data.put("itemAmount" + n, "—");
continue;
}
data.put("itemName" + n, items[i][0]);
data.put("itemSpec" + n, items[i][1]);
data.put("itemUnit" + n, items[i][2]);
data.put("itemQty" + n, items[i][3]);
data.put("itemPrice" + n, items[i][4]);
data.put("itemAmount" + n, items[i][5]);
}
// ---------- 2. 渲染 ----------
JPdfConfig config = new JPdfConfig();
config.getLayoutConfig().setFlexLayout(true);
config.getDoc().setMargins(Arrays.asList(44, 44, 44, 44));
config.getFontConfig().setDefaultFontName("Noto Sans CJK SC");
config.getHeaderConfig().setEnabled(true);
config.getHeaderConfig().setText("××市信用办 失信修复受理单 CRP-20261029-0077");
config.getHeaderConfig().setFontSize(8f);
config.getHeaderConfig().setHeight(34);
config.getFooterConfig().setEnabled(true);
config.getFooterConfig().setFontSize(8);
config.getFooterConfig().setPageNumberFormat("— %d —");
JQuickPdfFactory factory = new JQuickPdfFactory(config);
factory.bindAll(data);
byte[] pdf = factory.executeResource(TEMPLATE);
Files.write(new File(OUT_FILE).toPath(), pdf);
System.out.println("已生成:" + OUT_FILE + "(" + pdf.length + " 字节)");
}
}最小调用(3 行)
不想读完整测试类?核心就是这三行:绑定图表 SVG,执行模板,拿到 PDF 字节流。可直接复制到你的项目里。
// config 可省略;svg 来自 JChartRendererFactory.renderChart(...),见下方完整源码
byte[] pdf = new JQuickPdfFactory(config).executeResource("demo/biz/gov/166_credit_repair_receipt.txt");模板文件 · 166_credit_repair_receipt.txt
类 HTML + 内联 CSS 的模板语法,绑定数据后渲染为 PDF。下方为完整模板,可直接复制,也可下载原始文件。
<pdf>
<body>
// 166 联合奖惩清单 / 失信修复受理单(gov 领域第 12 项) 视觉主题:紫棠·素雅·典式
// 版式组合:抬头=classic 信息区=strip 明细表=light 段落=box 签章=two 落款=plain
// 主色 #5B1EB1 辅色 #918C27 浅底 #F3F0F7
// 联合奖惩清单与失信修复受理单:奖惩措施、实施部门、执行状态与修复时限。
// 抬头:classic
<h1 style="fontSize:18pt; bold:true; color:#400A8D; textAlignment:center; characterSpacing:6pt">'联合奖惩清单 / 失信修复受理单'</h1>
<p style="fontSize:7.5pt; color:#78838C; textAlignment:center; marginBottom:3px">'受理编号 '${acceptNo}' 受理日期 '${acceptDate}' 受理机关 '${orgName}</p>
<lineSeparator style="color:#5B1EB1; thickness:1.5f; marginBottom:8px"></lineSeparator>
// 信息区:grid2
<table style="width:100%; fontSize:8.5pt; marginBottom:8px">
<tr>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'受理编号 / NO.'</td>
<td style="width:34%; padding:4px; border:1px solid #C8BDD9">${acceptNo}</td>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'受理日期 / DATE'</td>
<td style="padding:4px; border:1px solid #C8BDD9">${acceptDate}</td>
</tr>
<tr>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'受理机关'</td>
<td style="width:34%; padding:4px; border:1px solid #C8BDD9">${orgName}</td>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'申请主体'</td>
<td style="padding:4px; border:1px solid #C8BDD9">${companyName}</td>
</tr>
<tr>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'统一社会信用代码'</td>
<td style="width:34%; padding:4px; border:1px solid #C8BDD9">${creditCode}</td>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'失信行为类别'</td>
<td style="padding:4px; border:1px solid #C8BDD9">${dishonestType}</td>
</tr>
<tr>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'原失信记录文号'</td>
<td style="width:34%; padding:4px; border:1px solid #C8BDD9">${recordNo}</td>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'失信认定日期'</td>
<td style="padding:4px; border:1px solid #C8BDD9">${recordDate}</td>
</tr>
<tr>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'已履行情况'</td>
<td style="width:34%; padding:4px; border:1px solid #C8BDD9">${performInfo}</td>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'修复申请类型'</td>
<td style="padding:4px; border:1px solid #C8BDD9">${repairType}</td>
</tr>
<tr>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'受理结论'</td>
<td style="width:34%; padding:4px; border:1px solid #C8BDD9">${acceptResult}</td>
<td style="width:16%; padding:4px; backgroundColor:#F3F0F7; bold:true; border:1px solid #C8BDD9">'最短公示期届满日'</td>
<td style="padding:4px; border:1px solid #C8BDD9">${minPublicDate}</td>
</tr>
</table>
<table style="width:100%; marginBottom:3px">
<tr>
<td style="padding:4px; backgroundColor:#F3F0F7; bold:true; fontSize:10pt; color:#400A8D">'联合奖惩措施清单'</td>
</tr>
</table>
<table style="width:100%; fontSize:8.5pt; marginBottom:8px">
<tr>
<th style="width:7%; padding:4px; backgroundColor:#F3F0F7; color:#400A8D; bold:true; textAlign:center; border:1px solid #C8BDD9">'序号'</th>
<th style="width:26%; padding:4px; backgroundColor:#F3F0F7; color:#400A8D; bold:true; textAlign:center; border:1px solid #C8BDD9">'奖惩措施名称'</th>
<th style="width:20%; padding:4px; backgroundColor:#F3F0F7; color:#400A8D; bold:true; textAlign:center; border:1px solid #C8BDD9">'实施部门'</th>
<th style="width:14%; padding:4px; backgroundColor:#F3F0F7; color:#400A8D; bold:true; textAlign:center; border:1px solid #C8BDD9">'措施类型'</th>
<th style="width:14%; padding:4px; backgroundColor:#F3F0F7; color:#400A8D; bold:true; textAlign:center; border:1px solid #C8BDD9">'执行状态'</th>
<th style="padding:4px; backgroundColor:#F3F0F7; color:#400A8D; bold:true; textAlign:center; border:1px solid #C8BDD9">'备注'</th>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemName1}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemSpec1}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemUnit1}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemQty1}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemPrice1}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemAmount1}</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemName2}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemSpec2}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemUnit2}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemQty2}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemPrice2}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemAmount2}</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemName3}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemSpec3}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemUnit3}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemQty3}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemPrice3}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemAmount3}</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemName4}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemSpec4}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemUnit4}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemQty4}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemPrice4}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemAmount4}</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemName5}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemSpec5}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemUnit5}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemQty5}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemPrice5}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemAmount5}</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemName6}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemSpec6}</td>
<td style="padding:4px; textAlign:left; border:1px solid #E1DFE5">${itemUnit6}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemQty6}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemPrice6}</td>
<td style="padding:4px; textAlign:center; border:1px solid #E1DFE5">${itemAmount6}</td>
</tr>
</table>
// 段落:box
<table style="width:100%; marginBottom:6px">
<tr>
<td style="width:150px; padding:5px; backgroundColor:#F3F0F7; bold:true; fontSize:9.5pt; color:#400A8D; border:1px solid #C8BDD9">'受理结论'</td>
<td style="padding:5px; fontSize:9pt; border:1px solid #C8BDD9">${acceptResult}</td>
</tr>
</table>
<table style="width:100%; marginBottom:6px">
<tr>
<td style="width:150px; padding:5px; backgroundColor:#F3F0F7; bold:true; fontSize:9.5pt; color:#400A8D; border:1px solid #C8BDD9">'办理时限'</td>
<td style="padding:5px; fontSize:9pt; border:1px solid #C8BDD9">${timeLimit}</td>
</tr>
</table>
<table style="width:100%; marginBottom:6px">
<tr>
<td style="width:150px; padding:5px; backgroundColor:#F3F0F7; bold:true; fontSize:9.5pt; color:#400A8D; border:1px solid #C8BDD9">'备注 / REMARKS'</td>
<td style="padding:5px; fontSize:9pt; border:1px solid #C8BDD9">${remark}</td>
</tr>
</table>
// 签章区:two
<!-- 签章占位区:后续加盖电子公章 / 骑缝章 / 打印二维码 -->
<table style="width:100%; fontSize:8pt; marginBottom:8px">
<tr>
<td style="width:50%; padding:4px; textAlign:center; color:#5B1EB1; border:1px dashed #5B1EB1">'(行政审批专用章 / 公章占位)'</td>
<td style="padding:4px; textAlign:center; color:#5B1EB1; border:1px dashed #5B1EB1">'(骑缝章 / 二维码占位)'</td>
</tr>
<tr>
<td style="width:50%; padding:4px; textAlign:center; color:#78838C; border:1px dashed #5B1EB1">'受理机关:'${orgName}</td>
<td style="padding:4px; textAlign:center; color:#78838C; border:1px dashed #5B1EB1">'骑缝章沿右边线骑缝加盖'</td>
</tr>
<tr>
<td style="width:50%; padding:4px; textAlign:center; color:#78838C; border:1px dashed #5B1EB1">'办结日期:'${acceptDate}</td>
<td style="padding:4px; textAlign:center; color:#78838C; border:1px dashed #5B1EB1">'二维码打印于右上角方框内'</td>
</tr>
</table>
// 落款:plain
<!-- 落款栏 -->
<table style="width:100%; fontSize:9pt; marginTop:6px">
<tr>
<td style="width:33%; padding:4px; color:#400A8D; borderBottom:1px solid #C8BDD9">'受理人:'${acceptor}</td>
<td style="width:33%; padding:4px; color:#400A8D; borderBottom:1px solid #C8BDD9">'审核人:'${reviewer}</td>
<td style="padding:4px; color:#400A8D; borderBottom:1px solid #C8BDD9">'申请主体签章:'${companySign}</td>
</tr>
</table>
</body>
</pdf>同分组示例
本页 PDF、预览图、模板与源码均由 JQuick-Pdf 真实运行产出,可自由复制到你的项目中使用。