| | |
| | | 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); |
| | |
| | | |
| | | 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)); |
| | |
| | | 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); // 设置表格后间距 |
| | |
| | | |
| | | |
| | | |
| | | // 先计算所有标题的最长长度 |
| | | 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)); |
| | |
| | | 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); |
| | |
| | | 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); // 设置垂直居中 |