package cn.iocoder.yudao.module.qcreport.engine;
import java.util.Map;
/**
* 纸张尺寸换算。
*
* 与前端 {@code engine/page.ts} 一一对应,取值同 {@code QcReportEnums.PageSizeEnum}。
* 设计器换算画布像素、渲染引擎换算 {@code @page} 都用这一份,避免两处各写一遍后对不上。
*/
public final class PageSizes {
/** 纸张尺寸(毫米),数组为 {宽, 高} */
private static final Map 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;
}
}