Java 生成「设备巡检报告单」PDF 示例(Template)
Template2 页 A4 · 52 KB
设备巡检记录表单版式,适合运维巡检留档。

输出规格
- PDF 页数
- 2
- 图表类型
- Template
- 模板行数
- 216
- 源码行数
- 129
Java 源码 · JQuickBiz83EquipmentInspection.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.scenario;
import com.github.paohaijiao.config.JPdfConfig;
import com.github.paohaijiao.executor.JQuickPdfFactory;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
public class JQuickBiz83EquipmentInspection {
private static final String PDF_DIR = "D:/test/pdf/";
private static final String IMG_DIR = "D:/test/image/";
private static final String OUT_FILE = PDF_DIR + "83_equipment_inspection.pdf";
private static final String TEMPLATE = "report/biz/83_equipment_inspection.txt";
public static void main(String[] args) throws IOException {
mkdirs();
generateSeal(IMG_DIR + "83_seal.png");
// 巡检项:名称 / 判定标准 / 状态 / 备注
String[][] items = {
{"外观检查", "无变形、无锈蚀、铭牌清晰", "正常", ""},
{"运行电流", "不超过额定电流 110%", "正常", "实测 86A / 额定 92A"},
{"三相电压平衡", "不平衡度 ≤ 2%", "正常", "实测 0.8%"},
{"轴承温度", "≤ 75℃", "异常", "后轴承 82℃,偏高"},
{"绕组温度", "≤ 105℃", "正常", "78℃"},
{"振动值", "≤ 4.5 mm/s", "异常", "水平方向 5.2 mm/s"},
{"润滑油位", "在上下限之间", "正常", ""},
{"密封状况", "无渗漏", "异常", "轴端轻微渗油"},
{"冷却风扇", "运转正常无异响", "正常", ""},
{"接地电阻", "≤ 4Ω", "正常", "1.8Ω"},
{"控制柜清洁", "无积尘、无虫害", "正常", ""},
{"接线端子", "紧固无松动、无过热变色", "正常", ""},
{"绝缘电阻", "≥ 0.5MΩ", "正常", "12MΩ"},
{"接触器动作", "吸合可靠、无粘连", "正常", ""},
{"热继电器整定", "与电机铭牌匹配", "正常", "整定 95A"},
{"变频器参数", "与运行工况一致", "正常", ""},
{"安全防护罩", "完整、固定可靠", "正常", ""},
{"急停按钮", "动作有效", "正常", "现场测试"},
{"仪表显示", "数值正常、无报警", "正常", ""},
{"运行声音", "无异常噪音", "正常", ""}};
int abnormal = 0;
for (String[] item : items) {
if ("异常".equals(item[2])) {
abnormal++;
}
}
Map<String, Object> data = new LinkedHashMap<String, Object>();
data.put("inspectionNo", "XJ-2026-1019-0286");
data.put("equipmentNo", "SB-DJ-0012");
data.put("equipmentName", "三相异步电动机(循环水泵驱动)");
data.put("location", "动力站房 B 区 3# 泵组");
data.put("inspectDate", "2026年10月19日 09:20");
data.put("inspector", "李伟");
data.put("reviewer", "张建军");
data.put("totalCount", items.length);
data.put("abnormalCount", abnormal);
data.put("abnormalLine1", "1. 后轴承温度 82℃,超出 75℃ 判定标准,怀疑润滑脂老化,建议 24 小时内补充或更换润滑脂。");
data.put("abnormalLine2", "2. 水平方向振动值 5.2 mm/s,超出 4.5 mm/s 限值,需复测联轴器对中情况。");
data.put("abnormalLine3", "3. 轴端轻微渗油,暂不影响运行,列入下周保养计划处理。");
// 巡检项逐行 bind:itemRow1~itemRow20
for (int i = 0; i < items.length; i++) {
data.put("itemRow" + (i + 1), items[i][0] + " " + items[i][1] + " " + items[i][2]);
}
JPdfConfig config = new JPdfConfig();
config.getLayoutConfig().setFlexLayout(true);
config.getDoc().setMargins(Arrays.asList(46, 48, 55, 48));
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);
FileOutputStream out = new FileOutputStream(OUT_FILE);
out.write(pdf);
out.close();
System.out.println("已生成:" + OUT_FILE);
}
private static void mkdirs() {
new File(PDF_DIR).mkdirs();
new File(IMG_DIR).mkdirs();
}
private static void generateSeal(String path) throws IOException {
int size = 200;
BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Color red = new Color(0xC6, 0x28, 0x28);
g.setColor(red);
g.setStroke(new BasicStroke(6f));
g.drawOval(8, 8, size - 16, size - 16);
g.setFont(new Font("Microsoft YaHei", Font.BOLD, 20));
g.drawString("巡检专用章", size / 2 - 52, size / 2 + 8);
g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 11));
g.drawString("2026-10-19", size / 2 - 30, size / 2 + 34);
g.dispose();
ImageIO.write(image, "png", new File(path));
}
}最小调用(3 行)
不想读完整测试类?核心就是这三行:绑定图表 SVG,执行模板,拿到 PDF 字节流。可直接复制到你的项目里。
// config 可省略;svg 来自 JChartRendererFactory.renderChart(...),见下方完整源码
byte[] pdf = new JQuickPdfFactory(config).executeResource("report/biz/83_equipment_inspection.txt");模板文件 · 83_equipment_inspection.txt
类 HTML + 内联 CSS 的模板语法,绑定数据后渲染为 PDF。下方为完整模板,可直接复制,也可下载原始文件。
<pdf>
<body>
<!-- 页头 -->
<div style="display:flex; justifyContent:space-between; borderBottom:2px solid #1F4E79; paddingBottom:6px; marginBottom:8px">
<div style="width:320px">
<h1 style="fontSize:17pt; bold:true; color:#1F4E79; characterSpacing:3pt">'设备巡检报告单'</h1>
<p style="fontSize:8.5pt; color:#5A6B7C">'设备巡检管理系统 · 自动生成'</p>
</div>
<div style="width:180px; textAlignment:right">
<p style="fontSize:8.5pt; color:#5A6B7C">'巡检单号'</p>
<p style="fontSize:9.5pt; bold:true; color:#1A2733">${inspectionNo}</p>
</div>
</div>
<!-- 基本信息 -->
<table style="width:100%; fontSize:9pt">
<tr>
<td style="width:78px; padding:5px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8">'设备编号'</td>
<td style="padding:5px; border:1px solid #C3CDD8">${equipmentNo}</td>
<td style="width:78px; padding:5px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8">'设备名称'</td>
<td style="padding:5px; border:1px solid #C3CDD8">${equipmentName}</td>
</tr>
<tr>
<td style="padding:5px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8">'巡检地点'</td>
<td style="padding:5px; border:1px solid #C3CDD8">${location}</td>
<td style="padding:5px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8">'巡检日期'</td>
<td style="padding:5px; border:1px solid #C3CDD8">${inspectDate}</td>
</tr>
<tr>
<td style="padding:5px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8">'巡检人'</td>
<td style="padding:5px; border:1px solid #C3CDD8">${inspector}</td>
<td style="padding:5px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8">'审核人'</td>
<td style="padding:5px; border:1px solid #C3CDD8">${reviewer}</td>
</tr>
</table>
<!-- 巡检项目表:第 1 页(1~20 项) -->
<table style="width:100%; fontSize:8.5pt; marginTop:6px">
<tr>
<th style="padding:4px; backgroundColor:#1F4E79; color:white; textAlign:center; border:1px solid #1F4E79; width:6%">'序号'</th>
<th style="padding:4px; backgroundColor:#1F4E79; color:white; textAlign:center; border:1px solid #1F4E79; width:25%">'检查项'</th>
<th style="padding:4px; backgroundColor:#1F4E79; color:white; textAlign:center; border:1px solid #1F4E79; width:36%">'判定标准'</th>
<th style="padding:4px; backgroundColor:#1F4E79; color:white; textAlign:center; border:1px solid #1F4E79; width:10%">'状态'</th>
<th style="padding:4px; backgroundColor:#1F4E79; color:white; textAlign:center; border:1px solid #1F4E79">'备注'</th>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'1'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'外观检查'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'无变形、无锈蚀、铭牌清晰'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8"></td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'2'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'运行电流'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'不超过额定电流 110%'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'实测 86A / 额定 92A'</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'3'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'三相电压平衡'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'不平衡度 ≤ 2%'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'实测 0.8%'</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'4'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'轴承温度'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'≤ 75℃'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#B71C1C; border:1px solid #C3CDD8">'异常'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'后轴承 82℃,偏高'</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'5'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'绕组温度'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'≤ 105℃'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'78℃'</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'6'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'振动值'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'≤ 4.5 mm/s'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#B71C1C; border:1px solid #C3CDD8">'异常'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'水平方向 5.2 mm/s'</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'7'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'润滑油位'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'在上下限之间'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8"></td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'8'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'密封状况'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'无渗漏'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#B71C1C; border:1px solid #C3CDD8">'异常'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'轴端轻微渗油'</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'9'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'冷却风扇'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'运转正常无异响'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8"></td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'10'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'接地电阻'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'≤ 4Ω'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'1.8Ω'</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'11'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'控制柜清洁'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'无积尘、无虫害'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8"></td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'12'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'接线端子'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'紧固无松动、无过热变色'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8"></td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'13'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'绝缘电阻'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'≥ 0.5MΩ'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'12MΩ'</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'14'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'接触器动作'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'吸合可靠、无粘连'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8"></td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'15'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'热继电器整定'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'与电机铭牌匹配'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'整定 95A'</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'16'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'变频器参数'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'与运行工况一致'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8"></td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'17'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'安全防护罩'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'完整、固定可靠'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8"></td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'18'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'急停按钮'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'动作有效'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'现场测试'</td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'19'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'仪表显示'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'数值正常、无报警'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8"></td>
</tr>
<tr>
<td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'20'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'运行声音'</td>
<td style="padding:4px; border:1px solid #C3CDD8">'无异常噪音'</td>
<td style="padding:4px; textAlign:center; bold:true; color:#1B5E20; border:1px solid #C3CDD8">'正常'</td>
<td style="padding:4px; border:1px solid #C3CDD8"></td>
</tr>
</table>
<!-- 异常情况描述 -->
<div style="borderLeft:4px solid #B71C1C; backgroundColor:#FFF5F5; padding:7px 9px; marginTop:10px">
<p style="fontSize:9pt; bold:true; color:#B71C1C; marginBottom:3px">'异常情况描述'</p>
<p style="fontSize:9pt; color:#333333; marginBottom:2px">${abnormalLine1}</p>
<p style="fontSize:9pt; color:#333333; marginBottom:2px">${abnormalLine2}</p>
<p style="fontSize:9pt; color:#333333; marginBottom:2px">${abnormalLine3}</p>
</div>
<!-- 结论 -->
<p style="fontSize:9pt; color:#333333; marginTop:8px">'巡检结论:本次共检查 '${totalCount}' 项,其中异常 '${abnormalCount}' 项,设备整体运行状态可接受,异常项已下发整改单。'</p>
<!-- 签字 + 印章 -->
<div style="display:flex; justifyContent:space-between; marginTop:18px">
<div style="width:180px; borderTop:1px solid #5A6B7C; paddingTop:4px">
<p style="fontSize:9pt; color:#5A6B7C; textAlignment:center">'巡检人(签字):'${inspector}</p>
</div>
<div style="width:180px; borderTop:1px solid #5A6B7C; paddingTop:4px">
<p style="fontSize:9pt; color:#5A6B7C; textAlignment:center">'审核人(签字):'${reviewer}</p>
</div>
<div style="width:140px; textAlignment:center">
<image src='D:/test/image/83_seal.png' style="width:86px; height:86px"></image>
<p style="fontSize:8pt; color:#B71C1C; textAlignment:center">'巡检专用章'</p>
</div>
</div>
</body>
</pdf>同分组示例
本页 PDF、预览图、模板与源码均由 JQuick-Pdf 真实运行产出,可自由复制到你的项目中使用。