• wangxl's avatar
    1 · 903d8f40
    wangxl authored
    903d8f40
TaskToPDF.java 3.7 KB
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;
        }
    }
}