| | |
| | | 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.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 java.time.LocalDate; |
| | | import java.time.ZoneId; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | //导出卷内目录的pdf |
| | | public void generateFileDirectoryPdf(String pdfPath,List<DocumentMaterialsVo> dvss) throws DocumentException, IOException { |
| | | Document document = new Document(); |
| | | PdfWriter.getInstance(document, new FileOutputStream(pdfPath)); |
| | | document.open(); |
| | | // 自定义页面事件类,用于在每个新页面添加卷内封面内容 |
| | | private class DirectoryHeaderPageEvent extends PdfPageEventHelper { |
| | | private String volumeNumber; |
| | | private byte[] barcodeImageBytes; |
| | | |
| | | // 创建表格(5列) |
| | | PdfPTable table = new PdfPTable(7); |
| | | public DirectoryHeaderPageEvent(String volumeNumber, byte[] barcodeImageBytes) { |
| | | this.volumeNumber = volumeNumber; |
| | | this.barcodeImageBytes = barcodeImageBytes; |
| | | } |
| | | |
| | | // 设置表格宽度(占页面宽度的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); |
| | | |
| | | |
| | | // 添加表头 |
| | | @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(withNewLine); |
| | | document.add(withNewLine); |
| | | |
| | | |
| | | //添加卷号 |
| | | Paragraph recordInfo = new Paragraph("卷号:" + volumeNumber, chineseFont); |
| | | recordInfo.setAlignment(Element.ALIGN_RIGHT); |
| | |
| | | |
| | | 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, |
| | |
| | | PdfWriter.getInstance(document, new FileOutputStream(pdfPath)); |
| | | document.open(); |
| | | |
| | | String [] tits = {"档 号:","档案馆(室)号:","缩 微 号: ","发 文 号:", |
| | | "案 卷 题 名:","编 制 日 期:","编 制 单 位:","保 管 期 限:","密 级:"}; |
| | | String [] tits = {"档号:","档案馆(室)号:","缩微号:","发文号:", |
| | | "案卷题名:","编制日期:","编制单位:","保管期限:","密级:"}; |
| | | ArchiveRecords ard = iArchiveRecordsService.selectArchiveRecordsById(id); |
| | | |
| | | |
| | |
| | | ; |
| | | System.out.println("当前日期: " + date); |
| | | |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
| | | formattedDate = date.format(formatter); |
| | | } |
| | | |
| | |
| | | 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); // 设置垂直居中 |