211 Star 1.6K Fork 392

dromara / x-easypdf

 / 详情

table自动跨页好像有点问题

已完成
创建于  
2022-05-19 12:31

输入图片说明
输入图片说明

输入图片说明

说明:2.8.0版本

评论 (3)

sheepych 创建了任务
sheepych 修改了描述
展开全部操作日志

请附上调用代码,方便排查问题,谢谢


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import wiki.xsx.core.pdf.component.XEasyPdfComponent;
import wiki.xsx.core.pdf.component.table.XEasyPdfCell;
import wiki.xsx.core.pdf.component.table.XEasyPdfRow;
import wiki.xsx.core.pdf.component.table.XEasyPdfTable;
import wiki.xsx.core.pdf.doc.XEasyPdfDefaultFontStyle;
import wiki.xsx.core.pdf.doc.XEasyPdfDocument;
import wiki.xsx.core.pdf.doc.XEasyPdfPage;
import wiki.xsx.core.pdf.doc.XEasyPdfPositionStyle;
import wiki.xsx.core.pdf.handler.XEasyPdfHandler;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.util.List;
import java.util.*;

public class TestDemo {
    public static void main(String[] args) {
        testWritePdf();
    }

    public static void testWritePdf() {
        List<PdfModel<?>> list = new ArrayList<>();
        PdfModel<WbDTO2> table = new PdfModel<>();
        table.setType(PdfContentType.TABLE);
        List<WbDTO2> dataList = new ArrayList<>();
        for (int i = 0; i < 120; i++) {
            dataList.add(WbDTO2.builder().deviceId("deviceId-" + i).deviceName("设备" + (i + 1))
                    .localName("南山区金证大楼/" + (i + 1) + "楼").type("虚拟设备").productKey("kt")
                    .productId("productId-" + i).build());
        }
        table.setTableData(dataList);
        list.add(table);
        write(list, PDRectangle.A4);
    }

    /**
     * 导出PDF
     *
     * @param dataList  数据
     * @param rectangle 纸张大小,默认A4
     * @author 杨昌海
     * @date 2022/5/19
     */
    public static void write(List<PdfModel<?>> dataList, PDRectangle rectangle) {
        //todo 支持指定换页
        rectangle = rectangle == null ? PDRectangle.A4 : rectangle;
        List<XEasyPdfComponent> components = new ArrayList<>();
        for (PdfModel<?> pdfModel : dataList) {
            XEasyPdfComponent component = null;
            switch (pdfModel.getType()) {
                case TABLE:
                    component = createTable(pdfModel.getTableData(), rectangle);
                    break;
                default:
                    break;
            }
            if (component != null) {
                components.add(component);
            }
        }
        XEasyPdfPage page = XEasyPdfHandler.Page.build(rectangle, components);
        XEasyPdfDocument document = XEasyPdfHandler.Document.build(page);
        document.save("./utilsPdf.pdf").close();
    }

    private static <T> XEasyPdfTable createTable(List<T> data, PDRectangle rectangle) {
        List<XEasyPdfRow> rows = new ArrayList<>();
        List<XEasyPdfCell> header = new ArrayList<>();
        int column = 0;
        float columnWith = 0;
        for (T datum : data) {
            Class<?> aClass = datum.getClass();
            Field[] fields = aClass.getDeclaredFields();
            if (column == 0) {
                for (Field field : fields) {
                    field.setAccessible(true);
                    PdfTableProperty annotation = field.getAnnotation(PdfTableProperty.class);
                    if (annotation != null) {
                        column++;
                    }
                }
                columnWith = rectangle.getWidth() / column;
                for (Field field : fields) {
                    field.setAccessible(true);
                    PdfTableProperty annotation = field.getAnnotation(PdfTableProperty.class);
                    if (annotation != null) {
                        String title = annotation.title();
                        header.add(XEasyPdfHandler.Table.Row.Cell.build(columnWith)
                                .addContent(XEasyPdfHandler.Text.build(title))
                                .setFontSize(16F)
                                .setDefaultFontStyle(XEasyPdfDefaultFontStyle.BOLD)
                                .setHorizontalStyle(XEasyPdfPositionStyle.LEFT)
                        );
                    }
                }
                //表头
                rows.add(XEasyPdfHandler.Table.Row.build(header));
            }
            List<XEasyPdfCell> cells = new ArrayList<>();
            for (Field field : fields) {
                field.setAccessible(true);
                Object value = null;
                try {
                    value = field.get(datum);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                value = value == null ? "" : value;
                cells.add(XEasyPdfHandler.Table.Row.Cell.build(columnWith)
                        .addContent(XEasyPdfHandler.Text.build(value.toString()))
                        .setHorizontalStyle(XEasyPdfPositionStyle.LEFT)
                );
            }
            rows.add(XEasyPdfHandler.Table.Row.build(cells));
        }
        return XEasyPdfHandler.Table.build(rows);
    }


}


@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class PdfModel<T> {
    /**
     * 内容类型,默认文本
     */
    private PdfContentType type = PdfContentType.TEXT;

    /**
     * type为TABLE表格的业务数据
     */
    private List<T> tableData;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class WbDTO2 {

    @PdfTableProperty(title = "设备名称")
    private String deviceName;

    @PdfTableProperty(title = "设备id")
    private String deviceId;

    @PdfTableProperty(title = "产品名称")
    private String productName;

    @PdfTableProperty(title = "产品标识")
    private String productKey;

    @PdfTableProperty(title = "产品ID")
    private String productId;

    @PdfTableProperty(title = "设备位置")
    private String localName;

    @PdfTableProperty(title = "描述")
    private String type;
}

/**
 * PDF table表格注解
 *
 * @author 杨昌海
 * @date 2022/5/18
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface PdfTableProperty {

    /**
     * 表头名称
     */
    String title();
}

enum PdfContentType {
    //内容格式
    //表格
    TABLE,
    //表单
    FORM,
    //文本
    TEXT,
    //图片
    IMAGE,
    //分隔符/横线
    LINE,
    //二维码
    BAR_CODE,
    //水印
    WATERMARK,
    ;
}


xsx 任务状态待办的 修改为进行中

请使用v2.8.2版本

xsx 任务状态进行中 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
1494292 xsxgit 1585187915 1921795 sheepych 1578962455
Java
1
https://gitee.com/dromara/x-easypdf.git
git@gitee.com:dromara/x-easypdf.git
dromara
x-easypdf
x-easypdf

搜索帮助