package cn.com.qmth.scancentral.bean.card; import java.awt.Image; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Base64; import java.util.LinkedList; import java.util.List; import javax.imageio.ImageIO; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.qmth.boot.core.exception.ParameterException; /** * 卡格式文件内容结构 */ @JsonIgnoreProperties(ignoreUnknown = true) public class CardFile { private String version; private boolean adapted; private List pages; @JsonIgnore private SliceConfig sliceConfig; @JsonIgnore private List sliceName; public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public boolean isAdapted() { return adapted; } public void setAdapted(boolean adapted) { this.adapted = adapted; } public List getPages() { return pages; } public void setPages(List pages) { this.pages = pages; } /** * 解析卡格式文件中的裁切图坐标,用于云阅卷同步 * * @return */ public SliceConfig getSliceConfig() throws IOException { if (sliceConfig == null) { sliceConfig = new SliceConfig(); if (pages != null) { int pageNumber = 0; for (CardPageWrapper pageWrapper : pages) { pageNumber++; CardPage page = pageWrapper.getExchange(); // 遮盖模式 if (page.getInfoArea() != null && page.getInfoArea().length > 0) { sliceConfig.addConfig(pageNumber, 0, 0, 0, 0); } // 裁切模式 else if (page.getAnswerArea() != null && !page.getAnswerArea().isEmpty()) { // 获取卡格式图片原始尺寸 // 此处图片base64编码特殊,需要采用Mime标准 Image image = ImageIO .read(new ByteArrayInputStream(Base64.getMimeDecoder().decode(page.getPageImage()))); int width = image.getWidth(null); int height = image.getHeight(null); for (AnswerArea area : page.getAnswerArea()) { sliceConfig.addConfig(pageNumber, (int) (area.getArea()[0] * width), (int) (area.getArea()[1] * height), (int) (area.getArea()[2] * width), (int) (area.getArea()[3] * height)); } } } } } return sliceConfig; } public List getSliceName() throws IOException { List sliceName = new LinkedList(); if (pages != null) { for (CardPageWrapper pageWrapper : pages) { CardPage page = pageWrapper.getExchange(); for (AnswerArea area : page.getAnswerArea()) { if (area.getMainNumber() == null) { throw new ParameterException("CET模式下裁切图必须指定大题号"); } sliceName.add(area.getMainNumber().toString()); } } } return sliceName; } }