diff --git a/web-app/src/main/java/com/zcloud/edu/command/query/archives/ArchivesQueryExe.java b/web-app/src/main/java/com/zcloud/edu/command/query/archives/ArchivesQueryExe.java index 6cf6fa9..535b505 100644 --- a/web-app/src/main/java/com/zcloud/edu/command/query/archives/ArchivesQueryExe.java +++ b/web-app/src/main/java/com/zcloud/edu/command/query/archives/ArchivesQueryExe.java @@ -21,7 +21,6 @@ import com.zcloud.edu.domain.model.archives.ClassArchivesE; import com.zcloud.edu.domain.model.archives.PersonArchivesE; import com.zcloud.edu.domain.model.study.*; import com.zcloud.edu.domain.utils.FixedPictureUtils; -import com.zcloud.edu.domain.utils.ImageUtil; import com.zcloud.edu.dto.archives.ArchivesPdfFilePageQry; import com.zcloud.edu.dto.archives.ArchivesQry; import com.zcloud.edu.dto.clientobject.archives.ArchivesPdfFileCO; @@ -425,7 +424,6 @@ public class ArchivesQueryExe { try { Map workItem = PropertyUtils.describe( params); // PictureRenderData picture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getUserAvatarUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址 -// PictureRenderData picture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + params.getUserAvatarUrl(), 100, 100); PictureRenderData picture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getUserAvatarUrl(), 100, 100); workItem.put("img", picture); String templatePath = "templates/template/studentInfo.docx"; @@ -444,39 +442,14 @@ public class ArchivesQueryExe { Map workItem = PropertyUtils.describe( params); if(!ObjectUtils.isEmpty(params.getSignFaceUrl())){ // PictureRenderData signFacePicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getSignFaceUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址 -// PictureRenderData signFacePicture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + params.getSignFaceUrl(), 100, 100); PictureRenderData signFacePicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getSignFaceUrl(), 100, 100); workItem.put("signFacePicture", signFacePicture); } if (!ObjectUtils.isEmpty(params.getExamSignFaceUrl())) { // PictureRenderData examSignFacePicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getExamSignFaceUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址 -// PictureRenderData examSignFacePicture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + params.getExamSignFaceUrl(), 100, 100); PictureRenderData examSignFacePicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getExamSignFaceUrl(), 100, 100); workItem.put("examSignFacePicture", examSignFacePicture); -// String imageUrl = fileUrlConfig.getPrefixUrl() + params.getExamSignFaceUrl(); -// try (InputStream is = new URL(imageUrl).openStream()) { -// ByteArrayOutputStream baos = new ByteArrayOutputStream(); -// -// // Thumbnailator 自动处理 EXIF 方向,并缩放到 100x100(保持比例) -// Thumbnails.of(is) -// .keepAspectRatio(true) // 可选:保持比例,避免拉伸 -// .outputFormat("JPEG") -// .toOutputStream(baos); -// -// byte[] imageBytes = baos.toByteArray(); -// ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes); -// PictureRenderData picture = Pictures.ofStream(bis) -// .size(100, 100) -// .create(); -// -// workItem.put("examSignFacePicture", picture); -// } catch (Exception e) { -// e.printStackTrace(); -// // 可选:插入默认占位图 -// // workItem.put("examSignFacePicture", defaultPicture); -// } } - BigDecimal videoTotalTime = params.getVideoTotalTime(); String templatePath = "templates/template/studyRecord.docx"; ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem); @@ -527,11 +500,9 @@ public class ArchivesQueryExe { workItem.put("className", params.getClassName()); if(!ObjectUtils.isEmpty(params.getStudentExamRecord().getSignUrl())){ // PictureRenderData signPicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getStudentExamRecord().getSignUrl(), PictureType.JPEG).size(50, 15).create();//网络图片地址 -// PictureRenderData signPicture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + params.getStudentExamRecord().getSignUrl(), 50, 25); PictureRenderData signPicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getStudentExamRecord().getSignUrl(), 50, 25); workItem.put("signPicture", signPicture); } -// log.info("考试试卷下载,{}",JSONUtil.toJsonStr(workItem)); String templatePath = "templates/template/exam.docx"; ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem); return outputStream.toByteArray(); @@ -539,7 +510,6 @@ public class ArchivesQueryExe { e.printStackTrace(); log.error("execteExamRecord,整理数据失败",e); return null; -// throw new BizException("导出失败"); } } @@ -887,7 +857,6 @@ public class ArchivesQueryExe { for (StudentSignCO item : params.getSignList()){ Map itemMap = PropertyUtils.describe(item); // PictureRenderData picture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + item.getSignUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址 -// PictureRenderData picture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + item.getSignUrl(), 100, 100); PictureRenderData picture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getSignUrl(), 100, 100); itemMap.put("picture", picture); int index = atomicIndex.getAndIncrement(); @@ -921,21 +890,15 @@ public class ArchivesQueryExe { item.setUserIdCard(userIdCardString); Map itemMap = PropertyUtils.describe(item); if(!ObjectUtils.isEmpty(item.getSignFaceUrl())){ -// PictureRenderData signPicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + item.getSignFaceUrl(), PictureType.JPEG).size(50, 50).create();//网络图片地址 -// PictureRenderData signPicture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + item.getSignFaceUrl(), 50, 50); PictureRenderData signPicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getSignFaceUrl(), 50, 50); - itemMap.put("signPicture", signPicture); } if(!ObjectUtils.isEmpty(item.getExamFaceUrl())){ -// PictureRenderData examPicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + item.getExamFaceUrl(), PictureType.JPEG).size(50, 50).create();//网络图片地址 -// PictureRenderData examPicture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + item.getExamFaceUrl(), 50, 50); PictureRenderData examPicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getExamFaceUrl(), 50, 50); itemMap.put("examPicture", examPicture); } if(!ObjectUtils.isEmpty(item.getUserAvatarUrl())){ -// PictureRenderData facePicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + item.getUserAvatarUrl(), PictureType.JPEG).size(50, 50).style("rotation:90;").create();//网络图片地址 PictureRenderData facePicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getUserAvatarUrl(), 50, 50); itemMap.put("facePicture", facePicture); diff --git a/web-domain/src/main/java/com/zcloud/edu/domain/utils/ImageUtil.java b/web-domain/src/main/java/com/zcloud/edu/domain/utils/ImageUtil.java deleted file mode 100644 index ff8d92a..0000000 --- a/web-domain/src/main/java/com/zcloud/edu/domain/utils/ImageUtil.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.zcloud.edu.domain.utils; - -import com.deepoove.poi.data.PictureRenderData; -import com.deepoove.poi.data.PictureType; -import com.deepoove.poi.data.Pictures; -import net.coobird.thumbnailator.Thumbnails; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.net.URL; -import com.drew.imaging.ImageMetadataReader; -import com.drew.metadata.Metadata; -import com.drew.metadata.exif.ExifIFD0Directory; -import net.coobird.thumbnailator.resizers.configurations.ScalingMode; - -public class ImageUtil { - public static PictureRenderData createWithThumbnailator(String imageUrl, int width, int height) { - try { - URL url = new URL(imageUrl); - BufferedImage originalImage = ImageIO.read(url); - - int rotationAngle = getRotationAngleFromExif(url); - - // 使用Thumbnailator的增强配置 - Thumbnails.Builder builder = Thumbnails.of(originalImage) - .size(width, height) - .outputQuality(1.0) // 最高质量 - .imageType(BufferedImage.TYPE_INT_RGB) // 确保RGB类型 - .useOriginalFormat() // 保持原始格式 - .allowOverwrite(true); // 允许覆盖 - - // 设置缩放算法 - if (width * height > 100000) { // 大图使用双三次插值 - builder.scalingMode(ScalingMode.BICUBIC); - } else { - builder.scalingMode(ScalingMode.BILINEAR); - } - - BufferedImage processedImage; - if (rotationAngle != 0) { - processedImage = builder.rotate(rotationAngle).asBufferedImage(); - } else { - processedImage = builder.asBufferedImage(); - } - - // 使用ImageIO写入(设置更高的质量参数) - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ImageIO.write(processedImage, "jpg", baos); - - return Pictures.ofBytes(baos.toByteArray(), PictureType.JPEG) - .size(width, height) - .create(); - - } catch (Exception e) { - e.printStackTrace(); - return Pictures.ofUrl(imageUrl, PictureType.JPEG) - .size(width, height) - .create(); - } - } - /** - * 从EXIF读取需要旋转的角度 - * 返回:0-不需要旋转,90/180/270-需要旋转的角度 - */ - private static int getRotationAngleFromExif(URL url) { - try { - Metadata metadata = ImageMetadataReader.readMetadata(url.openStream()); - ExifIFD0Directory exifDir = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class); - - if (exifDir != null && exifDir.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) { - int orientation = exifDir.getInt(ExifIFD0Directory.TAG_ORIENTATION); - - // 根据Orientation值返回需要的旋转角度 [citation:9] - switch (orientation) { - case 3: // 需要旋转180度 - return 180; - case 6: // 需要顺时针旋转90度(最常见:手机竖拍) - return 90; - case 8: // 需要逆时针旋转90度 - return 270; - default: // 1或其他,不需要旋转 - return 0; - } - } - } catch (Exception e) { - // 忽略EXIF读取错误,返回0表示不旋转 - } - return 0; - } -}