fei
20 小时以前 af47b774448bfa3ece4741664ce4d24128c8f629
archiveManager/src/main/java/com/ruoyi/service/impl/pdfGenerateService.java
@@ -11,18 +11,31 @@
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.domain.vo.DocumentMaterialFileStyle;
import com.ruoyi.domain.vo.DocumentMaterialsVo;
import com.ruoyi.domain.vo.DocumentMaterialsVoSmall;
import com.ruoyi.service.IDocumentMaterialsService;
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.util.List;
@Service
public class pdfGenerateService {
    @Autowired
    private BarcodeService barcodeService;
    @Autowired
    private IDocumentMaterialsService documentMaterialsService;
    //生产二维码
    public byte[] createQrCodeN(String content, int width, int height) throws IOException {
        QrConfig config = new QrConfig(width, height);
@@ -50,7 +63,417 @@
        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);
            }
        }
    }
    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();
//        }
    }
    //导出卷内目录的pdf
    public void generateFileDirectoryPdf(String pdfPath,List<DocumentMaterialsVo> dvss) throws DocumentException, IOException {
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
        document.open();
        // 创建表格(5列)
        PdfPTable table = new PdfPTable(7);
        // 设置表格宽度(占页面宽度的100%)
        table.setWidthPercentage(100);
        //添加条形码
        String volumeNumber = dvss.get(0).getRecordId();
        Image img = Image.getInstance(barcodeService.generateBarcodeImage(volumeNumber));
        // 设置图片在PDF中的位置(可选)
//        img.setAbsolutePosition(100, 100);
        // 将图片添加到PDF文档中
        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[] columnWidths = {35f, 65f}; // 第一列30%,第二列70%
        PdfPTable table1 = new PdfPTable(columnWidths);
//        PdfPTable table = new PdfPTable(2);
        table1.setWidthPercentage(80); // 增大表格宽度百分比
        table1.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置表格整体居中
        table1.setSpacingBefore(30f); // 设置表格前间距
        table1.addCell(pdfPCell);
        document.add(table1);
        // 添加表头
        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);
        // 添加标题
        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);
        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));
       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 allCnt = dmfs.get(0).getCnt() + dmfs.get(1).getCnt() + dmfs.get(2).getCnt();
       document.add(new Paragraph("          本 案 卷 共 有 文 件 材 料 " + allCnt + " 页"+",其中:文字材料 " +
               dmfs.get(1).getCnt() + " 页"+",图样材料 " + dmfs.get(2).getCnt() + " 页"+",照片 " + 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) throws IOException, DocumentException {