diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java new file mode 100644 index 0000000..ec6f2d8 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.listeners.register; + +import com.casic.missiles.dto.business.file.CropPicture; +import com.spire.doc.fields.DocPicture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ImageTool { + + public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + // 读入大图 + File file = new File(cropPicture.getTargetImgUrl()); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); + ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); + // 计算每个小图的宽度和高度 + int chunkWidth = image.getWidth() / cropPicture.getCutCols(); + int chunkHeight = image.getHeight() / cropPicture.getCutRows(); + System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 + BufferedImage imgs[] = new BufferedImage[chunks]; + for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { + for (int y = 0; y < cropPicture.getCutCols(); y++) { + //设置小图的大小和类型 + imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType()); + //写入图像内容 + Graphics2D gr = imgs[count++].createGraphics(); + gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); + System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); + gr.dispose(); + } + } + List subfileUrls = new ArrayList<>(); + // 输出小图 + for (int i = 0; i < imgs.length; i++) { + subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); + System.out.println(i); + } + System.out.println("完成分割!"); + return subfileUrls; + } + + public static void main(String[] agrs) throws IOException { + String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; + // 读入大图 + File file = new File(originalImg); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + /* + * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) + * 起始坐标为(最小的x,最小的y) + * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) + * 此时的width为180,height为180 + */ + //切割图片 + BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D graphics2D = bf.createGraphics(); + graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); + graphics2D.dispose(); + //输出图片 + Random random = new Random(); + int j = random.nextInt(1000); + ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); + System.out.println("完成切割"); + } + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java new file mode 100644 index 0000000..ec6f2d8 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.listeners.register; + +import com.casic.missiles.dto.business.file.CropPicture; +import com.spire.doc.fields.DocPicture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ImageTool { + + public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + // 读入大图 + File file = new File(cropPicture.getTargetImgUrl()); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); + ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); + // 计算每个小图的宽度和高度 + int chunkWidth = image.getWidth() / cropPicture.getCutCols(); + int chunkHeight = image.getHeight() / cropPicture.getCutRows(); + System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 + BufferedImage imgs[] = new BufferedImage[chunks]; + for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { + for (int y = 0; y < cropPicture.getCutCols(); y++) { + //设置小图的大小和类型 + imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType()); + //写入图像内容 + Graphics2D gr = imgs[count++].createGraphics(); + gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); + System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); + gr.dispose(); + } + } + List subfileUrls = new ArrayList<>(); + // 输出小图 + for (int i = 0; i < imgs.length; i++) { + subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); + System.out.println(i); + } + System.out.println("完成分割!"); + return subfileUrls; + } + + public static void main(String[] agrs) throws IOException { + String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; + // 读入大图 + File file = new File(originalImg); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + /* + * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) + * 起始坐标为(最小的x,最小的y) + * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) + * 此时的width为180,height为180 + */ + //切割图片 + BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D graphics2D = bf.createGraphics(); + graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); + graphics2D.dispose(); + //输出图片 + Random random = new Random(); + int j = random.nextInt(1000); + ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); + System.out.println("完成切割"); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 6bb723f..9037b0c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java new file mode 100644 index 0000000..ec6f2d8 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.listeners.register; + +import com.casic.missiles.dto.business.file.CropPicture; +import com.spire.doc.fields.DocPicture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ImageTool { + + public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + // 读入大图 + File file = new File(cropPicture.getTargetImgUrl()); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); + ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); + // 计算每个小图的宽度和高度 + int chunkWidth = image.getWidth() / cropPicture.getCutCols(); + int chunkHeight = image.getHeight() / cropPicture.getCutRows(); + System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 + BufferedImage imgs[] = new BufferedImage[chunks]; + for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { + for (int y = 0; y < cropPicture.getCutCols(); y++) { + //设置小图的大小和类型 + imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType()); + //写入图像内容 + Graphics2D gr = imgs[count++].createGraphics(); + gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); + System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); + gr.dispose(); + } + } + List subfileUrls = new ArrayList<>(); + // 输出小图 + for (int i = 0; i < imgs.length; i++) { + subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); + System.out.println(i); + } + System.out.println("完成分割!"); + return subfileUrls; + } + + public static void main(String[] agrs) throws IOException { + String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; + // 读入大图 + File file = new File(originalImg); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + /* + * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) + * 起始坐标为(最小的x,最小的y) + * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) + * 此时的width为180,height为180 + */ + //切割图片 + BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D graphics2D = bf.createGraphics(); + graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); + graphics2D.dispose(); + //输出图片 + Random random = new Random(); + int j = random.nextInt(1000); + ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); + System.out.println("完成切割"); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 6bb723f..9037b0c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java deleted file mode 100644 index dae0927..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.casic.missiles.service.listeners.register.data; - -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerInfo; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.model.equipment.EquipmentFixedAssets; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; -import com.casic.missiles.service.customer.CustomerSampleService; -import com.casic.missiles.service.customer.CustomerService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; - -/** - * 参数填充创建类 - */ -@Component -@Slf4j -public class FileParamDataCreator { - @Autowired - private IBusinessOrderService businessOrderService; - @Autowired - private CustomerService customerService; - @Autowired - private CustomerSampleService customerSampleService; - @Autowired - private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; - private BusinessOrder businessOrder; - private Map fileParamData; - - FileParamDataCreator builder() { - fileParamData = new HashMap<>(); - return this; - } - - /** - * 基本年月日信息 - */ - FileParamDataCreator loadTime() { - Calendar now = Calendar.getInstance(); - now.setTime(new Date()); - fileParamData.put("y", now.get(Calendar.YEAR)); - fileParamData.put("m", now.get(Calendar.MONTH) + 1); - fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); - return this; - } - - /** - * 委托书信息 - */ - FileParamDataCreator businessOrder(Long orderId) { - businessOrder = businessOrderService.orderDetail(orderId); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - return this; - } - - /** - * 样品信息 - */ - FileParamDataCreator customerSample(Long sampleId) { - CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); - fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); - fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); - fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); - fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); - fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); - return this; - } - - /** - * 客户信息 - */ - FileParamDataCreator customerInfo() { - CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); - fileParamData.put("director", customerInfo.getCustomerName()); - fileParamData.put("customerPhone", customerInfo.getPhone()); - fileParamData.put("customerName", customerInfo.getCustomerName()); - fileParamData.put("customerNo", customerInfo.getCustomerNo()); - return this; - } - /** - * 外场检定查询测量设备 - */ - FileParamDataCreator equipmentFixedAssets(Long siteExecutiveLogId) { - try { - List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); - List> assetList = new ArrayList<>(); - equipmentFixedAssetList.forEach( - equipmentFixedAsset -> { - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); - equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); - equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); - equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); - assetList.add(equipmentFixedAssetsMap); - } - ); - fileParamData.put("assetList", assetList); - } catch (Exception ex) { - log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); - } - return this; - } - - Map build() { - return this.fileParamData; - } - -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java new file mode 100644 index 0000000..ec6f2d8 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.listeners.register; + +import com.casic.missiles.dto.business.file.CropPicture; +import com.spire.doc.fields.DocPicture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ImageTool { + + public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + // 读入大图 + File file = new File(cropPicture.getTargetImgUrl()); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); + ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); + // 计算每个小图的宽度和高度 + int chunkWidth = image.getWidth() / cropPicture.getCutCols(); + int chunkHeight = image.getHeight() / cropPicture.getCutRows(); + System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 + BufferedImage imgs[] = new BufferedImage[chunks]; + for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { + for (int y = 0; y < cropPicture.getCutCols(); y++) { + //设置小图的大小和类型 + imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType()); + //写入图像内容 + Graphics2D gr = imgs[count++].createGraphics(); + gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); + System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); + gr.dispose(); + } + } + List subfileUrls = new ArrayList<>(); + // 输出小图 + for (int i = 0; i < imgs.length; i++) { + subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); + System.out.println(i); + } + System.out.println("完成分割!"); + return subfileUrls; + } + + public static void main(String[] agrs) throws IOException { + String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; + // 读入大图 + File file = new File(originalImg); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + /* + * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) + * 起始坐标为(最小的x,最小的y) + * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) + * 此时的width为180,height为180 + */ + //切割图片 + BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D graphics2D = bf.createGraphics(); + graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); + graphics2D.dispose(); + //输出图片 + Random random = new Random(); + int j = random.nextInt(1000); + ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); + System.out.println("完成切割"); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 6bb723f..9037b0c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java deleted file mode 100644 index dae0927..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.casic.missiles.service.listeners.register.data; - -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerInfo; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.model.equipment.EquipmentFixedAssets; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; -import com.casic.missiles.service.customer.CustomerSampleService; -import com.casic.missiles.service.customer.CustomerService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; - -/** - * 参数填充创建类 - */ -@Component -@Slf4j -public class FileParamDataCreator { - @Autowired - private IBusinessOrderService businessOrderService; - @Autowired - private CustomerService customerService; - @Autowired - private CustomerSampleService customerSampleService; - @Autowired - private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; - private BusinessOrder businessOrder; - private Map fileParamData; - - FileParamDataCreator builder() { - fileParamData = new HashMap<>(); - return this; - } - - /** - * 基本年月日信息 - */ - FileParamDataCreator loadTime() { - Calendar now = Calendar.getInstance(); - now.setTime(new Date()); - fileParamData.put("y", now.get(Calendar.YEAR)); - fileParamData.put("m", now.get(Calendar.MONTH) + 1); - fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); - return this; - } - - /** - * 委托书信息 - */ - FileParamDataCreator businessOrder(Long orderId) { - businessOrder = businessOrderService.orderDetail(orderId); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - return this; - } - - /** - * 样品信息 - */ - FileParamDataCreator customerSample(Long sampleId) { - CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); - fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); - fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); - fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); - fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); - fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); - return this; - } - - /** - * 客户信息 - */ - FileParamDataCreator customerInfo() { - CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); - fileParamData.put("director", customerInfo.getCustomerName()); - fileParamData.put("customerPhone", customerInfo.getPhone()); - fileParamData.put("customerName", customerInfo.getCustomerName()); - fileParamData.put("customerNo", customerInfo.getCustomerNo()); - return this; - } - /** - * 外场检定查询测量设备 - */ - FileParamDataCreator equipmentFixedAssets(Long siteExecutiveLogId) { - try { - List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); - List> assetList = new ArrayList<>(); - equipmentFixedAssetList.forEach( - equipmentFixedAsset -> { - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); - equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); - equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); - equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); - assetList.add(equipmentFixedAssetsMap); - } - ); - fileParamData.put("assetList", assetList); - } catch (Exception ex) { - log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); - } - return this; - } - - Map build() { - return this.fileParamData; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java new file mode 100644 index 0000000..2d4681e --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -0,0 +1,115 @@ +package com.casic.missiles.service.listeners.register.data; + +import com.casic.missiles.model.business.BusinessOrder; +import com.casic.missiles.model.customer.CustomerInfo; +import com.casic.missiles.model.customer.CustomerSampleInfo; +import com.casic.missiles.model.equipment.EquipmentFixedAssets; +import com.casic.missiles.service.business.IBusinessOrderService; +import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; +import com.casic.missiles.service.customer.CustomerSampleService; +import com.casic.missiles.service.customer.CustomerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 参数填充创建类 + */ +@Component +@Slf4j +public class FileParamDataProvider { + @Autowired + private IBusinessOrderService businessOrderService; + @Autowired + private CustomerService customerService; + @Autowired + private CustomerSampleService customerSampleService; + @Autowired + private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; + private BusinessOrder businessOrder; + private Map fileParamData; + + FileParamDataProvider builder() { + fileParamData = new HashMap<>(); + return this; + } + + /** + * 基本年月日信息 + */ + FileParamDataProvider loadTime() { + Calendar now = Calendar.getInstance(); + now.setTime(new Date()); + fileParamData.put("y", now.get(Calendar.YEAR)); + fileParamData.put("m", now.get(Calendar.MONTH) + 1); + fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); + return this; + } + + /** + * 委托书信息 + */ + FileParamDataProvider businessOrder(Long orderId) { + businessOrder = businessOrderService.orderDetail(orderId); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + return this; + } + + /** + * 样品信息 + */ + FileParamDataProvider customerSample(Long sampleId) { + CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); + fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); + fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); + fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); + fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); + fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); + return this; + } + + /** + * 客户信息 + */ + FileParamDataProvider customerInfo() { + CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); + fileParamData.put("director", customerInfo.getCustomerName()); + fileParamData.put("customerPhone", customerInfo.getPhone()); + fileParamData.put("customerName", customerInfo.getCustomerName()); + fileParamData.put("customerNo", customerInfo.getCustomerNo()); + return this; + } + /** + * 外场检定查询测量设备 + */ + FileParamDataProvider equipmentFixedAssets(Long siteExecutiveLogId) { + try { + List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); + List> assetList = new ArrayList<>(); + equipmentFixedAssetList.forEach( + equipmentFixedAsset -> { + Map equipmentFixedAssetsMap = new HashMap<>(); + equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); + equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); + equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); + equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); + assetList.add(equipmentFixedAssetsMap); + } + ); + fileParamData.put("assetList", assetList); + } catch (Exception ex) { + log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); + } + return this; + } + + Map build() { + return this.fileParamData; + } + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java new file mode 100644 index 0000000..ec6f2d8 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.listeners.register; + +import com.casic.missiles.dto.business.file.CropPicture; +import com.spire.doc.fields.DocPicture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ImageTool { + + public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + // 读入大图 + File file = new File(cropPicture.getTargetImgUrl()); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); + ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); + // 计算每个小图的宽度和高度 + int chunkWidth = image.getWidth() / cropPicture.getCutCols(); + int chunkHeight = image.getHeight() / cropPicture.getCutRows(); + System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 + BufferedImage imgs[] = new BufferedImage[chunks]; + for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { + for (int y = 0; y < cropPicture.getCutCols(); y++) { + //设置小图的大小和类型 + imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType()); + //写入图像内容 + Graphics2D gr = imgs[count++].createGraphics(); + gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); + System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); + gr.dispose(); + } + } + List subfileUrls = new ArrayList<>(); + // 输出小图 + for (int i = 0; i < imgs.length; i++) { + subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); + System.out.println(i); + } + System.out.println("完成分割!"); + return subfileUrls; + } + + public static void main(String[] agrs) throws IOException { + String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; + // 读入大图 + File file = new File(originalImg); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + /* + * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) + * 起始坐标为(最小的x,最小的y) + * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) + * 此时的width为180,height为180 + */ + //切割图片 + BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D graphics2D = bf.createGraphics(); + graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); + graphics2D.dispose(); + //输出图片 + Random random = new Random(); + int j = random.nextInt(1000); + ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); + System.out.println("完成切割"); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 6bb723f..9037b0c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java deleted file mode 100644 index dae0927..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.casic.missiles.service.listeners.register.data; - -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerInfo; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.model.equipment.EquipmentFixedAssets; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; -import com.casic.missiles.service.customer.CustomerSampleService; -import com.casic.missiles.service.customer.CustomerService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; - -/** - * 参数填充创建类 - */ -@Component -@Slf4j -public class FileParamDataCreator { - @Autowired - private IBusinessOrderService businessOrderService; - @Autowired - private CustomerService customerService; - @Autowired - private CustomerSampleService customerSampleService; - @Autowired - private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; - private BusinessOrder businessOrder; - private Map fileParamData; - - FileParamDataCreator builder() { - fileParamData = new HashMap<>(); - return this; - } - - /** - * 基本年月日信息 - */ - FileParamDataCreator loadTime() { - Calendar now = Calendar.getInstance(); - now.setTime(new Date()); - fileParamData.put("y", now.get(Calendar.YEAR)); - fileParamData.put("m", now.get(Calendar.MONTH) + 1); - fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); - return this; - } - - /** - * 委托书信息 - */ - FileParamDataCreator businessOrder(Long orderId) { - businessOrder = businessOrderService.orderDetail(orderId); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - return this; - } - - /** - * 样品信息 - */ - FileParamDataCreator customerSample(Long sampleId) { - CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); - fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); - fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); - fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); - fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); - fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); - return this; - } - - /** - * 客户信息 - */ - FileParamDataCreator customerInfo() { - CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); - fileParamData.put("director", customerInfo.getCustomerName()); - fileParamData.put("customerPhone", customerInfo.getPhone()); - fileParamData.put("customerName", customerInfo.getCustomerName()); - fileParamData.put("customerNo", customerInfo.getCustomerNo()); - return this; - } - /** - * 外场检定查询测量设备 - */ - FileParamDataCreator equipmentFixedAssets(Long siteExecutiveLogId) { - try { - List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); - List> assetList = new ArrayList<>(); - equipmentFixedAssetList.forEach( - equipmentFixedAsset -> { - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); - equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); - equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); - equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); - assetList.add(equipmentFixedAssetsMap); - } - ); - fileParamData.put("assetList", assetList); - } catch (Exception ex) { - log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); - } - return this; - } - - Map build() { - return this.fileParamData; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java new file mode 100644 index 0000000..2d4681e --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -0,0 +1,115 @@ +package com.casic.missiles.service.listeners.register.data; + +import com.casic.missiles.model.business.BusinessOrder; +import com.casic.missiles.model.customer.CustomerInfo; +import com.casic.missiles.model.customer.CustomerSampleInfo; +import com.casic.missiles.model.equipment.EquipmentFixedAssets; +import com.casic.missiles.service.business.IBusinessOrderService; +import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; +import com.casic.missiles.service.customer.CustomerSampleService; +import com.casic.missiles.service.customer.CustomerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 参数填充创建类 + */ +@Component +@Slf4j +public class FileParamDataProvider { + @Autowired + private IBusinessOrderService businessOrderService; + @Autowired + private CustomerService customerService; + @Autowired + private CustomerSampleService customerSampleService; + @Autowired + private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; + private BusinessOrder businessOrder; + private Map fileParamData; + + FileParamDataProvider builder() { + fileParamData = new HashMap<>(); + return this; + } + + /** + * 基本年月日信息 + */ + FileParamDataProvider loadTime() { + Calendar now = Calendar.getInstance(); + now.setTime(new Date()); + fileParamData.put("y", now.get(Calendar.YEAR)); + fileParamData.put("m", now.get(Calendar.MONTH) + 1); + fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); + return this; + } + + /** + * 委托书信息 + */ + FileParamDataProvider businessOrder(Long orderId) { + businessOrder = businessOrderService.orderDetail(orderId); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + return this; + } + + /** + * 样品信息 + */ + FileParamDataProvider customerSample(Long sampleId) { + CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); + fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); + fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); + fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); + fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); + fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); + return this; + } + + /** + * 客户信息 + */ + FileParamDataProvider customerInfo() { + CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); + fileParamData.put("director", customerInfo.getCustomerName()); + fileParamData.put("customerPhone", customerInfo.getPhone()); + fileParamData.put("customerName", customerInfo.getCustomerName()); + fileParamData.put("customerNo", customerInfo.getCustomerNo()); + return this; + } + /** + * 外场检定查询测量设备 + */ + FileParamDataProvider equipmentFixedAssets(Long siteExecutiveLogId) { + try { + List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); + List> assetList = new ArrayList<>(); + equipmentFixedAssetList.forEach( + equipmentFixedAsset -> { + Map equipmentFixedAssetsMap = new HashMap<>(); + equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); + equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); + equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); + equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); + assetList.add(equipmentFixedAssetsMap); + } + ); + fileParamData.put("assetList", assetList); + } catch (Exception ex) { + log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); + } + return this; + } + + Map build() { + return this.fileParamData; + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index 0d0cd43..de89e27 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,6 +1,6 @@ package com.casic.missiles.service.listeners.register.data; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java new file mode 100644 index 0000000..ec6f2d8 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.listeners.register; + +import com.casic.missiles.dto.business.file.CropPicture; +import com.spire.doc.fields.DocPicture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ImageTool { + + public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + // 读入大图 + File file = new File(cropPicture.getTargetImgUrl()); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); + ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); + // 计算每个小图的宽度和高度 + int chunkWidth = image.getWidth() / cropPicture.getCutCols(); + int chunkHeight = image.getHeight() / cropPicture.getCutRows(); + System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 + BufferedImage imgs[] = new BufferedImage[chunks]; + for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { + for (int y = 0; y < cropPicture.getCutCols(); y++) { + //设置小图的大小和类型 + imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType()); + //写入图像内容 + Graphics2D gr = imgs[count++].createGraphics(); + gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); + System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); + gr.dispose(); + } + } + List subfileUrls = new ArrayList<>(); + // 输出小图 + for (int i = 0; i < imgs.length; i++) { + subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); + System.out.println(i); + } + System.out.println("完成分割!"); + return subfileUrls; + } + + public static void main(String[] agrs) throws IOException { + String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; + // 读入大图 + File file = new File(originalImg); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + /* + * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) + * 起始坐标为(最小的x,最小的y) + * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) + * 此时的width为180,height为180 + */ + //切割图片 + BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D graphics2D = bf.createGraphics(); + graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); + graphics2D.dispose(); + //输出图片 + Random random = new Random(); + int j = random.nextInt(1000); + ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); + System.out.println("完成切割"); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 6bb723f..9037b0c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java deleted file mode 100644 index dae0927..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.casic.missiles.service.listeners.register.data; - -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerInfo; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.model.equipment.EquipmentFixedAssets; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; -import com.casic.missiles.service.customer.CustomerSampleService; -import com.casic.missiles.service.customer.CustomerService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; - -/** - * 参数填充创建类 - */ -@Component -@Slf4j -public class FileParamDataCreator { - @Autowired - private IBusinessOrderService businessOrderService; - @Autowired - private CustomerService customerService; - @Autowired - private CustomerSampleService customerSampleService; - @Autowired - private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; - private BusinessOrder businessOrder; - private Map fileParamData; - - FileParamDataCreator builder() { - fileParamData = new HashMap<>(); - return this; - } - - /** - * 基本年月日信息 - */ - FileParamDataCreator loadTime() { - Calendar now = Calendar.getInstance(); - now.setTime(new Date()); - fileParamData.put("y", now.get(Calendar.YEAR)); - fileParamData.put("m", now.get(Calendar.MONTH) + 1); - fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); - return this; - } - - /** - * 委托书信息 - */ - FileParamDataCreator businessOrder(Long orderId) { - businessOrder = businessOrderService.orderDetail(orderId); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - return this; - } - - /** - * 样品信息 - */ - FileParamDataCreator customerSample(Long sampleId) { - CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); - fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); - fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); - fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); - fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); - fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); - return this; - } - - /** - * 客户信息 - */ - FileParamDataCreator customerInfo() { - CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); - fileParamData.put("director", customerInfo.getCustomerName()); - fileParamData.put("customerPhone", customerInfo.getPhone()); - fileParamData.put("customerName", customerInfo.getCustomerName()); - fileParamData.put("customerNo", customerInfo.getCustomerNo()); - return this; - } - /** - * 外场检定查询测量设备 - */ - FileParamDataCreator equipmentFixedAssets(Long siteExecutiveLogId) { - try { - List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); - List> assetList = new ArrayList<>(); - equipmentFixedAssetList.forEach( - equipmentFixedAsset -> { - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); - equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); - equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); - equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); - assetList.add(equipmentFixedAssetsMap); - } - ); - fileParamData.put("assetList", assetList); - } catch (Exception ex) { - log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); - } - return this; - } - - Map build() { - return this.fileParamData; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java new file mode 100644 index 0000000..2d4681e --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -0,0 +1,115 @@ +package com.casic.missiles.service.listeners.register.data; + +import com.casic.missiles.model.business.BusinessOrder; +import com.casic.missiles.model.customer.CustomerInfo; +import com.casic.missiles.model.customer.CustomerSampleInfo; +import com.casic.missiles.model.equipment.EquipmentFixedAssets; +import com.casic.missiles.service.business.IBusinessOrderService; +import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; +import com.casic.missiles.service.customer.CustomerSampleService; +import com.casic.missiles.service.customer.CustomerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 参数填充创建类 + */ +@Component +@Slf4j +public class FileParamDataProvider { + @Autowired + private IBusinessOrderService businessOrderService; + @Autowired + private CustomerService customerService; + @Autowired + private CustomerSampleService customerSampleService; + @Autowired + private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; + private BusinessOrder businessOrder; + private Map fileParamData; + + FileParamDataProvider builder() { + fileParamData = new HashMap<>(); + return this; + } + + /** + * 基本年月日信息 + */ + FileParamDataProvider loadTime() { + Calendar now = Calendar.getInstance(); + now.setTime(new Date()); + fileParamData.put("y", now.get(Calendar.YEAR)); + fileParamData.put("m", now.get(Calendar.MONTH) + 1); + fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); + return this; + } + + /** + * 委托书信息 + */ + FileParamDataProvider businessOrder(Long orderId) { + businessOrder = businessOrderService.orderDetail(orderId); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + return this; + } + + /** + * 样品信息 + */ + FileParamDataProvider customerSample(Long sampleId) { + CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); + fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); + fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); + fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); + fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); + fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); + return this; + } + + /** + * 客户信息 + */ + FileParamDataProvider customerInfo() { + CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); + fileParamData.put("director", customerInfo.getCustomerName()); + fileParamData.put("customerPhone", customerInfo.getPhone()); + fileParamData.put("customerName", customerInfo.getCustomerName()); + fileParamData.put("customerNo", customerInfo.getCustomerNo()); + return this; + } + /** + * 外场检定查询测量设备 + */ + FileParamDataProvider equipmentFixedAssets(Long siteExecutiveLogId) { + try { + List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); + List> assetList = new ArrayList<>(); + equipmentFixedAssetList.forEach( + equipmentFixedAsset -> { + Map equipmentFixedAssetsMap = new HashMap<>(); + equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); + equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); + equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); + equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); + assetList.add(equipmentFixedAssetsMap); + } + ); + fileParamData.put("assetList", assetList); + } catch (Exception ex) { + log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); + } + return this; + } + + Map build() { + return this.fileParamData; + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index 0d0cd43..de89e27 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,6 +1,6 @@ package com.casic.missiles.service.listeners.register.data; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index a5e780b..2d50b62 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -1,14 +1,9 @@ package com.casic.missiles.service.listeners.register.data; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.customer.CustomerSampleService; import com.casic.missiles.service.flowable.ApprovalOperateService; import com.casic.missiles.service.listeners.register.FileImageTemplateProvider; import org.apache.commons.collections.CollectionUtils; @@ -33,7 +28,7 @@ protected PrintFileRegisterMapper fileRegisterMapper; @Resource - private FileParamDataCreator fileParamDataCreator; + private FileParamDataProvider fileParamDataCreator; /** * 初始化文件数据注册信息 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java new file mode 100644 index 0000000..ec6f2d8 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.listeners.register; + +import com.casic.missiles.dto.business.file.CropPicture; +import com.spire.doc.fields.DocPicture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ImageTool { + + public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + // 读入大图 + File file = new File(cropPicture.getTargetImgUrl()); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); + ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); + // 计算每个小图的宽度和高度 + int chunkWidth = image.getWidth() / cropPicture.getCutCols(); + int chunkHeight = image.getHeight() / cropPicture.getCutRows(); + System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 + BufferedImage imgs[] = new BufferedImage[chunks]; + for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { + for (int y = 0; y < cropPicture.getCutCols(); y++) { + //设置小图的大小和类型 + imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType()); + //写入图像内容 + Graphics2D gr = imgs[count++].createGraphics(); + gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); + System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); + gr.dispose(); + } + } + List subfileUrls = new ArrayList<>(); + // 输出小图 + for (int i = 0; i < imgs.length; i++) { + subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); + System.out.println(i); + } + System.out.println("完成分割!"); + return subfileUrls; + } + + public static void main(String[] agrs) throws IOException { + String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; + // 读入大图 + File file = new File(originalImg); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + /* + * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) + * 起始坐标为(最小的x,最小的y) + * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) + * 此时的width为180,height为180 + */ + //切割图片 + BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D graphics2D = bf.createGraphics(); + graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); + graphics2D.dispose(); + //输出图片 + Random random = new Random(); + int j = random.nextInt(1000); + ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); + System.out.println("完成切割"); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 6bb723f..9037b0c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java deleted file mode 100644 index dae0927..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.casic.missiles.service.listeners.register.data; - -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerInfo; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.model.equipment.EquipmentFixedAssets; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; -import com.casic.missiles.service.customer.CustomerSampleService; -import com.casic.missiles.service.customer.CustomerService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; - -/** - * 参数填充创建类 - */ -@Component -@Slf4j -public class FileParamDataCreator { - @Autowired - private IBusinessOrderService businessOrderService; - @Autowired - private CustomerService customerService; - @Autowired - private CustomerSampleService customerSampleService; - @Autowired - private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; - private BusinessOrder businessOrder; - private Map fileParamData; - - FileParamDataCreator builder() { - fileParamData = new HashMap<>(); - return this; - } - - /** - * 基本年月日信息 - */ - FileParamDataCreator loadTime() { - Calendar now = Calendar.getInstance(); - now.setTime(new Date()); - fileParamData.put("y", now.get(Calendar.YEAR)); - fileParamData.put("m", now.get(Calendar.MONTH) + 1); - fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); - return this; - } - - /** - * 委托书信息 - */ - FileParamDataCreator businessOrder(Long orderId) { - businessOrder = businessOrderService.orderDetail(orderId); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - return this; - } - - /** - * 样品信息 - */ - FileParamDataCreator customerSample(Long sampleId) { - CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); - fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); - fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); - fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); - fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); - fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); - return this; - } - - /** - * 客户信息 - */ - FileParamDataCreator customerInfo() { - CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); - fileParamData.put("director", customerInfo.getCustomerName()); - fileParamData.put("customerPhone", customerInfo.getPhone()); - fileParamData.put("customerName", customerInfo.getCustomerName()); - fileParamData.put("customerNo", customerInfo.getCustomerNo()); - return this; - } - /** - * 外场检定查询测量设备 - */ - FileParamDataCreator equipmentFixedAssets(Long siteExecutiveLogId) { - try { - List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); - List> assetList = new ArrayList<>(); - equipmentFixedAssetList.forEach( - equipmentFixedAsset -> { - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); - equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); - equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); - equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); - assetList.add(equipmentFixedAssetsMap); - } - ); - fileParamData.put("assetList", assetList); - } catch (Exception ex) { - log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); - } - return this; - } - - Map build() { - return this.fileParamData; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java new file mode 100644 index 0000000..2d4681e --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -0,0 +1,115 @@ +package com.casic.missiles.service.listeners.register.data; + +import com.casic.missiles.model.business.BusinessOrder; +import com.casic.missiles.model.customer.CustomerInfo; +import com.casic.missiles.model.customer.CustomerSampleInfo; +import com.casic.missiles.model.equipment.EquipmentFixedAssets; +import com.casic.missiles.service.business.IBusinessOrderService; +import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; +import com.casic.missiles.service.customer.CustomerSampleService; +import com.casic.missiles.service.customer.CustomerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 参数填充创建类 + */ +@Component +@Slf4j +public class FileParamDataProvider { + @Autowired + private IBusinessOrderService businessOrderService; + @Autowired + private CustomerService customerService; + @Autowired + private CustomerSampleService customerSampleService; + @Autowired + private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; + private BusinessOrder businessOrder; + private Map fileParamData; + + FileParamDataProvider builder() { + fileParamData = new HashMap<>(); + return this; + } + + /** + * 基本年月日信息 + */ + FileParamDataProvider loadTime() { + Calendar now = Calendar.getInstance(); + now.setTime(new Date()); + fileParamData.put("y", now.get(Calendar.YEAR)); + fileParamData.put("m", now.get(Calendar.MONTH) + 1); + fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); + return this; + } + + /** + * 委托书信息 + */ + FileParamDataProvider businessOrder(Long orderId) { + businessOrder = businessOrderService.orderDetail(orderId); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + return this; + } + + /** + * 样品信息 + */ + FileParamDataProvider customerSample(Long sampleId) { + CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); + fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); + fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); + fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); + fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); + fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); + return this; + } + + /** + * 客户信息 + */ + FileParamDataProvider customerInfo() { + CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); + fileParamData.put("director", customerInfo.getCustomerName()); + fileParamData.put("customerPhone", customerInfo.getPhone()); + fileParamData.put("customerName", customerInfo.getCustomerName()); + fileParamData.put("customerNo", customerInfo.getCustomerNo()); + return this; + } + /** + * 外场检定查询测量设备 + */ + FileParamDataProvider equipmentFixedAssets(Long siteExecutiveLogId) { + try { + List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); + List> assetList = new ArrayList<>(); + equipmentFixedAssetList.forEach( + equipmentFixedAsset -> { + Map equipmentFixedAssetsMap = new HashMap<>(); + equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); + equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); + equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); + equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); + assetList.add(equipmentFixedAssetsMap); + } + ); + fileParamData.put("assetList", assetList); + } catch (Exception ex) { + log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); + } + return this; + } + + Map build() { + return this.fileParamData; + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index 0d0cd43..de89e27 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,6 +1,6 @@ package com.casic.missiles.service.listeners.register.data; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index a5e780b..2d50b62 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -1,14 +1,9 @@ package com.casic.missiles.service.listeners.register.data; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.customer.CustomerSampleService; import com.casic.missiles.service.flowable.ApprovalOperateService; import com.casic.missiles.service.listeners.register.FileImageTemplateProvider; import org.apache.commons.collections.CollectionUtils; @@ -33,7 +28,7 @@ protected PrintFileRegisterMapper fileRegisterMapper; @Resource - private FileParamDataCreator fileParamDataCreator; + private FileParamDataProvider fileParamDataCreator; /** * 初始化文件数据注册信息 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java index 9103f2e..890411d 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register.data.certificate; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java new file mode 100644 index 0000000..ec6f2d8 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.listeners.register; + +import com.casic.missiles.dto.business.file.CropPicture; +import com.spire.doc.fields.DocPicture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ImageTool { + + public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + // 读入大图 + File file = new File(cropPicture.getTargetImgUrl()); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); + ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); + // 计算每个小图的宽度和高度 + int chunkWidth = image.getWidth() / cropPicture.getCutCols(); + int chunkHeight = image.getHeight() / cropPicture.getCutRows(); + System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 + BufferedImage imgs[] = new BufferedImage[chunks]; + for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { + for (int y = 0; y < cropPicture.getCutCols(); y++) { + //设置小图的大小和类型 + imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType()); + //写入图像内容 + Graphics2D gr = imgs[count++].createGraphics(); + gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); + System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); + gr.dispose(); + } + } + List subfileUrls = new ArrayList<>(); + // 输出小图 + for (int i = 0; i < imgs.length; i++) { + subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); + System.out.println(i); + } + System.out.println("完成分割!"); + return subfileUrls; + } + + public static void main(String[] agrs) throws IOException { + String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; + // 读入大图 + File file = new File(originalImg); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + /* + * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) + * 起始坐标为(最小的x,最小的y) + * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) + * 此时的width为180,height为180 + */ + //切割图片 + BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D graphics2D = bf.createGraphics(); + graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); + graphics2D.dispose(); + //输出图片 + Random random = new Random(); + int j = random.nextInt(1000); + ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); + System.out.println("完成切割"); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 6bb723f..9037b0c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java deleted file mode 100644 index dae0927..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.casic.missiles.service.listeners.register.data; - -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerInfo; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.model.equipment.EquipmentFixedAssets; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; -import com.casic.missiles.service.customer.CustomerSampleService; -import com.casic.missiles.service.customer.CustomerService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; - -/** - * 参数填充创建类 - */ -@Component -@Slf4j -public class FileParamDataCreator { - @Autowired - private IBusinessOrderService businessOrderService; - @Autowired - private CustomerService customerService; - @Autowired - private CustomerSampleService customerSampleService; - @Autowired - private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; - private BusinessOrder businessOrder; - private Map fileParamData; - - FileParamDataCreator builder() { - fileParamData = new HashMap<>(); - return this; - } - - /** - * 基本年月日信息 - */ - FileParamDataCreator loadTime() { - Calendar now = Calendar.getInstance(); - now.setTime(new Date()); - fileParamData.put("y", now.get(Calendar.YEAR)); - fileParamData.put("m", now.get(Calendar.MONTH) + 1); - fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); - return this; - } - - /** - * 委托书信息 - */ - FileParamDataCreator businessOrder(Long orderId) { - businessOrder = businessOrderService.orderDetail(orderId); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - return this; - } - - /** - * 样品信息 - */ - FileParamDataCreator customerSample(Long sampleId) { - CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); - fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); - fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); - fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); - fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); - fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); - return this; - } - - /** - * 客户信息 - */ - FileParamDataCreator customerInfo() { - CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); - fileParamData.put("director", customerInfo.getCustomerName()); - fileParamData.put("customerPhone", customerInfo.getPhone()); - fileParamData.put("customerName", customerInfo.getCustomerName()); - fileParamData.put("customerNo", customerInfo.getCustomerNo()); - return this; - } - /** - * 外场检定查询测量设备 - */ - FileParamDataCreator equipmentFixedAssets(Long siteExecutiveLogId) { - try { - List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); - List> assetList = new ArrayList<>(); - equipmentFixedAssetList.forEach( - equipmentFixedAsset -> { - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); - equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); - equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); - equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); - assetList.add(equipmentFixedAssetsMap); - } - ); - fileParamData.put("assetList", assetList); - } catch (Exception ex) { - log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); - } - return this; - } - - Map build() { - return this.fileParamData; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java new file mode 100644 index 0000000..2d4681e --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -0,0 +1,115 @@ +package com.casic.missiles.service.listeners.register.data; + +import com.casic.missiles.model.business.BusinessOrder; +import com.casic.missiles.model.customer.CustomerInfo; +import com.casic.missiles.model.customer.CustomerSampleInfo; +import com.casic.missiles.model.equipment.EquipmentFixedAssets; +import com.casic.missiles.service.business.IBusinessOrderService; +import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; +import com.casic.missiles.service.customer.CustomerSampleService; +import com.casic.missiles.service.customer.CustomerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 参数填充创建类 + */ +@Component +@Slf4j +public class FileParamDataProvider { + @Autowired + private IBusinessOrderService businessOrderService; + @Autowired + private CustomerService customerService; + @Autowired + private CustomerSampleService customerSampleService; + @Autowired + private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; + private BusinessOrder businessOrder; + private Map fileParamData; + + FileParamDataProvider builder() { + fileParamData = new HashMap<>(); + return this; + } + + /** + * 基本年月日信息 + */ + FileParamDataProvider loadTime() { + Calendar now = Calendar.getInstance(); + now.setTime(new Date()); + fileParamData.put("y", now.get(Calendar.YEAR)); + fileParamData.put("m", now.get(Calendar.MONTH) + 1); + fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); + return this; + } + + /** + * 委托书信息 + */ + FileParamDataProvider businessOrder(Long orderId) { + businessOrder = businessOrderService.orderDetail(orderId); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + return this; + } + + /** + * 样品信息 + */ + FileParamDataProvider customerSample(Long sampleId) { + CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); + fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); + fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); + fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); + fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); + fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); + return this; + } + + /** + * 客户信息 + */ + FileParamDataProvider customerInfo() { + CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); + fileParamData.put("director", customerInfo.getCustomerName()); + fileParamData.put("customerPhone", customerInfo.getPhone()); + fileParamData.put("customerName", customerInfo.getCustomerName()); + fileParamData.put("customerNo", customerInfo.getCustomerNo()); + return this; + } + /** + * 外场检定查询测量设备 + */ + FileParamDataProvider equipmentFixedAssets(Long siteExecutiveLogId) { + try { + List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); + List> assetList = new ArrayList<>(); + equipmentFixedAssetList.forEach( + equipmentFixedAsset -> { + Map equipmentFixedAssetsMap = new HashMap<>(); + equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); + equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); + equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); + equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); + assetList.add(equipmentFixedAssetsMap); + } + ); + fileParamData.put("assetList", assetList); + } catch (Exception ex) { + log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); + } + return this; + } + + Map build() { + return this.fileParamData; + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index 0d0cd43..de89e27 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,6 +1,6 @@ package com.casic.missiles.service.listeners.register.data; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index a5e780b..2d50b62 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -1,14 +1,9 @@ package com.casic.missiles.service.listeners.register.data; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.customer.CustomerSampleService; import com.casic.missiles.service.flowable.ApprovalOperateService; import com.casic.missiles.service.listeners.register.FileImageTemplateProvider; import org.apache.commons.collections.CollectionUtils; @@ -33,7 +28,7 @@ protected PrintFileRegisterMapper fileRegisterMapper; @Resource - private FileParamDataCreator fileParamDataCreator; + private FileParamDataProvider fileParamDataCreator; /** * 初始化文件数据注册信息 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java index 9103f2e..890411d 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register.data.certificate; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java index f38a04c..4033a12 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register.data.certificate; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java new file mode 100644 index 0000000..ec6f2d8 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.listeners.register; + +import com.casic.missiles.dto.business.file.CropPicture; +import com.spire.doc.fields.DocPicture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ImageTool { + + public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + // 读入大图 + File file = new File(cropPicture.getTargetImgUrl()); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); + ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); + // 计算每个小图的宽度和高度 + int chunkWidth = image.getWidth() / cropPicture.getCutCols(); + int chunkHeight = image.getHeight() / cropPicture.getCutRows(); + System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 + BufferedImage imgs[] = new BufferedImage[chunks]; + for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { + for (int y = 0; y < cropPicture.getCutCols(); y++) { + //设置小图的大小和类型 + imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType()); + //写入图像内容 + Graphics2D gr = imgs[count++].createGraphics(); + gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); + System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); + gr.dispose(); + } + } + List subfileUrls = new ArrayList<>(); + // 输出小图 + for (int i = 0; i < imgs.length; i++) { + subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); + System.out.println(i); + } + System.out.println("完成分割!"); + return subfileUrls; + } + + public static void main(String[] agrs) throws IOException { + String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; + // 读入大图 + File file = new File(originalImg); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + /* + * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) + * 起始坐标为(最小的x,最小的y) + * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) + * 此时的width为180,height为180 + */ + //切割图片 + BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D graphics2D = bf.createGraphics(); + graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); + graphics2D.dispose(); + //输出图片 + Random random = new Random(); + int j = random.nextInt(1000); + ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); + System.out.println("完成切割"); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 6bb723f..9037b0c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java deleted file mode 100644 index dae0927..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.casic.missiles.service.listeners.register.data; - -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerInfo; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.model.equipment.EquipmentFixedAssets; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; -import com.casic.missiles.service.customer.CustomerSampleService; -import com.casic.missiles.service.customer.CustomerService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; - -/** - * 参数填充创建类 - */ -@Component -@Slf4j -public class FileParamDataCreator { - @Autowired - private IBusinessOrderService businessOrderService; - @Autowired - private CustomerService customerService; - @Autowired - private CustomerSampleService customerSampleService; - @Autowired - private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; - private BusinessOrder businessOrder; - private Map fileParamData; - - FileParamDataCreator builder() { - fileParamData = new HashMap<>(); - return this; - } - - /** - * 基本年月日信息 - */ - FileParamDataCreator loadTime() { - Calendar now = Calendar.getInstance(); - now.setTime(new Date()); - fileParamData.put("y", now.get(Calendar.YEAR)); - fileParamData.put("m", now.get(Calendar.MONTH) + 1); - fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); - return this; - } - - /** - * 委托书信息 - */ - FileParamDataCreator businessOrder(Long orderId) { - businessOrder = businessOrderService.orderDetail(orderId); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - return this; - } - - /** - * 样品信息 - */ - FileParamDataCreator customerSample(Long sampleId) { - CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); - fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); - fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); - fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); - fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); - fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); - return this; - } - - /** - * 客户信息 - */ - FileParamDataCreator customerInfo() { - CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); - fileParamData.put("director", customerInfo.getCustomerName()); - fileParamData.put("customerPhone", customerInfo.getPhone()); - fileParamData.put("customerName", customerInfo.getCustomerName()); - fileParamData.put("customerNo", customerInfo.getCustomerNo()); - return this; - } - /** - * 外场检定查询测量设备 - */ - FileParamDataCreator equipmentFixedAssets(Long siteExecutiveLogId) { - try { - List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); - List> assetList = new ArrayList<>(); - equipmentFixedAssetList.forEach( - equipmentFixedAsset -> { - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); - equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); - equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); - equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); - assetList.add(equipmentFixedAssetsMap); - } - ); - fileParamData.put("assetList", assetList); - } catch (Exception ex) { - log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); - } - return this; - } - - Map build() { - return this.fileParamData; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java new file mode 100644 index 0000000..2d4681e --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -0,0 +1,115 @@ +package com.casic.missiles.service.listeners.register.data; + +import com.casic.missiles.model.business.BusinessOrder; +import com.casic.missiles.model.customer.CustomerInfo; +import com.casic.missiles.model.customer.CustomerSampleInfo; +import com.casic.missiles.model.equipment.EquipmentFixedAssets; +import com.casic.missiles.service.business.IBusinessOrderService; +import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; +import com.casic.missiles.service.customer.CustomerSampleService; +import com.casic.missiles.service.customer.CustomerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 参数填充创建类 + */ +@Component +@Slf4j +public class FileParamDataProvider { + @Autowired + private IBusinessOrderService businessOrderService; + @Autowired + private CustomerService customerService; + @Autowired + private CustomerSampleService customerSampleService; + @Autowired + private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; + private BusinessOrder businessOrder; + private Map fileParamData; + + FileParamDataProvider builder() { + fileParamData = new HashMap<>(); + return this; + } + + /** + * 基本年月日信息 + */ + FileParamDataProvider loadTime() { + Calendar now = Calendar.getInstance(); + now.setTime(new Date()); + fileParamData.put("y", now.get(Calendar.YEAR)); + fileParamData.put("m", now.get(Calendar.MONTH) + 1); + fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); + return this; + } + + /** + * 委托书信息 + */ + FileParamDataProvider businessOrder(Long orderId) { + businessOrder = businessOrderService.orderDetail(orderId); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + return this; + } + + /** + * 样品信息 + */ + FileParamDataProvider customerSample(Long sampleId) { + CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); + fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); + fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); + fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); + fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); + fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); + return this; + } + + /** + * 客户信息 + */ + FileParamDataProvider customerInfo() { + CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); + fileParamData.put("director", customerInfo.getCustomerName()); + fileParamData.put("customerPhone", customerInfo.getPhone()); + fileParamData.put("customerName", customerInfo.getCustomerName()); + fileParamData.put("customerNo", customerInfo.getCustomerNo()); + return this; + } + /** + * 外场检定查询测量设备 + */ + FileParamDataProvider equipmentFixedAssets(Long siteExecutiveLogId) { + try { + List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); + List> assetList = new ArrayList<>(); + equipmentFixedAssetList.forEach( + equipmentFixedAsset -> { + Map equipmentFixedAssetsMap = new HashMap<>(); + equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); + equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); + equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); + equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); + assetList.add(equipmentFixedAssetsMap); + } + ); + fileParamData.put("assetList", assetList); + } catch (Exception ex) { + log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); + } + return this; + } + + Map build() { + return this.fileParamData; + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index 0d0cd43..de89e27 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,6 +1,6 @@ package com.casic.missiles.service.listeners.register.data; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index a5e780b..2d50b62 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -1,14 +1,9 @@ package com.casic.missiles.service.listeners.register.data; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.customer.CustomerSampleService; import com.casic.missiles.service.flowable.ApprovalOperateService; import com.casic.missiles.service.listeners.register.FileImageTemplateProvider; import org.apache.commons.collections.CollectionUtils; @@ -33,7 +28,7 @@ protected PrintFileRegisterMapper fileRegisterMapper; @Resource - private FileParamDataCreator fileParamDataCreator; + private FileParamDataProvider fileParamDataCreator; /** * 初始化文件数据注册信息 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java index 9103f2e..890411d 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register.data.certificate; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java index f38a04c..4033a12 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register.data.certificate; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java index 49864ae..902ac9e 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java @@ -2,10 +2,9 @@ import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessSiteExecutiveInfo; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; @@ -50,7 +49,6 @@ calibrationDataParams.put("executiveAddress", metaData.getExecutiveAddress()); calibrationDataParams.put("siteExecutiveName", metaData.getSiteExecutiveName()); // environmentDataParams.put("zeroVoltage", metaData.getZeroGroundVoltage()); - calibrationDataParams.put("executiveAddress", metaData.getExecutiveAddress()); calibrationDataParams.put("executiveEnvironment", metaData.getExecutiveEnvironment()); return calibrationDataParams; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java deleted file mode 100644 index 81821fd..0000000 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/FilePrintRegister.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.casic.missiles.dto.business.certificate; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -/** - * @author cz - * 打印图片注册表信息 - */ -@Data -public class FilePrintRegister { - - /** - * 模板文件的目录 - */ - private String templatePath; - /** - * - */ - private String temDir; - /** - * 生成文件名 - */ - private String fileName; - /** - * 生成文件名 - */ - private Long fileNameId; - /** - * 模板参数 - */ - private Map params; - - - private List beDownloadedFileNames; - - /** - * electronicSealList 填充的电子图片信息 - */ - List electronicImageList; -} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java new file mode 100644 index 0000000..6ffc3d8 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/CropPicture.java @@ -0,0 +1,35 @@ +package com.casic.missiles.dto.business.file; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CropPicture { + + /** + * 目标图片路径 + */ + private String targetImgUrl; + + /** + * 行切割次数 + */ + private Integer cutRows; + /** + * 列切割次数 + */ + private Integer cutCols; + + /** + * 子文件存放路径 + */ + private String subfileUrl; + + /** + * 子文件的类型.jpg .png等类型 + */ + private String subfileType; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java new file mode 100644 index 0000000..700e38a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -0,0 +1,44 @@ +package com.casic.missiles.dto.business.file; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 打印图片注册表信息 + */ +@Data +public class FilePrintRegister { + + /** + * 模板文件的目录 + */ + private String templatePath; + /** + * + */ + private String temDir; + /** + * 生成文件名 + */ + private String fileName; + /** + * 生成文件名 + */ + private Long fileNameId; + /** + * 模板参数 + */ + private Map params; + + + private List beDownloadedFileNames; + + /** + * electronicSealList 填充的电子图片信息 + */ + List electronicImageList; +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index bb5c6a7..89d9200 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.CropPicture; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -60,7 +62,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - if(CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())){ + if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { //按关键字进行分组 Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) @@ -72,7 +74,6 @@ List electronicSeals = entry.getValue(); addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); } - //获取没有关键字的图片,即绝对路径的图片 List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) @@ -81,6 +82,8 @@ for (ElectronicImage absolutePathImage : absolutePathImageList) { addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); } + //由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + } // 4、将新word转化为pdf文件 wordToPdf(wordNewUrl, pdfNewUrl); @@ -158,6 +161,7 @@ docPicture.setWidth(electronicSeal.getStampWidth()); docPicture.setHeight(electronicSeal.getStampHeight()); } + //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); @@ -254,8 +258,6 @@ document.loadFromFile(wordOldUrl); //获取指定段落 Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); //log.info("获取文档内容段落总数{}",count); Paragraph paragraph = section.getParagraphs().get(0); @@ -428,70 +430,62 @@ } } + public static void main(String[] args) throws RuntimeException { -// String pathUrl = "D:\\tmp\\1640635147069263874"; -// String localPathUrl = "D:\\tmp\\1640635147069263874"; + String pathUrl = "D:\\casic\\tmp\\1645701777117741057"; + String localPathUrl = "D:\\casic\\tmp\\1645701777117741057"; +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); +// BufferedImage bii = convertLayout(bi, alpha); +// //生成透明背景图片 +// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); // -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage bi = readImage(pathUrl + "/sign1_1678844113422.png"); -//// BufferedImage bii = convertLayout(bi, alpha); -//// //生成透明背景图片 -//// saveFile(bii, "PNG", localPathUrl + "\\sign3.png"); -//// -//// //文件与BufferedImage间的转换 -//// //读取图片 -//// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); -//// BufferedImage b0 = convertLayout(b, alpha); -//// //生成透明背景图片 -//// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); -// -// -// // 目标文件地址 -// String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; -// // 添加电子印章后文件存放地址 -// String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; -// //WORD转PDF存放位置 -// String pdfNewUrl = localPathUrl + "\\tem.pdf"; -// //电子印章图片地址 -// String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; -// //电子签名图片地址 -// String stampSealImgUrl = localPathUrl + "\\sign1_1678844113422.png"; -// // word文档内容关键字 -// String keyWord = "批准人"; -// FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); -// List electronicSealList = new ArrayList(11); -// int count = 0; -// ElectronicImage electronicImage = defaultElectronicSignName("批准人"); -// electronicImage.setElectronicSealImageUrl(stampNameImgUr); -// electronicSealList.add(electronicImage); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); -// // 将新word转化为pdf文件 -// electronicImage = defaultElectronicSignSeal("", 0); -// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -// electronicSealList.add(electronicImage); -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -// -//// electronicImage=defaultElectronicSignSeal("",120f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); -//// electronicImage=defaultElectronicSignSeal("",240f); -//// electronicImage.setElectronicSealImageUrl(stampSealImgUrl); -//// electronicSealList.add(electronicImage); -//// addAbsolutePathStamp(wordOldUrl, wordNewUrl, electronicImage); +// //文件与BufferedImage间的转换 +// //读取图片 +// BufferedImage b = readImage(pathUrl + "/name1_1678844060471.png"); +// BufferedImage b0 = convertLayout(b, alpha); +// //生成透明背景图片 +// saveFile(b0, "PNG", localPathUrl + "\\name3.png"); + // 目标文件地址 + String wordOldUrl = pathUrl + "\\测试_1680242558223.docx"; + // 添加电子印章后文件存放地址 + String wordNewUrl = localPathUrl + "\\测试_1680242558223.docx"; + //WORD转PDF存放位置 + String pdfNewUrl = localPathUrl + "\\tem.pdf"; + //电子印章图片地址 + String stampNameImgUr = localPathUrl + "\\name1_1678844060471.png"; + //电子签名图片地址 + String stampSealImgUrl = localPathUrl + "\\ceshi.jpg"; + // word文档内容关键字 + FilePrintRegisterUtils addStampUtils = new FilePrintRegisterUtils(); + List electronicSealList = new ArrayList(11); + + ElectronicImage electronicImage = defaultElectronicSignName("批准人"); + electronicImage.setElectronicSealImageUrl(stampNameImgUr); + electronicSealList.add(electronicImage); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); + //加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取段落总数 + int count = document.getPageCount(); + System.out.println(count); + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture=CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(count) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType("."+imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + try{ + ImageTool.crosswiseCutting(cropPicture); + }catch (IOException ex){ + + } // // 将新word转化为pdf文件 // addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - Map params = new HashMap<>(); - List> assetList = new ArrayList<>(); - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("name", "2334"); - equipmentFixedAssetsMap.put("assetNo", "no1"); - equipmentFixedAssetsMap.put("assetModel", "机甲"); - equipmentFixedAssetsMap.put("validDate", "2023-04-19"); - assetList.add(equipmentFixedAssetsMap); - params.put("assetList", assetList); - exportWord("D:\\casic\\tmp\\检定审批单_1681870127973.docx", "D:\\casic\\tmp\\", "12315.docx", params); } protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java new file mode 100644 index 0000000..ec6f2d8 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.listeners.register; + +import com.casic.missiles.dto.business.file.CropPicture; +import com.spire.doc.fields.DocPicture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ImageTool { + + public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + // 读入大图 + File file = new File(cropPicture.getTargetImgUrl()); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); + ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); + // 计算每个小图的宽度和高度 + int chunkWidth = image.getWidth() / cropPicture.getCutCols(); + int chunkHeight = image.getHeight() / cropPicture.getCutRows(); + System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 + BufferedImage imgs[] = new BufferedImage[chunks]; + for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { + for (int y = 0; y < cropPicture.getCutCols(); y++) { + //设置小图的大小和类型 + imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType()); + //写入图像内容 + Graphics2D gr = imgs[count++].createGraphics(); + gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); + System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); + gr.dispose(); + } + } + List subfileUrls = new ArrayList<>(); + // 输出小图 + for (int i = 0; i < imgs.length; i++) { + subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); + System.out.println(i); + } + System.out.println("完成分割!"); + return subfileUrls; + } + + public static void main(String[] agrs) throws IOException { + String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; + // 读入大图 + File file = new File(originalImg); + FileInputStream fis = new FileInputStream(file); + System.out.println(file.exists()); + BufferedImage image = ImageIO.read(fis); + /* + * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) + * 起始坐标为(最小的x,最小的y) + * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) + * 此时的width为180,height为180 + */ + //切割图片 + BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D graphics2D = bf.createGraphics(); + graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); + graphics2D.dispose(); + //输出图片 + Random random = new Random(); + int j = random.nextInt(1000); + ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); + System.out.println("完成切割"); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 6bb723f..9037b0c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java deleted file mode 100644 index dae0927..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataCreator.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.casic.missiles.service.listeners.register.data; - -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerInfo; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.model.equipment.EquipmentFixedAssets; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; -import com.casic.missiles.service.customer.CustomerSampleService; -import com.casic.missiles.service.customer.CustomerService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; - -/** - * 参数填充创建类 - */ -@Component -@Slf4j -public class FileParamDataCreator { - @Autowired - private IBusinessOrderService businessOrderService; - @Autowired - private CustomerService customerService; - @Autowired - private CustomerSampleService customerSampleService; - @Autowired - private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; - private BusinessOrder businessOrder; - private Map fileParamData; - - FileParamDataCreator builder() { - fileParamData = new HashMap<>(); - return this; - } - - /** - * 基本年月日信息 - */ - FileParamDataCreator loadTime() { - Calendar now = Calendar.getInstance(); - now.setTime(new Date()); - fileParamData.put("y", now.get(Calendar.YEAR)); - fileParamData.put("m", now.get(Calendar.MONTH) + 1); - fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); - return this; - } - - /** - * 委托书信息 - */ - FileParamDataCreator businessOrder(Long orderId) { - businessOrder = businessOrderService.orderDetail(orderId); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - fileParamData.put("customerName", businessOrder.getCustomerName()); - fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); - return this; - } - - /** - * 样品信息 - */ - FileParamDataCreator customerSample(Long sampleId) { - CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); - fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); - fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); - fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); - fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); - fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); - return this; - } - - /** - * 客户信息 - */ - FileParamDataCreator customerInfo() { - CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); - fileParamData.put("director", customerInfo.getCustomerName()); - fileParamData.put("customerPhone", customerInfo.getPhone()); - fileParamData.put("customerName", customerInfo.getCustomerName()); - fileParamData.put("customerNo", customerInfo.getCustomerNo()); - return this; - } - /** - * 外场检定查询测量设备 - */ - FileParamDataCreator equipmentFixedAssets(Long siteExecutiveLogId) { - try { - List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); - List> assetList = new ArrayList<>(); - equipmentFixedAssetList.forEach( - equipmentFixedAsset -> { - Map equipmentFixedAssetsMap = new HashMap<>(); - equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); - equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); - equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); - equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); - assetList.add(equipmentFixedAssetsMap); - } - ); - fileParamData.put("assetList", assetList); - } catch (Exception ex) { - log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); - } - return this; - } - - Map build() { - return this.fileParamData; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java new file mode 100644 index 0000000..2d4681e --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -0,0 +1,115 @@ +package com.casic.missiles.service.listeners.register.data; + +import com.casic.missiles.model.business.BusinessOrder; +import com.casic.missiles.model.customer.CustomerInfo; +import com.casic.missiles.model.customer.CustomerSampleInfo; +import com.casic.missiles.model.equipment.EquipmentFixedAssets; +import com.casic.missiles.service.business.IBusinessOrderService; +import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; +import com.casic.missiles.service.customer.CustomerSampleService; +import com.casic.missiles.service.customer.CustomerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 参数填充创建类 + */ +@Component +@Slf4j +public class FileParamDataProvider { + @Autowired + private IBusinessOrderService businessOrderService; + @Autowired + private CustomerService customerService; + @Autowired + private CustomerSampleService customerSampleService; + @Autowired + private IBusinessSiteExecutiveInfoEquipmentRelationService equipmentRelationInfoService; + private BusinessOrder businessOrder; + private Map fileParamData; + + FileParamDataProvider builder() { + fileParamData = new HashMap<>(); + return this; + } + + /** + * 基本年月日信息 + */ + FileParamDataProvider loadTime() { + Calendar now = Calendar.getInstance(); + now.setTime(new Date()); + fileParamData.put("y", now.get(Calendar.YEAR)); + fileParamData.put("m", now.get(Calendar.MONTH) + 1); + fileParamData.put("d", now.get(Calendar.DAY_OF_MONTH)); + return this; + } + + /** + * 委托书信息 + */ + FileParamDataProvider businessOrder(Long orderId) { + businessOrder = businessOrderService.orderDetail(orderId); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + fileParamData.put("customerName", businessOrder.getCustomerName()); + fileParamData.put("customerAddress", businessOrder.getCustomerAddress()); + return this; + } + + /** + * 样品信息 + */ + FileParamDataProvider customerSample(Long sampleId) { + CustomerSampleInfo customerSampleInfo = customerSampleService.sampleDetail(sampleId); + fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); + fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); + fileParamData.put("customerAddress", customerSampleInfo.getCustomerAddress()); + fileParamData.put("deliverer", customerSampleInfo.getDeliverer()); + fileParamData.put("delivererTel", customerSampleInfo.getDelivererTel()); + return this; + } + + /** + * 客户信息 + */ + FileParamDataProvider customerInfo() { + CustomerInfo customerInfo = customerService.customerDetail(businessOrder.getCustomerId()); + fileParamData.put("director", customerInfo.getCustomerName()); + fileParamData.put("customerPhone", customerInfo.getPhone()); + fileParamData.put("customerName", customerInfo.getCustomerName()); + fileParamData.put("customerNo", customerInfo.getCustomerNo()); + return this; + } + /** + * 外场检定查询测量设备 + */ + FileParamDataProvider equipmentFixedAssets(Long siteExecutiveLogId) { + try { + List equipmentFixedAssetList = equipmentRelationInfoService.getEquipmentsByExecutiveInfoId(siteExecutiveLogId); + List> assetList = new ArrayList<>(); + equipmentFixedAssetList.forEach( + equipmentFixedAsset -> { + Map equipmentFixedAssetsMap = new HashMap<>(); + equipmentFixedAssetsMap.put("assetName", equipmentFixedAsset.getEquipmentName()); + equipmentFixedAssetsMap.put("assetNo", equipmentFixedAsset.getEquipmentNo()); + equipmentFixedAssetsMap.put("assetModel", equipmentFixedAsset.getModelNo()); + equipmentFixedAssetsMap.put("validDate", equipmentFixedAsset.getValidDate()); + assetList.add(equipmentFixedAssetsMap); + } + ); + fileParamData.put("assetList", assetList); + } catch (Exception ex) { + log.error("query EquipmentFixedAssets table is fail,the id is {},the message is {}", siteExecutiveLogId, ex); + } + return this; + } + + Map build() { + return this.fileParamData; + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index 0d0cd43..de89e27 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,6 +1,6 @@ package com.casic.missiles.service.listeners.register.data; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index a5e780b..2d50b62 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -1,14 +1,9 @@ package com.casic.missiles.service.listeners.register.data; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.model.business.BusinessOrder; -import com.casic.missiles.model.customer.CustomerSampleInfo; -import com.casic.missiles.service.business.IBusinessOrderService; -import com.casic.missiles.service.customer.CustomerSampleService; import com.casic.missiles.service.flowable.ApprovalOperateService; import com.casic.missiles.service.listeners.register.FileImageTemplateProvider; import org.apache.commons.collections.CollectionUtils; @@ -33,7 +28,7 @@ protected PrintFileRegisterMapper fileRegisterMapper; @Resource - private FileParamDataCreator fileParamDataCreator; + private FileParamDataProvider fileParamDataCreator; /** * 初始化文件数据注册信息 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java index 9103f2e..890411d 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register.data.certificate; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java index f38a04c..4033a12 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java @@ -1,7 +1,7 @@ package com.casic.missiles.service.listeners.register.data.certificate; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java index 49864ae..902ac9e 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java @@ -2,10 +2,9 @@ import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessSiteExecutiveInfo; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; @@ -50,7 +49,6 @@ calibrationDataParams.put("executiveAddress", metaData.getExecutiveAddress()); calibrationDataParams.put("siteExecutiveName", metaData.getSiteExecutiveName()); // environmentDataParams.put("zeroVoltage", metaData.getZeroGroundVoltage()); - calibrationDataParams.put("executiveAddress", metaData.getExecutiveAddress()); calibrationDataParams.put("executiveEnvironment", metaData.getExecutiveEnvironment()); return calibrationDataParams; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/EnvironmentalRecordData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/EnvironmentalRecordData.java index ba5c568..f144866 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/EnvironmentalRecordData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/EnvironmentalRecordData.java @@ -2,21 +2,18 @@ import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.mapper.meter.MeterStaffMapper; import com.casic.missiles.model.business.BusinessSiteExecutiveEquipmentRelation; import com.casic.missiles.model.business.BusinessSiteExecutiveLog; import com.casic.missiles.model.equipment.EquipmentFixedAssets; -import com.casic.missiles.modular.system.dao.UserMapper; -import com.casic.missiles.service.business.IBusinessSiteExecutiveInfoEquipmentRelationService; import com.casic.missiles.service.equipment.IEquipmentFixedAssetsService; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;