Skip to content

Student transcript — generate this PDF with Java (Template)

JQuick-PdfScenario Demos

Template2 页 A4 · 37 KB

Student transcript table with course grades.

Download the PDFView raw template fileBack to all demos

Student transcript — Template
Rendered output

Output specs

PDF pages
2
Chart type
Template
Template lines
247
Source lines
160

Java source · JQuickBiz88Transcript.java

This is the complete test class that produced the PDF above — copy it and run as-is; see the quick-start section for the Maven dependency.

/*
 * 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.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;

public class JQuickBiz88Transcript {

    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 + "88_transcript.pdf";
    private static final String TEMPLATE = "report/biz/88_transcript.txt";

    /** 课程原始数据:名称 / 学分 / 成绩。 */
    private static final String[][] COURSES = {
            {"高等数学(下)", "5.0", "92"},
            {"线性代数", "3.0", "88"},
            {"概率论与数理统计", "3.0", "85"},
            {"数据结构", "4.0", "94"},
            {"操作系统", "4.0", "89"},
            {"计算机网络", "3.5", "86"},
            {"数据库原理", "3.5", "91"},
            {"Java 程序设计", "3.0", "96"},
            {"软件工程", "2.5", "83"},
            {"编译原理", "3.0", "76"},
            {"算法设计与分析", "3.0", "87"},
            {"大学英语(四)", "2.0", "82"},
            {"毛泽东思想概论", "2.0", "79"},
            {"体育(四)", "1.0", "90"},
            {"计算方法", "2.5", "81"},
            {"信息安全导论", "2.0", "88"},
            {"机器学习基础", "3.0", "93"},
            {"分布式系统", "2.5", "86"},
            {"专业英语", "2.0", "78"},
            {"生产实习", "3.0", "89"},
            {"毕业设计(开题)", "4.0", "85"}};

    public static void main(String[] args) throws IOException {
        mkdirs();
        generateSeal(IMG_DIR + "88_seal.png");

        Map<String, Object> data = new LinkedHashMap<String, Object>();
        data.put("studentName", "顾清和");
        data.put("studentNo", "20220101 0347");
        data.put("college", "计算机科学与技术学院");
        data.put("major", "软件工程(卓越工程师班)");
        data.put("term", "2025-2026 学年 第一学期");
        data.put("issueDate", "2026年10月19日");

        BigDecimal totalCredit = BigDecimal.ZERO;
        BigDecimal weighted = BigDecimal.ZERO;
        for (int i = 0; i < COURSES.length; i++) {
            String name = COURSES[i][0];
            BigDecimal credit = new BigDecimal(COURSES[i][1]);
            int score = Integer.parseInt(COURSES[i][2]);
            BigDecimal point = gradePoint(score);
            totalCredit = totalCredit.add(credit);
            weighted = weighted.add(credit.multiply(point));
            String remark = score < 60 ? "不及格" : (score >= 90 ? "优秀" : "");
            data.put("courseName" + (i + 1), name);
            data.put("courseCredit" + (i + 1), credit.toPlainString());
            data.put("courseScore" + (i + 1), String.valueOf(score));
            data.put("coursePoint" + (i + 1), point.toPlainString());
            data.put("courseRemark" + (i + 1), remark);
        }
        BigDecimal gpa = totalCredit.signum() == 0 ? BigDecimal.ZERO
                : weighted.divide(totalCredit, 2, RoundingMode.HALF_UP);
        data.put("totalCredit", totalCredit.toPlainString());
        data.put("gpa", gpa.toPlainString());

        JPdfConfig config = new JPdfConfig();
        config.getLayoutConfig().setFlexLayout(true);
        config.getDoc().setMargins(Arrays.asList(52, 52, 58, 52));
        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 BigDecimal gradePoint(int score) {
        if (score >= 90) {
            return new BigDecimal("4.0");
        } else if (score >= 85) {
            return new BigDecimal("3.7");
        } else if (score >= 82) {
            return new BigDecimal("3.3");
        } else if (score >= 78) {
            return new BigDecimal("3.0");
        } else if (score >= 75) {
            return new BigDecimal("2.7");
        } else if (score >= 72) {
            return new BigDecimal("2.3");
        } else if (score >= 68) {
            return new BigDecimal("2.0");
        } else if (score >= 64) {
            return new BigDecimal("1.5");
        } else if (score >= 60) {
            return new BigDecimal("1.0");
        }
        return BigDecimal.ZERO;
    }

    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, 15));
        g.drawString("××大学", size / 2 - 27, 62);
        g.setFont(new Font("Microsoft YaHei", Font.BOLD, 17));
        g.drawString("教务处", size / 2 - 27, size / 2 + 28);
        g.dispose();
        ImageIO.write(image, "png", new File(path));
    }
}

Minimal invocation (3 lines)

Skip the full test class — the core is these three lines: bind the chart SVG, execute the template, get the PDF bytes. Copy them straight into your project.

// config 可省略;svg 来自 JChartRendererFactory.renderChart(...),见下方完整源码
byte[] pdf = new JQuickPdfFactory(config).executeResource("report/biz/88_transcript.txt");

Template file · 88_transcript.txt

An HTML-like template with inline CSS that renders to PDF once bound to data. The full template is below — copy it or download the raw file.

<pdf>
<body>

  <h1 style="fontSize:14pt; bold:true; color:#1F4E79; textAlignment:center; characterSpacing:4pt">'××大学 教务管理系统'</h1>
  <h2 style="fontSize:19pt; bold:true; color:#1A2733; textAlignment:center; characterSpacing:6pt; marginTop:4px">'学 生 成 绩 单'</h2>
  <p style="fontSize:8.5pt; color:#5A6B7C; textAlignment:center; marginBottom:8px">'ACADEMIC TRANSCRIPT · '${term}</p>

  <table style="width:100%; fontSize:9pt">
    <tr>
      <td style="width:70px; padding:5px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8">'姓名'</td>
      <td style="width:120px; padding:5px; border:1px solid #C3CDD8">${studentName}</td>
      <td style="width:70px; padding:5px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8">'学号'</td>
      <td style="padding:5px; border:1px solid #C3CDD8">${studentNo}</td>
    </tr>
    <tr>
      <td style="padding:5px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8">'院系'</td>
      <td style="padding:5px; border:1px solid #C3CDD8">${college}</td>
      <td style="padding:5px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8">'专业'</td>
      <td style="padding:5px; border:1px solid #C3CDD8">${major}</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:7%">'序号'</th>
      <th style="padding:4px; backgroundColor:#1F4E79; color:white; textAlign:center; border:1px solid #1F4E79; width:45%">'课程名称'</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; width:10%">'成绩'</th>
      <th style="padding:4px; backgroundColor:#1F4E79; color:white; textAlign:center; border:1px solid #1F4E79; width:13%">'绩点'</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">${courseName1}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit1}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore1}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint1}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark1}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'2'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName2}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit2}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore2}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint2}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark2}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'3'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName3}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit3}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore3}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint3}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark3}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'4'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName4}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit4}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore4}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint4}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark4}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'5'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName5}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit5}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore5}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint5}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark5}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'6'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName6}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit6}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore6}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint6}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark6}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'7'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName7}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit7}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore7}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint7}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark7}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'8'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName8}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit8}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore8}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint8}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark8}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'9'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName9}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit9}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore9}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint9}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark9}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'10'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName10}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit10}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore10}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint10}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark10}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'11'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName11}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit11}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore11}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint11}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark11}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'12'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName12}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit12}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore12}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint12}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark12}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'13'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName13}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit13}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore13}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint13}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark13}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'14'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName14}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit14}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore14}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint14}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark14}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'15'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName15}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit15}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore15}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint15}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark15}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'16'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName16}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit16}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore16}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint16}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark16}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'17'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName17}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit17}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore17}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint17}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark17}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'18'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName18}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit18}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore18}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint18}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark18}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'19'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName19}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit19}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore19}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint19}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark19}</td>
    </tr>
    <tr>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">'20'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName20}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit20}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore20}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint20}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark20}</td>
    </tr>
  </table>

  <areaBreak></areaBreak>

  <!-- 成绩表:第 2 页(第 21 门 + 汇总) -->
  <p style="fontSize:8.5pt; color:#5A6B7C; marginBottom:4px">${studentName}' '${studentNo}' (续表)'</p>
  <table style="width:100%; fontSize:8.5pt">
    <tr>
      <th style="padding:4px; backgroundColor:#1F4E79; color:white; textAlign:center; border:1px solid #1F4E79; width:7%">'序号'</th>
      <th style="padding:4px; backgroundColor:#1F4E79; color:white; textAlign:center; border:1px solid #1F4E79; width:45%">'课程名称'</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; width:10%">'成绩'</th>
      <th style="padding:4px; backgroundColor:#1F4E79; color:white; textAlign:center; border:1px solid #1F4E79; width:13%">'绩点'</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">'21'</td>
      <td style="padding:4px; border:1px solid #C3CDD8">${courseName21}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseCredit21}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseScore21}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${coursePoint21}</td>
      <td style="padding:4px; textAlign:center; border:1px solid #C3CDD8">${courseRemark21}</td>
    </tr>
  </table>

  <table style="width:100%; fontSize:9pt; marginTop:4px">
    <tr>
      <td style="padding:6px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8; width:120px">'总学分'</td>
      <td style="padding:6px; border:1px solid #C3CDD8; width:110px">${totalCredit}</td>
      <td style="padding:6px; backgroundColor:#E8EDF2; bold:true; border:1px solid #C3CDD8; width:120px">'平均绩点 GPA'</td>
      <td style="padding:6px; border:1px solid #C3CDD8; bold:true; color:#B71C1C">${gpa}</td>
    </tr>
  </table>

  <div style="borderLeft:3px solid #2F5597; backgroundColor:#F7F9FC; padding:6px 8px; marginTop:8px">
    <p style="fontSize:8pt; color:#5A6B7C">'绩点换算:90 分及以上 4.0;85-89 为 3.7;82-84 为 3.3;78-81 为 3.0;75-77 为 2.7;72-74 为 2.3;68-71 为 2.0;64-67 为 1.5;60-63 为 1.0;60 分以下为 0。'</p>
    <p style="fontSize:8pt; color:#5A6B7C">'GPA = Σ(学分 × 绩点) / Σ学分,计算结果四舍五入保留两位小数。'</p>
  </div>

  <div style="display:flex; justifyContent:space-between; marginTop:16px">
    <div style="width:250px">
      <p style="fontSize:8.5pt; color:#8a939b">'本成绩单由教务管理系统生成,加盖教务处公章后生效。'</p>
      <p style="fontSize:8.5pt; color:#8a939b; marginTop:3px">'打印日期:'${issueDate}</p>
      <p style="fontSize:8.5pt; color:#8a939b; marginTop:3px">'校验码:EDU-'${studentNo}'-'${term}</p>
    </div>
    <div style="width:180px; textAlignment:center">
      <image src='D:/test/image/88_seal.png' style="width:96px; height:96px"></image>
      <p style="fontSize:9pt; bold:true; color:#1A2733; textAlignment:center">'××大学教务处'</p>
      <p style="fontSize:9pt; color:#333333; textAlignment:center">${issueDate}</p>
    </div>
  </div>

</body>
</pdf>

More demos in this group

The PDF, preview image, template and source code on this page were all produced by a real JQuick-Pdf run and are free to copy into your own project.