5 小时以前 9bad721754fe8bbe2e5f459d0706e0fefac569f3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package cn.iocoder.yudao.module.qcreport.engine;
 
import java.util.Map;
 
/**
 * 纸张尺寸换算。
 * <p>
 * 与前端 {@code engine/page.ts} 一一对应,取值同 {@code QcReportEnums.PageSizeEnum}。
 * 设计器换算画布像素、渲染引擎换算 {@code @page} 都用这一份,避免两处各写一遍后对不上。
 */
public final class PageSizes {
 
    /** 纸张尺寸(毫米),数组为 {宽, 高} */
    private static final Map<String, double[]> SIZE_MM = Map.of(
            "A3", new double[]{297, 420},
            "A4", new double[]{210, 297},
            "A5", new double[]{148, 210},
            "Letter", new double[]{215.9, 279.4});
 
    /** 默认纸张,未列出的尺寸回退到它 */
    public static final String DEFAULT_SIZE = "A4";
 
    /** 默认页边距(毫米) */
    public static final double DEFAULT_MARGIN_MM = 10;
 
    private PageSizes() {
    }
 
    /** 解析纸张尺寸与页边距(毫米),横向时翻转宽高 */
    public static ResolvedPage resolve(PageSetting page) {
        String size = page == null || page.size() == null ? DEFAULT_SIZE : page.size();
        double[] base = SIZE_MM.getOrDefault(size, SIZE_MM.get(DEFAULT_SIZE));
        boolean landscape = page != null && "landscape".equals(page.orientation());
        PageMargin margin = page == null ? null : page.margin();
        return new ResolvedPage(
                landscape ? base[1] : base[0],
                landscape ? base[0] : base[1],
                marginOf(margin == null ? null : margin.top()),
                marginOf(margin == null ? null : margin.right()),
                marginOf(margin == null ? null : margin.bottom()),
                marginOf(margin == null ? null : margin.left()));
    }
 
    private static double marginOf(Double value) {
        return value == null ? DEFAULT_MARGIN_MM : value;
    }
 
}