fei
9 天以前 a5edca4c62ea99418dcaa5d792947b1bab7fe8b2
archiveManager/src/main/java/com/ruoyi/service/impl/pdfGenerateService.java
@@ -7,22 +7,42 @@
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.*;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.domain.ArchiveRecords;
import com.ruoyi.domain.vo.DocumentMaterialFileStyle;
import com.ruoyi.domain.vo.DocumentMaterialsVo;
import com.ruoyi.domain.vo.DocumentMaterialsVoSmall;
import com.ruoyi.service.IArchiveRecordsService;
import com.ruoyi.service.IDocumentMaterialsService;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.*;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Service
public class pdfGenerateService {
    @Autowired
    private BarcodeService barcodeService;
    @Autowired
    private IDocumentMaterialsService documentMaterialsService;
    @Autowired
    private IArchiveRecordsService iArchiveRecordsService;
    //生产二维码
    public byte[] createQrCodeN(String content, int width, int height) throws IOException {
        QrConfig config = new QrConfig(width, height);
@@ -50,17 +70,482 @@
        return os.toByteArray();
    }
    private void handleXSSFImages(XSSFSheet sheet, Document pdfDoc) throws Exception {
        XSSFDrawing drawing = sheet.getDrawingPatriarch();
        if (drawing == null) return;
        for (XSSFShape shape : drawing.getShapes()) {
            if (shape instanceof XSSFPicture) {
                XSSFPicture pic = (XSSFPicture)shape;
                XSSFClientAnchor anchor = pic.getPreferredSize();
                // 获取图片数据
                byte[] bytes = pic.getPictureData().getData();
                Image pdfImage = Image.getInstance(bytes);
                // 设置图片位置和大小
                float imageWidth = pdfImage.getWidth();
                float imageHeight = pdfImage.getHeight();
                float scale = Math.min(
                        (PageSize.A4.getWidth() - 100) / imageWidth,
                        (PageSize.A4.getHeight() - 100) / imageHeight
                );
                pdfImage.scaleAbsolute(imageWidth * scale, imageHeight * scale);
                // 添加图片到PDF
                pdfDoc.add(pdfImage);
                pdfDoc.add(Chunk.NEWLINE);
            }
        }
    }
    public void generatePdf(String pdfPath) throws IOException, DocumentException {
    private static String getCellValue(Cell cell,FormulaEvaluator evaluator) {
        //  System.out.println(cell);
        if (cell == null) return "";
        CellValue cellValue = evaluator.evaluate(cell);
        if(cellValue==null)
            return "";
        //  System.out.println(cellValue.getCellType());
        switch (cellValue.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                // 获取数值并转为整型
                double numericValue = cell.getNumericCellValue();
                // 判断是否为整数
                if (numericValue == (int)numericValue) {
                    if((int)numericValue==0)
                        return "";
                    else
                        return String.valueOf((int)numericValue);
                } else {
                    return String.valueOf(numericValue); // 或者根据需要返回四舍五入的整型
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula()+"";
            case BLANK:
                return "";
            default:
                return "";
        }
    }
    private int getRealLastCellNum(Row row) {
        int lastCellNum = 0;
        for (int i = 0; i < row.getLastCellNum(); i++) {
            Cell cell = row.getCell(i);
            if (cell != null && cell.getCellType() != CellType.BLANK) {
                lastCellNum = i + 1;
            }
        }
        return lastCellNum;
    }
    //
    void generateSimpleExample()
    {
//        try {
//            // 1. 读取Excel文件
//            String excelPath = RuoYiConfig.getProfile() + "/download/"+"卷內目录.xls";
//            String pdfPath = RuoYiConfig.getProfile() + "/download/"+"1.pdf";
//
//            Workbook workbook = WorkbookFactory.create(new File(excelPath));
//            FileOutputStream fos = new FileOutputStream(pdfPath);
//            FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
//
//
//            // 获取第一个工作表
//            Sheet sheet = workbook.getSheetAt(1);
//
//            // 创建PDF文档对象
//            Document document = new Document(PageSize.A2, 50, 50, 50, 50);
//
//            // 创建PDF输出流
//            PdfWriter writer = PdfWriter.getInstance(document, fos);
//            // 4. 处理工作表中的图片
//            if (workbook instanceof XSSFWorkbook) {
//                handleXSSFImages((XSSFSheet)sheet, document);
//            }
//            // 打开PDF文档
//            document.open();
//
//            // 创建PDF表格对象
//            System.out.println(sheet.getRow(0).getLastCellNum()+"--00");
//            PdfPTable table = new PdfPTable(sheet.getRow(0).getLastCellNum());
//            table.setHeaderRows(1);
//
//            // 设置表格宽度
//            table.setWidthPercentage(100);
//
//            // 设置表格标题
//            Paragraph title = new Paragraph(sheet.getSheetName(), new Font(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), 16, Font.BOLD));
//            title.setAlignment(Element.ALIGN_CENTER);
//            document.add(title);
//            // System.out.println(sheet.)
//            // 添加表格内容
//            for (Row row : sheet) {
//                {
//                    if (row == null) continue;
//                    System.out.println(getRealLastCellNum(row)+"---987");
////                            if(row.getRowNum()==0)
////                                continue;
//                    if(row.getRowNum()==2)
//                    {
//                        PdfPCell pdfCell = ImageSet(100);
//                        pdfCell.setColspan(7);
//                        pdfCell.setRowspan(3);
//                        pdfCell.setBorderWidth(1f);
//                        pdfCell.setBorderColor(BaseColor.BLACK);
//                        pdfCell.setPadding(5f);
//                        pdfCell.setHorizontalAlignment(Element.ALIGN_CENTER);
//                        pdfCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//                        table.addCell(pdfCell);
//                        System.out.println("{{{{{{{{{{{{{");
//                        continue;
//                    }
//                    for (int i = 0; i < 7; i++)
//                    {
//
//                        Cell cell = row.getCell(i);
//                        if(row.getRowNum()==3)
//                        {
//                            PdfPCell pdfCell = new PdfPCell(new Paragraph("卷内目录", new Font(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), 12)));
//                            pdfCell.setColspan(7);
//                            pdfCell.setBorderWidth(1f);
//                            pdfCell.setBorderColor(BaseColor.BLACK);
//                            pdfCell.setPadding(5f);
//                            pdfCell.setHorizontalAlignment(Element.ALIGN_CENTER);
//                            pdfCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//                            table.addCell(pdfCell);
//                            System.out.println("{{{{{{{{{{{{{");
//                            break;
//                        }
//                        if(cell==null) {
//
//                            table.addCell("");
//                            continue;
//                        }
//                        PdfPCell pdfCell = new PdfPCell(new Paragraph(getCellValue(cell, evaluator), new Font(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), 12)));
//
//                        if(row.getRowNum()!=1) {
//                            pdfCell.setBorderWidth(1f);
//                            pdfCell.setBorderColor(BaseColor.BLACK);
//                            pdfCell.setPadding(5f);
//                            pdfCell.setHorizontalAlignment(Element.ALIGN_CENTER);
//                            pdfCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//                        }
//                        if (cell.getRowIndex() == 5) {
//                            pdfCell.setBackgroundColor(BaseColor.LIGHT_GRAY);
//                        }
//
//                        table.addCell(pdfCell);
//
//                    }
//                }
//            }
//
//            // 添加表格到PDF文档
//            table.setSpacingBefore(20f);
//            table.setSpacingAfter(20f);
//            table.setKeepTogether(true);
//            document.add(table);
//
//            // 关闭PDF文档
//            document.close();
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }
    // 自定义页面事件类,用于在每个新页面添加卷内封面内容
    private class DirectoryHeaderPageEvent extends PdfPageEventHelper {
        private String volumeNumber;
        private byte[] barcodeImageBytes;
        public DirectoryHeaderPageEvent(String volumeNumber, byte[] barcodeImageBytes) {
            this.volumeNumber = volumeNumber;
            this.barcodeImageBytes = barcodeImageBytes;
        }
        @Override
        public void onStartPage(PdfWriter writer, Document document) {
            try {
                // 设置中文字体
                BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                Font chineseFont = new Font(bfChinese, 12);
                Font chineseFont1 = new Font(bfChinese, 16, Font.BOLD);
                // 添加条形码
                Image img = Image.getInstance(barcodeImageBytes);
                PdfPCell pdfPCell = new PdfPCell(img);
                pdfPCell.setBorder(Rectangle.NO_BORDER);
                pdfPCell.setMinimumHeight(40);
                pdfPCell.setUseAscender(true);
                pdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_RIGHT);
                pdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
                pdfPCell.setColspan(2);
                pdfPCell.setPaddingBottom(30);
                float[] columnWidths1 = {35f, 65f};
                PdfPTable table1 = new PdfPTable(columnWidths1);
                table1.setWidthPercentage(80);
                table1.setHorizontalAlignment(Element.ALIGN_LEFT);
                table1.setSpacingBefore(30f);
                table1.addCell(pdfPCell);
                PdfContentByte canvas = writer.getDirectContent();
                ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase(" ", chineseFont),
                        document.left(), document.top() - 50, 0);
                document.add(table1);
                // 添加标题
                Paragraph title = new Paragraph("卷    内    目    录", chineseFont1);
                title.setAlignment(Element.ALIGN_CENTER);
                document.add(title);
                Paragraph withNewLine = new Paragraph("\n");
                document.add(withNewLine);
                document.add(withNewLine);
                // 添加卷号
                Paragraph recordInfo = new Paragraph("卷号:" + volumeNumber, chineseFont);
                recordInfo.setAlignment(Element.ALIGN_RIGHT);
                document.add(recordInfo);
                document.add(withNewLine);
                document.add(withNewLine);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    //导出卷内目录的pdf
    public void generateFileDirectoryPdf(String pdfPath,List<DocumentMaterialsVo> dvss) throws DocumentException, IOException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
        // 添加页面事件,在每个新页面自动添加卷内封面内容
        String volumeNumber = dvss.get(0).getRecordId();
        byte[] barcodeImageBytes = barcodeService.generateBarcodeImage(volumeNumber);
        writer.setPageEvent(new DirectoryHeaderPageEvent(volumeNumber, barcodeImageBytes));
        document.open();
        // 创建表格(5列)
        PdfPTable table = new PdfPTable(7);
        // 设置表格宽度(占页面宽度的100%)
        table.setWidthPercentage(100);
        // 设置列宽比例,第4列(文件题名)设置得更宽
        float[] columnWidths = {8f, 14f, 12f, 30f, 10f, 10f, 10f}; // 调整列宽比例,第4列文件题名占40%
        table.setWidths(columnWidths);
        // 设置中文字体
        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font chineseFont = new Font(bfChinese, 12);
        Font chineseFont1 = new Font(bfChinese, 16, Font.BOLD);
        // 设置表头行数,这样分页时每页都会自动重复表头
        table.setHeaderRows(1);
        // 添加表头
        String[] headers = {"序号", "文件编号", "责任者", "文件题名", "日期", "页号", "备注"};
        for (String header : headers) {
            PdfPCell cell = new PdfPCell(new Paragraph(header,
                    chineseFont1));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setBackgroundColor(new BaseColor(200, 200, 200));
            table.addCell(cell);
        }
        // 添加表格数据
//        Object[][] data = {
//              //  {1, "商品A", 2, 100.00, 200.00},
//             //   {2, "商品B", 1, 250.50, 250.50},
//             //   {3, "商品C", 3, 80.00, 240.00}
//        };
//        data.
      //  for (Object[] row : data) {
            for (DocumentMaterialsVo cellData : dvss) {
                //序号
                PdfPCell cell = new PdfPCell(new Paragraph(cellData.getNum().toString(),
                        chineseFont));
                cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);
                //序号
                PdfPCell cell1 = new PdfPCell(new Paragraph(cellData.getDocumentNumber()==null?"":cellData.getDocumentNumber().toString(),
                        chineseFont));
                cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell1);
                //序号
                PdfPCell cell2 = new PdfPCell(new Paragraph(cellData.getCreator()==null?"":cellData.getCreator().toString(),
                        chineseFont));
                cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell2);
                //序号
                PdfPCell cell3 = new PdfPCell(new Paragraph(cellData.getTitle()==null?"":cellData.getTitle().toString(),
                        chineseFont));
                cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
                table.addCell(cell3);
                //序号
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
               // String dateString = sdf.format(date);
                PdfPCell cell4 = new PdfPCell(new Paragraph(cellData.getDate()==null?"":sdf.format(cellData.getDate()),
                        chineseFont));
                cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell4.setHorizontalAlignment(Element.ALIGN_CENTER);
                table.addCell(cell4);
                //序号
                PdfPCell cell5 = new PdfPCell(new Paragraph(cellData.getPageNumber()==null?"": cellData.getPageNumber().toString(),
                        chineseFont));
                cell5.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell5.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell5);
                //序号
                PdfPCell cell6 = new PdfPCell(new Paragraph(cellData.getRemarks()==null?"":cellData.getRemarks().toString(),
                        chineseFont));
                cell6.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell6.setHorizontalAlignment(Element.ALIGN_CENTER);
                table.addCell(cell6);
            }
      //  }
        document.add(table);
        document.close();
    }
    //设置备考表
   public void generateFileStyleInfo(String pdfPath, String volumeNumber, Long id) throws IOException, DocumentException {
       Document document = new Document();
       PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
       document.open();
// 创建PDF文档
       List<DocumentMaterialFileStyle> dmfs = documentMaterialsService.findFileStyleInfo(Math.toIntExact(id));
       if(dmfs.isEmpty())
           return;
       System.out.println(dmfs);
       PdfWriter.getInstance(document, new FileOutputStream("09-备考表"+".pdf"));
       document.open();
       // 设置中文字体
       BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
       Font chineseFont = new Font(bfChinese, 16, Font.BOLD);
       // 添加标题
       Paragraph title = new Paragraph("卷内备考表", chineseFont);
       title.setAlignment(Element.ALIGN_CENTER);
       document.add(title);
       // 添加内容
     //  String volumeNumber = "D3.4.1-05-2024-0002";
       Paragraph recordInfo = new Paragraph("卷号:" + volumeNumber, chineseFont);
       recordInfo.setAlignment(Element.ALIGN_RIGHT);
       document.add(recordInfo);
       int pcc = dmfs.size()<=1?0: dmfs.get(1).getCnt();
       int oth = dmfs.size()<=2?0: dmfs.get(2).getCnt();
       int allCnt = dmfs.get(0).getCnt() + pcc + oth;
       document.add(new Paragraph("          本 案 卷 共 有 文 件 材 料 " + allCnt + " 页"+",其中:文字材料 " +
               pcc + " 页"+",图样材料 " + oth + " 页"+",照片 " + dmfs.get(0).getCnt() + " 张", chineseFont));
       document.add(new Paragraph("说明: ", chineseFont));
       // 方法2:使用带换行符的Paragraph
       for(int i = 0; i < 10; i++) {
           Paragraph withNewLine = new Paragraph("\n");
           document.add(withNewLine);
       }
       String tis1 = "立卷人:仇翀(广州盈家档案管理有限公司)";
       Paragraph par1 = new Paragraph(tis1, chineseFont);
       par1.setAlignment(Element.ALIGN_RIGHT);
       document.add(par1);
       //拿到当前时间
       // 获取当前日期
       LocalDate currentDate = LocalDate.now();
       // 打印年、月、日
//       System.out.println("Year: " + currentDate.getYear());
//       System.out.println("Month: " + currentDate.getMonthValue()); // 月份是从1开始的
//       System.out.println("Day of Month: " + currentDate.getDayOfMonth());
       Paragraph withNewLine = new Paragraph("\n");
       document.add(withNewLine);
       String cdt = currentDate.getYear()+"年"+currentDate.getMonthValue()+"月"+currentDate.getDayOfMonth()+"日";
       Paragraph par3 = new Paragraph(cdt, chineseFont);
       par3.setAlignment(Element.ALIGN_RIGHT);
       document.add(par3);
       String tis2 = "审核人:曾瑞莹(广州盈家档案管理有限公司)";
       document.add(withNewLine);
       Paragraph par2 = new Paragraph(tis2, chineseFont);
       par2.setAlignment(Element.ALIGN_RIGHT);
       document.add(par2);
       document.add(withNewLine);
       document.add(par3);
       document.close();
   }
    public void generatePdf(String pdfPath, Long id) throws IOException, DocumentException {
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
        document.open();
        String [] tits = {"档        号:","档案馆(室)号:","缩  微  号: ","发  文  号:",
                "案  卷  题  名:","编  制  日  期:","编  制  单  位:","保  管  期  限:","密     级:"};
        String [] cons = {"D3.4.1-05-2024-0002","","","穗规划资源建证〔2024〕2033号","广州市自来水有限公司白云区江高镇江高镇政府西侧、江府路北侧白云区江高镇江高镇政府西侧、江府路北侧新装供水管工程","2024-04-23","广州市规划和自然资源局白云区分局","永久",""};
        String [] tits = {"档号:","档案馆(室)号:","缩微号:","发文号:",
                "案卷题名:","编制日期:","编制单位:","保管期限:","密级:"};
        ArchiveRecords ard = iArchiveRecordsService.selectArchiveRecordsById(id);
        String formattedDate = "";
        if(ard.getPreparationDate()!=null) {
            LocalDate date = ard.getPreparationDate().toInstant()
                    .atZone(ZoneId.systemDefault())
                    .toLocalDate();
            ;
            System.out.println("当前日期: " + date);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
      formattedDate = date.format(formatter);
        }
        String [] cons = {ard.getRecordId(),ard.getArchiveRoomNumber(),ard.getMicrofilmNumber(),ard.getInquiryNumber(),ard.getCaseTitle(),formattedDate,ard.getPreparationUnit(),
                ard.getRetentionPeriod(),ard.getSecurityClassification()};
        //把图片加入到pdf当中
        Image img = Image.getInstance(createQrCodeN(cons[0], 80, 80));
@@ -81,7 +566,7 @@
        float[] columnWidths = {35f, 65f}; // 第一列30%,第二列70%
        PdfPTable table = new PdfPTable(columnWidths);
//        PdfPTable table = new PdfPTable(2);
        table.setWidthPercentage(80); // 增大表格宽度百分比
        table.setWidthPercentage(78); // 减小表格宽度百分比使两列更紧凑
        table.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置表格整体居中
        table.setSpacingBefore(30f); // 设置表格前间距
        table.setSpacingAfter(90f); // 设置表格后间距
@@ -105,12 +590,64 @@
        // 先计算所有标题的最长长度
        int maxTitleLength = 0;
        for (String tit : tits) {
            maxTitleLength = Math.max(maxTitleLength, tit.length()-1);
        }
        for(int i = 0; i < tits.length; i++) {
            // 使用PdfPTable实现精确对齐
            // 第一行:档号
            PdfPCell labelCell1 = new PdfPCell(new Phrase(tits[i], chineseFont));
            labelCell1.setHorizontalAlignment(Element.ALIGN_RIGHT); // 设置右对齐
            // 实现对齐:在文字之间填充空格,使所有标题总长度相同
            String originalText = tits[i];
            // 计算需要添加的空格数
            int spacesToAdd = maxTitleLength - originalText.length();
            String formattedText = originalText;
            if (spacesToAdd > 0) {
                // 在冒号前的文字之间均匀分配填充空格
                if (originalText.contains(":")) {
                    int colonIndex = originalText.indexOf(":");
                    String textBeforeColon = originalText.substring(0, colonIndex);
                    String textAfterColon = originalText.substring(colonIndex);
                    // 如果冒号前只有一个字符,直接在后面加空格
                    if (textBeforeColon.length() == 1) {
                        String fullWidthSpaces = StringUtils.repeat(" ", spacesToAdd);
                        formattedText = textBeforeColon + fullWidthSpaces + textAfterColon;
                    } else if (textBeforeColon.length() > 1) {
                        // 在文字之间均匀分配空格
                        StringBuilder sb = new StringBuilder();
                        int chars = textBeforeColon.length();
                        int spacesPerGap = spacesToAdd / (chars - 1);
                        int extraSpaces = spacesToAdd % (chars - 1);
                        for (int j = 0; j < chars; j++) {
                            sb.append(textBeforeColon.charAt(j));
                            if (j < chars - 1) {
                                // 添加基本空格
                                sb.append(StringUtils.repeat(" ", spacesPerGap));
                                // 分配剩余空格
                                if (j < extraSpaces) {
                                    sb.append(" ");
                                }
                            }
                        }
                        sb.append(textAfterColon);
                        formattedText = sb.toString();
                    }
                } else {
                    // 如果没有冒号,直接在末尾加空格(应该不会出现这种情况)
                    String fullWidthSpaces = StringUtils.repeat(" ", spacesToAdd);
                    formattedText = originalText + fullWidthSpaces;
                }
            }
            PdfPCell labelCell1 = new PdfPCell(new Phrase(formattedText, chineseFont));
            labelCell1.setHorizontalAlignment(Element.ALIGN_RIGHT); // 单元格右对齐
            labelCell1.setBorder(Rectangle.NO_BORDER);
//            PdfPCell valueCell1 = new PdfPCell(new Phrase(cons[i], chineseFont));
@@ -119,17 +656,18 @@
            labelCell1.setPaddingTop(10f);    // 上内边距10单位
            labelCell1.setPaddingBottom(10f); // 下内边距10单位
            labelCell1.setPaddingLeft(15f);   // 左内边距15单位
            labelCell1.setPaddingRight(15f);  // 右内边距15单位
            labelCell1.setPaddingRight(0f);  // 右内边距15单位
            PdfPCell valueCell1 = new PdfPCell(new Phrase(cons[i], chineseFont));
            valueCell1.setBorder(Rectangle.NO_BORDER);
            valueCell1.setUseBorderPadding(true);
            valueCell1.setUseBorderPadding(false); // 禁用边框内边距计算
            valueCell1.setBorderWidthBottom(0.5f); // 设置底部边框作为下划线
            valueCell1.setMinimumHeight(30);
            valueCell1.setPaddingTop(10f);    // 上内边距10单位
            valueCell1.setPaddingBottom(10f); // 下内边距10单位
            valueCell1.setPaddingLeft(15f);   // 左内边距15单位
            valueCell1.setPaddingLeft(0f);   // 左内边距0单位
            valueCell1.setExtraParagraphSpace(0f); // 移除段落额外空间
            valueCell1.setPaddingRight(15f);  // 右内边距15单位
            table.addCell(labelCell1);
            table.addCell(valueCell1);
@@ -144,7 +682,7 @@
                PdfPCell pdfPCell1 = new PdfPCell(img1);
                pdfPCell1.setBorder(Rectangle.NO_BORDER); // 移除单元格边框
                pdfPCell1.setMinimumHeight(40);
                pdfPCell1.setMinimumHeight(20);
                pdfPCell1.setUseAscender(true); // 设置可以居中
                pdfPCell1.setHorizontalAlignment(PdfPCell.ALIGN_RIGHT); // 设置水平居中
                pdfPCell1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); // 设置垂直居中