| | |
| | | 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); |
| | |
| | | |
| | | 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 { |
| | | |