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;
|
}
|
|
}
|