跳转到内容

Java 生成「设备巡检报告单」PDF 示例(Template)

JQuick-Pdf场景 Demo

Template2 页 A4 · 52 KB

设备巡检记录表单版式,适合运维巡检留档。

下载 PDF 文件查看模板原始文件返回全部示例

设备巡检报告单 — Template
渲染效果

输出规格

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 真实运行产出,可自由复制到你的项目中使用。