package com.yiboshi.science.utils; import com.itextpdf.kernel.colors.DeviceRgb; import com.itextpdf.layout.borders.SolidBorder; import com.itextpdf.layout.element.Cell; import com.itextpdf.layout.element.Table; import com.itextpdf.layout.properties.TextAlignment; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.properties.UnitValue; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.text.pdf.BaseFont; import com.yiboshi.science.param.dto.*; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.io.font.PdfEncodings; import java.io.ByteArrayOutputStream; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Objects; import static com.yiboshi.science.utils.ProjectInfoToPDF.getCurrentOperatingSystem; public class TaskToPDF { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); static SimpleDateFormat sdfM = new SimpleDateFormat("yyyy年MM月"); private static PdfFont createFont(String fontName) { try { if ("linux".equals(getCurrentOperatingSystem())) { if (fontName.toLowerCase().endsWith(".ttc")) return PdfFontFactory.createFont("/usr/share/fonts/" + fontName + ",0", PdfEncodings.IDENTITY_H); else return PdfFontFactory.createFont("/usr/share/fonts/" + fontName, PdfEncodings.IDENTITY_H); } else { if (fontName.toLowerCase().endsWith(".ttc")) return PdfFontFactory.createFont("c:/Windows/Fonts/" + fontName + ",0", PdfEncodings.IDENTITY_H); else return PdfFontFactory.createFont("c:/Windows/Fonts/" + fontName, PdfEncodings.IDENTITY_H); } } catch (Exception e) { throw new RuntimeException("加载字体文件失败,请确保系统中存在字体文件 " + fontName + ":" + e.getMessage(), e); } } /** * 生成项目合同书PDF * * @param dto 项目任务信息 * @return PDF文件字节数组 */ public static byte[] createContractPdf(ComProjectTaskDTO dto) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfDocument pdfDoc = new PdfDocument(new PdfWriter(baos)); Document document = new Document(pdfDoc); // 添加中文字体支持 // 宋体 PdfFont sfChinese = createFont("simsun.ttc"); // 仿宋 PdfFont fsChinese = createFont("simfang.ttf"); document.setFont(sfChinese); float[] columnWidths = {20f, 20f, 20f, 40f}; Table table = new Table(columnWidths); table.setWidth(UnitValue.createPercentValue(100)); // 设置单元格样式 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { Cell cell = new Cell(); cell.setHeight(40f); cell.setBorder(new SolidBorder(new DeviceRgb(0, 0, 0), 0.5f)); cell.setTextAlignment(TextAlignment.CENTER); // 使用中文测试文本 cell.add(new Paragraph("单元格 " + (i+1) + "-" + (j+1)).setFont(sfChinese)); table.addCell(cell); } } // 添加表格到文档 document.add(table); // 关闭文档 document.close(); return baos.toByteArray(); } catch (Exception e) { e.printStackTrace(); return null; } } }