haogh 6 сар өмнө
parent
commit
702b35c294

+ 2 - 1
sql/update.sql

@@ -153,4 +153,5 @@ INSERT INTO `frame_res`(`RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`,
 
 
 -- 2024-12-04
-ALTER TABLE `sc_score_ym` ADD COLUMN `REVIEW_LOG_FILE` varchar(255) NULL COMMENT '成绩复核日志文件' AFTER `EMS_NO`;
+ALTER TABLE `sc_score_ym` ADD COLUMN `REVIEW_LOG_FILE` varchar(255) NULL COMMENT '成绩复核日志文件' AFTER `EMS_NO`;
+ALTER TABLE `sc_score_ym` ADD COLUMN `RECOVERY_TIME` varchar(20) NULL COMMENT '复核回复时间' AFTER `REVIEW_LOG_FILE`;

+ 25 - 4
src/cn/hmsoft/art/control/score/ScoreYmControl.java

@@ -312,16 +312,37 @@ public class ScoreYmControl extends ArtControl {
 		// 单个生成
 		if(StringHelper.isNotEmpty(cert_id)) {
 			String sql =
-					"SELECT cs.std_name,r.std_sex,cs.cert_id,cs.aspect_name,cs.ticket_no,p.province_name,remark, cs.batch,cs.ems_no FROM sc_score_ym cs,std_reg r,cf_enrol_province p"
-							+ " where cs.std_id=r.std_id AND r.std_province=p.PROVINCE_ID AND WEI_GUI='是' and cs.cert_id=? and cs.aspect_name=? and cs.batch=? ";
+					"SELECT cs.std_name,r.std_sex,cs.cert_id,cs.aspect_name,cs.ticket_no,p.province_name,remark, cs.batch,cs.ems_no,r.exam_id,"
+							+ " cs.subject_name_1,cs.aspect_qualified,r.std_id,cs.apply_msg,cs.check_flag,cs.check_note,cs.recovery_time  "
+							+ " FROM sc_score_ym cs,std_reg r,cf_enrol_province p where cs.std_id=r.std_id AND r.std_province=p.PROVINCE_ID "
+							+ " AND WEI_GUI='是' and cs.cert_id=? and cs.aspect_name=? and cs.batch=? ";
 			ScScoreYm scScoreYm = scoreYmDao.findBySql(sql, cert_id, aspect_name, batch);
 			File file = DecisionHelper.makeReviewLog(scoreYmDao, scScoreYm);
 			this.downloadFile(file, file.getName());
 			return new Ajax();
 		} else { //批量生成
-
+			FrameThread thread = FrameThreadHelper.createThread("成绩复核日志", "生成成绩复核日志开始:准备数据......",
+					FrameThreadCallbackType.Swal, "成绩复核日志已全部生成", this.getFrameOptr());
+			new Thread(() -> {
+				String sql =
+						"SELECT cs.std_name,r.std_sex,cs.cert_id,cs.aspect_name,cs.ticket_no,p.province_name,remark, cs.batch,cs.ems_no,r.exam_id,"
+								+ " cs.subject_name_1,cs.aspect_qualified,r.std_id,cs.apply_msg,cs.check_flag,cs.check_note,cs.recovery_time  "
+								+ " FROM sc_score_ym cs,std_reg r,cf_enrol_province p where cs.std_id=r.std_id AND r.std_province=p.PROVINCE_ID AND WEI_GUI='是'";
+				List<ScScoreYm> scoreList = daoStd.listBySql(ScScoreYm.class, sql);
+				int speed = 1;
+				FrameThreadHelper.updateThread(thread, speed, "一共有【" + scoreList.size() + "】个成绩复核日志需要生成", FrameThreadStatus.Running);
+				for (ScScoreYm scScoreYm : scoreList) {
+					DecisionHelper.makeReviewLog(scoreYmDao, scScoreYm);
+					speed++;
+					if (speed % 10 == 0) {
+						FrameThreadHelper.updateThread(thread, speed * 100 / scoreList.size(), "生成了【" + speed + "】个成绩复核日志",
+								FrameThreadStatus.Running);
+					}
+				}
+				FrameThreadHelper.completeThread(thread, "生成成功");
+			}).start();
+			return new Ajax(thread);
 		}
-		return new Ajax();
 	}
 
 

+ 30 - 1
src/cn/hmsoft/art/data/model/sc/ScScoreYm.java

@@ -34,6 +34,8 @@ public class ScScoreYm implements Serializable,Comparable<ScScoreYm> {
 	private String remark;//备注
 	private String ems_no;//复试ems单号
 	private String review_log_file;
+	private String apply_msg;
+	private String recovery_time;
 	
 	public Integer getStd_id() {
 		return std_id;
@@ -155,7 +157,23 @@ public class ScScoreYm implements Serializable,Comparable<ScScoreYm> {
 	public void setWei_gui(String wei_gui) {
 		this.wei_gui = wei_gui;
 	}
-	
+
+	public String getApply_msg() {
+		return apply_msg;
+	}
+
+	public void setApply_msg(String apply_msg) {
+		this.apply_msg = apply_msg;
+	}
+
+	public String getRecovery_time() {
+		return recovery_time;
+	}
+
+	public void setRecovery_time(String recovery_time) {
+		this.recovery_time = recovery_time;
+	}
+
 	@Override
 	public int compareTo(ScScoreYm o) {
 		String oScore = o.getAspect_score();
@@ -204,6 +222,9 @@ public class ScScoreYm implements Serializable,Comparable<ScScoreYm> {
 
 	protected String province_name; //考生所在省份
 
+	protected String exam_id; //考生号
+
+
 	public String getStd_sex() {
 		return std_sex;
 	}
@@ -219,4 +240,12 @@ public class ScScoreYm implements Serializable,Comparable<ScScoreYm> {
 	public void setProvince_name(String province_name) {
 		this.province_name = province_name;
 	}
+
+	public String getExam_id() {
+		return exam_id;
+	}
+
+	public void setExam_id(String exam_id) {
+		this.exam_id = exam_id;
+	}
 }

+ 88 - 29
src/cn/hmsoft/art/enrol/business/decision/DecisionHelper.java

@@ -4,13 +4,24 @@ import cn.hmsoft.application.SpringHelper;
 import cn.hmsoft.art.constants.StdMaterialType;
 import cn.hmsoft.art.data.dao.sc.ScScoreYmDao;
 import cn.hmsoft.art.data.model.sc.ScScoreYm;
+import cn.hmsoft.art.data.model.std.StdLog;
 import cn.hmsoft.art.enrol.helper.EnrolMaterialHelper;
 import cn.hmsoft.art.helper.ArtParamHelper;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.helper.LocalDateHelper;
+import cn.hmsoft.helper.StringHelper;
 import cn.hmsoft.helper.pdf.ItextPdfHelper;
+import cn.hmsoft.helper.pdf.PdfHeaderFooterEvent;
 import cn.hmsoft.log.LogHelper;
 import com.itextpdf.io.font.PdfEncodings;
+import com.itextpdf.kernel.events.PdfDocumentEvent;
 import com.itextpdf.kernel.font.PdfFont;
 import com.itextpdf.kernel.font.PdfFontFactory;
+import com.itextpdf.kernel.geom.PageSize;
+import com.itextpdf.kernel.pdf.EncryptionConstants;
+import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfWriter;
+import com.itextpdf.kernel.pdf.WriterProperties;
 import com.itextpdf.layout.Document;
 import com.itextpdf.layout.element.Cell;
 import com.itextpdf.layout.element.Paragraph;
@@ -21,6 +32,7 @@ import com.itextpdf.layout.property.TextAlignment;
 import com.itextpdf.layout.property.VerticalAlignment;
 
 import java.io.File;
+import java.util.List;
 
 /**
  * @Description 中央美术学院-违规处理决定书生成帮助类
@@ -137,9 +149,18 @@ public abstract class DecisionHelper {
             file.delete();
 
         Document doc = null;
+
+        //成绩查询日志List
+        List<StdLog> logList = scoreYmDao.listBySql(StdLog.class,"select * from std_log where log_type='ScoreQuery' and std_id=? order by log_time",
+                score.getStd_id());
+        StdLog searchLog = null;
+        if(logList != null && !logList.isEmpty()) {
+            searchLog = logList.get(0);
+        }
         try {
             // 设置密码
-            doc = ItextPdfHelper.createPdf(file, "hmosft_" + ArtParamHelper.SchoolCode);
+            //doc = ItextPdfHelper.createPdf(file, "hmosft_" + ArtParamHelper.SchoolCode);
+            doc = createPdf(file,  PageSize.A4, "hmosft_" + ArtParamHelper.SchoolCode);
 
             doc.setBorder(null);
             doc.setMargins(30, 50, 30, 50);
@@ -175,14 +196,14 @@ public abstract class DecisionHelper {
             stdTable.addCell(new Cell(1, 1).add("生  源  地:").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.RIGHT).setTextAlignment(TextAlignment.RIGHT)
                     .setMarginTop(5).setMarginBottom(5));
-            stdTable.addCell(new Cell(1, 1).add(score.getStd_name()).setFontSize(fontSize)
+            stdTable.addCell(new Cell(1, 1).add(score.getProvince_name()).setFontSize(fontSize)
                     .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
 
             // 考生号
             stdTable.addCell(new Cell(1, 1).add("考  生  号:").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.RIGHT).setTextAlignment(TextAlignment.RIGHT)
                     .setMarginTop(5).setMarginBottom(5));
-            stdTable.addCell(new Cell(1, 1).add(score.getCert_id()).setFontSize(fontSize)
+            stdTable.addCell(new Cell(1, 1).add(score.getExam_id()).setFontSize(fontSize)
                     .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
 
             // 报考专业
@@ -196,7 +217,7 @@ public abstract class DecisionHelper {
             stdTable.addCell(new Cell(1, 1).add("考试科目:").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.RIGHT).setTextAlignment(TextAlignment.RIGHT)
                     .setMarginTop(5).setMarginBottom(5));
-            stdTable.addCell(new Cell(1, 1).add(" ").setFontSize(fontSize)
+            stdTable.addCell(new Cell(1, 1).add(score.getSubject_name_1()).setFontSize(fontSize)
                     .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
 
             // 准考证号
@@ -219,27 +240,30 @@ public abstract class DecisionHelper {
             doc.add(p1.setMarginTop(15f));
 
             Table scoreTable = new Table(new float[] { 2, 6}).setWidthPercent(100).setBorder(null);
-
+            float lineHeight = 35f;
             //成绩查询结果
             scoreTable.addCell(new Cell(1, 1).add("成绩查询结果").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER)
-                    .setMarginTop(5).setMarginBottom(5));
-            scoreTable.addCell(new Cell(1, 1).add(" ").setFontSize(fontSize)
-                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
+                    .setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
+            scoreTable.addCell(new Cell(1, 1).add(searchLog != null ? score.getAspect_qualified() : "").setFontSize(fontSize)
+                    .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER)
+                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
 
             //成绩查询时间
             scoreTable.addCell(new Cell(1, 1).add("成绩查询时间").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER)
-                    .setMarginTop(5).setMarginBottom(5));
-            scoreTable.addCell(new Cell(1, 1).add(" ").setFontSize(fontSize)
-                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
+                    .setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
+            scoreTable.addCell(new Cell(1, 1).add(searchLog != null ? LocalDateHelper.format(searchLog.getLog_time()) : "").setFontSize(fontSize)
+                    .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER)
+                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
 
             //查询IP地址
             scoreTable.addCell(new Cell(1, 1).add("查询IP地址").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER)
-                    .setMarginTop(5).setMarginBottom(5));
-            scoreTable.addCell(new Cell(1, 1).add(" ").setFontSize(fontSize)
-                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
+                    .setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
+            scoreTable.addCell(new Cell(1, 1).add(searchLog != null ? searchLog.getLog_value() : "").setFontSize(fontSize)
+                    .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER)
+                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
 
             doc.add(scoreTable);
 
@@ -252,23 +276,26 @@ public abstract class DecisionHelper {
             //陈述申辩内容
             scoreTable.addCell(new Cell(1, 1).add("陈述申辩内容").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER)
-                    .setMarginTop(5).setMarginBottom(5));
-            scoreTable.addCell(new Cell(1, 1).add(" ").setFontSize(fontSize)
-                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
+                    .setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
+            scoreTable.addCell(new Cell(1, 1).add(score.getApply_msg() != null ? score.getApply_msg() : "").setFontSize(fontSize)
+                    .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER)
+                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
 
             //陈述申辩时间
             scoreTable.addCell(new Cell(1, 1).add("陈述申辩时间").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER)
-                    .setMarginTop(5).setMarginBottom(5));
-            scoreTable.addCell(new Cell(1, 1).add(" ").setFontSize(fontSize)
-                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
+                    .setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
+            scoreTable.addCell(new Cell(1, 1).add(score.getCheck_flag() != null ? score.getCheck_flag() : "").setFontSize(fontSize)
+                    .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER)
+                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
 
             //陈辩IP地址
             scoreTable.addCell(new Cell(1, 1).add("陈辩IP地址").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER)
-                    .setMarginTop(5).setMarginBottom(5));
-            scoreTable.addCell(new Cell(1, 1).add(" ").setFontSize(fontSize)
-                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
+                    .setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
+            scoreTable.addCell(new Cell(1, 1).add(score.getEms_no() != null ? score.getEms_no() : "").setFontSize(fontSize)
+                    .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER)
+                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
 
             doc.add(scoreTable);
 
@@ -280,16 +307,18 @@ public abstract class DecisionHelper {
             //复核结论答复
             scoreTable.addCell(new Cell(1, 1).add("复核结论答复").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER)
-                    .setMarginTop(5).setMarginBottom(5));
-            scoreTable.addCell(new Cell(1, 1).add(" ").setFontSize(fontSize)
-                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
+                    .setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
+            scoreTable.addCell(new Cell(1, 1).add(score.getCheck_note() != null ? score.getCheck_note() : "").setFontSize(fontSize)
+                    .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER)
+                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
 
             //复核答复时间
             scoreTable.addCell(new Cell(1, 1).add("复核答复时间").setFontSize(fontSize)
                     .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER)
-                    .setMarginTop(5).setMarginBottom(5));
-            scoreTable.addCell(new Cell(1, 1).add(" ").setFontSize(fontSize)
-                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5));
+                    .setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
+            scoreTable.addCell(new Cell(1, 1).add(score.getRecovery_time() != null ? score.getRecovery_time() : "").setFontSize(fontSize)
+                    .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER)
+                    .setMarginLeft(10).setMarginTop(5).setMarginBottom(5).setHeight(lineHeight));
 
             doc.add(scoreTable);
 
@@ -298,6 +327,9 @@ public abstract class DecisionHelper {
 
             ItextPdfHelper.closePdf(doc);
 
+            //更新文件路径
+            String sql = "update sc_score_ym set review_log_file=? where cert_id=? and aspect_name=? and batch=? ";
+            scoreYmDao.updateBySql(sql, file_name, score.getCert_id(), score.getAspect_name(), score.getBatch());
 
         } catch (Exception e) {
             LogHelper.error(e.getMessage());
@@ -310,4 +342,31 @@ public abstract class DecisionHelper {
         }
         return file;
     }
+
+    public static Document createPdf(File file, PageSize pageSize, String passwd) {
+        PdfDocument pdfDoc;
+        Document doc;
+        try {
+
+            if (StringHelper.isNotEmpty(passwd))
+                pdfDoc = new PdfDocument(
+                        new PdfWriter(
+                                file.getPath(),
+                                new WriterProperties().setStandardEncryption(
+                                        null,
+                                        passwd.getBytes(),
+                                        EncryptionConstants.ALLOW_PRINTING,
+                                        EncryptionConstants.ENCRYPTION_AES_128
+                                                | EncryptionConstants.DO_NOT_ENCRYPT_METADATA)));
+            else
+                pdfDoc = new PdfDocument(new PdfWriter(file.getPath()));
+            // 添加页码
+            PdfHeaderFooterEvent event = new PdfHeaderFooterEvent();
+            pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, event);
+            doc = new Document(pdfDoc, pageSize);
+            return doc;
+        } catch (Exception e) {
+            throw new BusinessException("无法创建临时文件,请联系系统管理员!");
+        }
+    }
 }

+ 108 - 0
src/cn/hmsoft/helper/pdf/PdfHeaderFooterEvent.java

@@ -0,0 +1,108 @@
+package cn.hmsoft.helper.pdf;
+
+import cn.hmsoft.log.LogHelper;
+import com.itextpdf.kernel.color.Color;
+import com.itextpdf.kernel.events.Event;
+import com.itextpdf.kernel.events.IEventHandler;
+import com.itextpdf.kernel.events.PdfDocumentEvent;
+import com.itextpdf.kernel.geom.PageSize;
+import com.itextpdf.kernel.geom.Rectangle;
+import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfPage;
+import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
+import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
+import com.itextpdf.layout.Canvas;
+import com.itextpdf.layout.Document;
+import com.itextpdf.layout.border.Border;
+import com.itextpdf.layout.element.Cell;
+import com.itextpdf.layout.element.Paragraph;
+import com.itextpdf.layout.element.Table;
+import com.itextpdf.layout.property.HorizontalAlignment;
+import com.itextpdf.layout.property.TextAlignment;
+import com.itextpdf.layout.property.VerticalAlignment;
+
+/**
+ *  生成pdf添加页码
+ */
+public class PdfHeaderFooterEvent implements IEventHandler {
+
+    //总页码使用的模板对象
+    public PdfFormXObject totalNumTemplate = null ;
+
+
+    @Override
+    public void handleEvent(Event event) {
+        final PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
+        final PdfDocument pdfDoc = docEvent.getDocument();
+        final Document doc = new Document(pdfDoc);
+        final PdfPage page = docEvent.getPage();
+        final Rectangle pageSize = page.getPageSize();
+//        final int pageNumber = pdfDoc.getPageNumber(page);
+        final float pdfHeight = pageSize.getHeight();
+
+        try{
+            this.addPageFooter(doc, pdfDoc, page, pdfHeight);
+        }catch(Exception e){
+            LogHelper.error("添加页脚出错", e);
+        }
+
+    }
+
+    /**
+     *  在页眉添加页码
+     * @param document 文档
+     * @param pdfHeight 文档的高度
+     * @param pageNumber 页数
+     */
+    private void addPageHeader(Document document, float pdfHeight, int pageNumber) {
+        //创建字体
+        float width = PageSize.A4.getWidth() - 60;
+        //表格 一行两列
+        Table table = new Table(2);
+        table.setWidth(width);
+
+        //名称
+        Paragraph nameP = new Paragraph("第" + pageNumber + "页").setFontSize(10f);
+        table.addCell(new Cell().add(nameP).setHorizontalAlignment(HorizontalAlignment.RIGHT).setVerticalAlignment(VerticalAlignment.MIDDLE).setTextAlignment(
+                TextAlignment.RIGHT).setBorderTop(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderRight(
+                Border.NO_BORDER));
+
+        //设置表格的位置 页眉处
+        table.setFixedPosition(document.getLeftMargin() - 10, pdfHeight - document.getTopMargin() - 40, table.getWidth());
+        document.add(table);
+    }
+
+    /**
+     *  页脚添加页码
+     */
+    private void addPageFooter(Document document, PdfDocument pdf, PdfPage page, float pdfHeight) {
+        Rectangle pageSize = page.getPageSize();
+        //创建字体
+        float width = PageSize.A4.getWidth() - 60;
+        //表格 一行两列
+        Table table = new Table(3);
+        table.setWidth(width);
+
+        //页码 居右
+        if (null == totalNumTemplate) {
+            totalNumTemplate = new PdfFormXObject(new Rectangle(0, 0, 20, 20));
+        }
+
+        int pageNum = pdf.getPageNumber(page);
+        int pageTotal=  pdf.getNumberOfPages();
+
+        PdfCanvas canvasP = new PdfCanvas(page);
+        Canvas canvas = new Canvas(canvasP, pdf, pageSize);
+        canvas.setFontSize(10f);
+        Paragraph pageP = new Paragraph("" + pageNum).add(" / " + pageTotal).setFontSize(10f).setFontColor(Color.GRAY);
+        canvas.showTextAligned(pageP, 295, 10, TextAlignment.RIGHT);
+        canvas.close();
+        canvasP.addXObject(totalNumTemplate, 300f, 7f);
+        canvasP.release();
+
+        table.setFixedPosition(document.getLeftMargin() - 10, pdfHeight - document.getBottomMargin() - 40, table.getWidth());
+        document.add(table);
+    }
+
+
+}