diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java new file mode 100644 index 0000000..957858e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 校准证书参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.CALIBRATION_CERTIFICATE_BEAN) +public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java new file mode 100644 index 0000000..957858e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 校准证书参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.CALIBRATION_CERTIFICATE_BEAN) +public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java new file mode 100644 index 0000000..bcf5607 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 测试报告参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.TEST_REPORT_BEAN) +public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java new file mode 100644 index 0000000..957858e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 校准证书参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.CALIBRATION_CERTIFICATE_BEAN) +public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java new file mode 100644 index 0000000..bcf5607 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 测试报告参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.TEST_REPORT_BEAN) +public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java deleted file mode 100644 index 3f30be3..0000000 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java +++ /dev/null @@ -1,472 +0,0 @@ -package com.casic.missiles.utils; - - -import cn.afterturn.easypoi.word.WordExportUtil; -import cn.hutool.core.lang.Assert; -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.spire.doc.*; -import com.spire.doc.documents.*; -import com.spire.doc.fields.DocPicture; -import com.spire.doc.fields.TextRange; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; -import java.util.ArrayList; -import java.util.Map; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author:zt - * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 - * @Version:1.0 - */ - -public class StampUtils { - - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - // 电子印章水平位置 - private final static float horizontal = 300f; - // 电子印章垂直位置 - private final static float vertical = -55f; - // 电子印章宽度 - private final static float stampWidth = 120; - // 电子印章高度 - private final static float stampHeight = 120; - //照片透明度设置 - private final static int alpha = 150; - - - /** - * @param filePrintRegister 标准文件注册表 - */ - public static void filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { - //1、按照模板填充数据,并导出word - String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 - for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { - BufferedImage bi = readImage(electronicSeal.getElectronicSealImgeUrl()); - BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); - String stampImgUrl = electronicSeal.getElectronicSealImgeUrl(); - String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; - String[] imageCutOffContents = stampImgUrl.split("."); - electronicSeal.setElectronicSealImgeUrl(imagePath); - saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); - } - //按关键字进行分组 - Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); - // 初始化world,pdf名称参数 - String[] filePrintType = filePrintRegister.getTemplatePath().split("."); - String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; - String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; - //3、根据关键字进行添加签章和签字 - for (Map.Entry> entry : sameKeySealMaps.entrySet()) { - String mapKey = entry.getKey(); - List electronicSeals = entry.getValue(); - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); - } - // 4、将新word转化为pdf文件 - wordToPdf(wordNewUrl, pdfNewUrl); - } - - /** - * 按照模板 填充数据生成word 只支持docx - * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 - */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); - Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); - if (!temDir.endsWith("/")) { - temDir = temDir + File.separator; - } - File dir = new File(temDir); - if (!dir.getParentFile().exists()) { - // 新建文件夹 - dir.getParentFile().mkdirs(); - } - String tmpPath = ""; - try { - XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); - doc.write(fos); - fos.flush(); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - return tmpPath; - } - - - /** - * 将相同关键字的印章添加到同一个位置进行打印 - * 1、根据关键词位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 - */ - private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImgeUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); - } - Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImgeUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(horizontal); - //垂直位置 - docPicture.setVerticalPosition(vertical); - //设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - } - //保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); - } - - /** - * 替换书签名位置文本内容 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newBookmarkText 新文本内容 - */ - private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 - bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); - } - - /** - * word转PDF - * - * @param wordNewUrl word文件路径 - * @param pdfNewUrl 存储新PDF文件路径 - */ - public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { -// 将新Word文档转换为PDF文件 - Document document = new Document(); - document.loadFromFile(wordNewUrl); - document.saveToFile(pdfNewUrl, FileFormat.PDF); - document.dispose(); - } - /** - * 图片透明背景转换 - * - * @param imgsrc - * @param alpha - * @return - */ - public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { - try { - //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 - BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); - int width = imgsrc.getWidth(); - int height = imgsrc.getHeight(); - for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i++) { - int rgb = imgsrc.getRGB(i, j); - Color color = new Color(rgb); - Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); - back.setRGB(i, j, newcolor.getRGB()); - } - } - return back; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - - /** - * 1、自定义位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param stampImgUrl 电子印章图片路径 - * @param horizontal 电子印章水平位置 (当前文件推荐260f) - * @param vertical 电子印章垂直位置 (当前推荐455f) - * @param stampWidth 电子印章宽度(推荐120) - * @param stampHeight 电子印章高度(推荐120) - * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 - * @param newBookmarkText 替换的文本新内容 - */ - public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, - Float horizontal, Float vertical, Float stampWidth, - Float stampHeight, String bookmarkName, String newBookmarkText) { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(bookmarkName)) { - replaceBookmarkContent(document, bookmarkName, newBookmarkText); - } - -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(stampImgUrl); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(horizontal); -// 垂直位置 - docPicture.setVerticalPosition(vertical); - -// 设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - - // 保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); - - } - - - /** - * 替换书签名位置文本内容为图片 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newImgUrl 图片地址 - */ - public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //添加图片,替换原有书签内容 - Paragraph para = new Paragraph(document); - para.appendPicture(newImgUrl); - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(para); - bookmarksNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 替换书签名位置文本内容为表格 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - */ - public void replaceBookmarkContentToTable(Document document, String bookmarkName) { - //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - - //创建表格 - Table table = new Table(document, true); - table.resetCells(4, 3); - for (int i = 0; i < data.length; i++) { - TableRow dataRow = table.getRows().get(i); - for (int j = 0; j < data[i].length; j++) { - TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); - range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); - range.getCharacterFormat().setFontName("楷体"); - dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); - dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); - } - } - - //创建TextBodyPart对象 - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(table); - - //定位到指定书签位置 - BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); - bookmarkNavigator.moveToBookmark(bookmarkName); - - //使用表格替换原书签的内容 - bookmarkNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - /** - * 流转文件 - * - * @param buf 流字节数组 - * @param filePath 新文件路径 - * @param fileName 新文件名称 - */ - public void byte2File(byte[] buf, String filePath, String fileName) { - BufferedOutputStream bos = null; - FileOutputStream fos = null; - File file = null; - try { - File dir = new File(filePath); - if (!dir.exists() && dir.isDirectory()) { - dir.mkdirs(); - } - file = new File(filePath + File.separator + fileName); - fos = new FileOutputStream(file); - bos = new BufferedOutputStream(fos); - bos.write(buf); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (bos != null) { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String[] args) throws RuntimeException { - - String pathUrl = "D:\\cz\\upload"; - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage bi = readImage(pathUrl + "\\sign1.png"); - BufferedImage bii = convertLayout(bi, alpha); - //生成透明背景图片 - saveFile(bii, "PNG", pathUrl + "\\sign3.png"); - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage b = readImage(pathUrl + "\\name1.png"); - BufferedImage b0 = convertLayout(b, alpha); - //生成透明背景图片 - saveFile(b0, "PNG", pathUrl + "\\name3.png"); - - // 目标文件地址 - String wordOldUrl = pathUrl + "\\wordExport.docx"; - - // 添加电子印章后文件存放地址 - String wordNewUrl = pathUrl + "\\tem.docx"; - //WORD转PDF存放位置 - String pdfNewUrl = pathUrl + "\\tem.pdf"; - //电子印章图片地址 - String stampImgUrl = pathUrl + "\\sign3.png"; - //电子签名图片地址 - String stampImgUrl1 = pathUrl + "\\name3.png"; - // word文档内容关键字 - String keyWord = "盖章"; - StampUtils addStampUtils = new StampUtils(); - List electronicSealList = new ArrayList(11); - int count = 0; - for (; count < 2; count++) { - ElectronicImage electronicSeal = new ElectronicImage(); - String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; - electronicSeal.setElectronicSealImgeUrl(tempStampImgUrl); - electronicSeal.setMereFlag(count == 1); - electronicSeal.setKeyWord(keyWord); - electronicSeal.setKeyWordIndex(keyWordIndex); - electronicSeal.setHorizontal(horizontal); - electronicSeal.setVertical(vertical); - electronicSeal.setStampHeight(stampHeight); - electronicSeal.setStampWidth(stampWidth); - electronicSealList.add(electronicSeal); - } - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); - // 将新word转化为pdf文件 - addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - } -} \ No newline at end of file diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java new file mode 100644 index 0000000..957858e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 校准证书参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.CALIBRATION_CERTIFICATE_BEAN) +public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java new file mode 100644 index 0000000..bcf5607 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 测试报告参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.TEST_REPORT_BEAN) +public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java deleted file mode 100644 index 3f30be3..0000000 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java +++ /dev/null @@ -1,472 +0,0 @@ -package com.casic.missiles.utils; - - -import cn.afterturn.easypoi.word.WordExportUtil; -import cn.hutool.core.lang.Assert; -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.spire.doc.*; -import com.spire.doc.documents.*; -import com.spire.doc.fields.DocPicture; -import com.spire.doc.fields.TextRange; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; -import java.util.ArrayList; -import java.util.Map; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author:zt - * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 - * @Version:1.0 - */ - -public class StampUtils { - - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - // 电子印章水平位置 - private final static float horizontal = 300f; - // 电子印章垂直位置 - private final static float vertical = -55f; - // 电子印章宽度 - private final static float stampWidth = 120; - // 电子印章高度 - private final static float stampHeight = 120; - //照片透明度设置 - private final static int alpha = 150; - - - /** - * @param filePrintRegister 标准文件注册表 - */ - public static void filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { - //1、按照模板填充数据,并导出word - String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 - for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { - BufferedImage bi = readImage(electronicSeal.getElectronicSealImgeUrl()); - BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); - String stampImgUrl = electronicSeal.getElectronicSealImgeUrl(); - String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; - String[] imageCutOffContents = stampImgUrl.split("."); - electronicSeal.setElectronicSealImgeUrl(imagePath); - saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); - } - //按关键字进行分组 - Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); - // 初始化world,pdf名称参数 - String[] filePrintType = filePrintRegister.getTemplatePath().split("."); - String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; - String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; - //3、根据关键字进行添加签章和签字 - for (Map.Entry> entry : sameKeySealMaps.entrySet()) { - String mapKey = entry.getKey(); - List electronicSeals = entry.getValue(); - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); - } - // 4、将新word转化为pdf文件 - wordToPdf(wordNewUrl, pdfNewUrl); - } - - /** - * 按照模板 填充数据生成word 只支持docx - * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 - */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); - Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); - if (!temDir.endsWith("/")) { - temDir = temDir + File.separator; - } - File dir = new File(temDir); - if (!dir.getParentFile().exists()) { - // 新建文件夹 - dir.getParentFile().mkdirs(); - } - String tmpPath = ""; - try { - XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); - doc.write(fos); - fos.flush(); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - return tmpPath; - } - - - /** - * 将相同关键字的印章添加到同一个位置进行打印 - * 1、根据关键词位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 - */ - private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImgeUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); - } - Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImgeUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(horizontal); - //垂直位置 - docPicture.setVerticalPosition(vertical); - //设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - } - //保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); - } - - /** - * 替换书签名位置文本内容 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newBookmarkText 新文本内容 - */ - private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 - bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); - } - - /** - * word转PDF - * - * @param wordNewUrl word文件路径 - * @param pdfNewUrl 存储新PDF文件路径 - */ - public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { -// 将新Word文档转换为PDF文件 - Document document = new Document(); - document.loadFromFile(wordNewUrl); - document.saveToFile(pdfNewUrl, FileFormat.PDF); - document.dispose(); - } - /** - * 图片透明背景转换 - * - * @param imgsrc - * @param alpha - * @return - */ - public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { - try { - //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 - BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); - int width = imgsrc.getWidth(); - int height = imgsrc.getHeight(); - for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i++) { - int rgb = imgsrc.getRGB(i, j); - Color color = new Color(rgb); - Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); - back.setRGB(i, j, newcolor.getRGB()); - } - } - return back; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - - /** - * 1、自定义位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param stampImgUrl 电子印章图片路径 - * @param horizontal 电子印章水平位置 (当前文件推荐260f) - * @param vertical 电子印章垂直位置 (当前推荐455f) - * @param stampWidth 电子印章宽度(推荐120) - * @param stampHeight 电子印章高度(推荐120) - * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 - * @param newBookmarkText 替换的文本新内容 - */ - public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, - Float horizontal, Float vertical, Float stampWidth, - Float stampHeight, String bookmarkName, String newBookmarkText) { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(bookmarkName)) { - replaceBookmarkContent(document, bookmarkName, newBookmarkText); - } - -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(stampImgUrl); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(horizontal); -// 垂直位置 - docPicture.setVerticalPosition(vertical); - -// 设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - - // 保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); - - } - - - /** - * 替换书签名位置文本内容为图片 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newImgUrl 图片地址 - */ - public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //添加图片,替换原有书签内容 - Paragraph para = new Paragraph(document); - para.appendPicture(newImgUrl); - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(para); - bookmarksNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 替换书签名位置文本内容为表格 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - */ - public void replaceBookmarkContentToTable(Document document, String bookmarkName) { - //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - - //创建表格 - Table table = new Table(document, true); - table.resetCells(4, 3); - for (int i = 0; i < data.length; i++) { - TableRow dataRow = table.getRows().get(i); - for (int j = 0; j < data[i].length; j++) { - TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); - range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); - range.getCharacterFormat().setFontName("楷体"); - dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); - dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); - } - } - - //创建TextBodyPart对象 - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(table); - - //定位到指定书签位置 - BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); - bookmarkNavigator.moveToBookmark(bookmarkName); - - //使用表格替换原书签的内容 - bookmarkNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - /** - * 流转文件 - * - * @param buf 流字节数组 - * @param filePath 新文件路径 - * @param fileName 新文件名称 - */ - public void byte2File(byte[] buf, String filePath, String fileName) { - BufferedOutputStream bos = null; - FileOutputStream fos = null; - File file = null; - try { - File dir = new File(filePath); - if (!dir.exists() && dir.isDirectory()) { - dir.mkdirs(); - } - file = new File(filePath + File.separator + fileName); - fos = new FileOutputStream(file); - bos = new BufferedOutputStream(fos); - bos.write(buf); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (bos != null) { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String[] args) throws RuntimeException { - - String pathUrl = "D:\\cz\\upload"; - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage bi = readImage(pathUrl + "\\sign1.png"); - BufferedImage bii = convertLayout(bi, alpha); - //生成透明背景图片 - saveFile(bii, "PNG", pathUrl + "\\sign3.png"); - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage b = readImage(pathUrl + "\\name1.png"); - BufferedImage b0 = convertLayout(b, alpha); - //生成透明背景图片 - saveFile(b0, "PNG", pathUrl + "\\name3.png"); - - // 目标文件地址 - String wordOldUrl = pathUrl + "\\wordExport.docx"; - - // 添加电子印章后文件存放地址 - String wordNewUrl = pathUrl + "\\tem.docx"; - //WORD转PDF存放位置 - String pdfNewUrl = pathUrl + "\\tem.pdf"; - //电子印章图片地址 - String stampImgUrl = pathUrl + "\\sign3.png"; - //电子签名图片地址 - String stampImgUrl1 = pathUrl + "\\name3.png"; - // word文档内容关键字 - String keyWord = "盖章"; - StampUtils addStampUtils = new StampUtils(); - List electronicSealList = new ArrayList(11); - int count = 0; - for (; count < 2; count++) { - ElectronicImage electronicSeal = new ElectronicImage(); - String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; - electronicSeal.setElectronicSealImgeUrl(tempStampImgUrl); - electronicSeal.setMereFlag(count == 1); - electronicSeal.setKeyWord(keyWord); - electronicSeal.setKeyWordIndex(keyWordIndex); - electronicSeal.setHorizontal(horizontal); - electronicSeal.setVertical(vertical); - electronicSeal.setStampHeight(stampHeight); - electronicSeal.setStampWidth(stampWidth); - electronicSealList.add(electronicSeal); - } - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); - // 将新word转化为pdf文件 - addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - } -} \ No newline at end of file diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java new file mode 100644 index 0000000..324a8a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java @@ -0,0 +1,14 @@ +package com.casic.missiles.mapper.sys; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface PrintFileRegisterMapper { + + @Select(" SELECT minio_file_name " + + " FROM ${tableName} " + + " where id =#{id}} ") + String getFileNameById(@Param("id")Long id,@Param("tableName")String tableName); +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java new file mode 100644 index 0000000..957858e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 校准证书参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.CALIBRATION_CERTIFICATE_BEAN) +public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java new file mode 100644 index 0000000..bcf5607 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 测试报告参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.TEST_REPORT_BEAN) +public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java deleted file mode 100644 index 3f30be3..0000000 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java +++ /dev/null @@ -1,472 +0,0 @@ -package com.casic.missiles.utils; - - -import cn.afterturn.easypoi.word.WordExportUtil; -import cn.hutool.core.lang.Assert; -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.spire.doc.*; -import com.spire.doc.documents.*; -import com.spire.doc.fields.DocPicture; -import com.spire.doc.fields.TextRange; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; -import java.util.ArrayList; -import java.util.Map; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author:zt - * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 - * @Version:1.0 - */ - -public class StampUtils { - - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - // 电子印章水平位置 - private final static float horizontal = 300f; - // 电子印章垂直位置 - private final static float vertical = -55f; - // 电子印章宽度 - private final static float stampWidth = 120; - // 电子印章高度 - private final static float stampHeight = 120; - //照片透明度设置 - private final static int alpha = 150; - - - /** - * @param filePrintRegister 标准文件注册表 - */ - public static void filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { - //1、按照模板填充数据,并导出word - String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 - for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { - BufferedImage bi = readImage(electronicSeal.getElectronicSealImgeUrl()); - BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); - String stampImgUrl = electronicSeal.getElectronicSealImgeUrl(); - String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; - String[] imageCutOffContents = stampImgUrl.split("."); - electronicSeal.setElectronicSealImgeUrl(imagePath); - saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); - } - //按关键字进行分组 - Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); - // 初始化world,pdf名称参数 - String[] filePrintType = filePrintRegister.getTemplatePath().split("."); - String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; - String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; - //3、根据关键字进行添加签章和签字 - for (Map.Entry> entry : sameKeySealMaps.entrySet()) { - String mapKey = entry.getKey(); - List electronicSeals = entry.getValue(); - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); - } - // 4、将新word转化为pdf文件 - wordToPdf(wordNewUrl, pdfNewUrl); - } - - /** - * 按照模板 填充数据生成word 只支持docx - * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 - */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); - Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); - if (!temDir.endsWith("/")) { - temDir = temDir + File.separator; - } - File dir = new File(temDir); - if (!dir.getParentFile().exists()) { - // 新建文件夹 - dir.getParentFile().mkdirs(); - } - String tmpPath = ""; - try { - XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); - doc.write(fos); - fos.flush(); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - return tmpPath; - } - - - /** - * 将相同关键字的印章添加到同一个位置进行打印 - * 1、根据关键词位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 - */ - private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImgeUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); - } - Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImgeUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(horizontal); - //垂直位置 - docPicture.setVerticalPosition(vertical); - //设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - } - //保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); - } - - /** - * 替换书签名位置文本内容 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newBookmarkText 新文本内容 - */ - private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 - bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); - } - - /** - * word转PDF - * - * @param wordNewUrl word文件路径 - * @param pdfNewUrl 存储新PDF文件路径 - */ - public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { -// 将新Word文档转换为PDF文件 - Document document = new Document(); - document.loadFromFile(wordNewUrl); - document.saveToFile(pdfNewUrl, FileFormat.PDF); - document.dispose(); - } - /** - * 图片透明背景转换 - * - * @param imgsrc - * @param alpha - * @return - */ - public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { - try { - //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 - BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); - int width = imgsrc.getWidth(); - int height = imgsrc.getHeight(); - for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i++) { - int rgb = imgsrc.getRGB(i, j); - Color color = new Color(rgb); - Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); - back.setRGB(i, j, newcolor.getRGB()); - } - } - return back; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - - /** - * 1、自定义位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param stampImgUrl 电子印章图片路径 - * @param horizontal 电子印章水平位置 (当前文件推荐260f) - * @param vertical 电子印章垂直位置 (当前推荐455f) - * @param stampWidth 电子印章宽度(推荐120) - * @param stampHeight 电子印章高度(推荐120) - * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 - * @param newBookmarkText 替换的文本新内容 - */ - public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, - Float horizontal, Float vertical, Float stampWidth, - Float stampHeight, String bookmarkName, String newBookmarkText) { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(bookmarkName)) { - replaceBookmarkContent(document, bookmarkName, newBookmarkText); - } - -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(stampImgUrl); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(horizontal); -// 垂直位置 - docPicture.setVerticalPosition(vertical); - -// 设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - - // 保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); - - } - - - /** - * 替换书签名位置文本内容为图片 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newImgUrl 图片地址 - */ - public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //添加图片,替换原有书签内容 - Paragraph para = new Paragraph(document); - para.appendPicture(newImgUrl); - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(para); - bookmarksNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 替换书签名位置文本内容为表格 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - */ - public void replaceBookmarkContentToTable(Document document, String bookmarkName) { - //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - - //创建表格 - Table table = new Table(document, true); - table.resetCells(4, 3); - for (int i = 0; i < data.length; i++) { - TableRow dataRow = table.getRows().get(i); - for (int j = 0; j < data[i].length; j++) { - TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); - range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); - range.getCharacterFormat().setFontName("楷体"); - dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); - dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); - } - } - - //创建TextBodyPart对象 - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(table); - - //定位到指定书签位置 - BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); - bookmarkNavigator.moveToBookmark(bookmarkName); - - //使用表格替换原书签的内容 - bookmarkNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - /** - * 流转文件 - * - * @param buf 流字节数组 - * @param filePath 新文件路径 - * @param fileName 新文件名称 - */ - public void byte2File(byte[] buf, String filePath, String fileName) { - BufferedOutputStream bos = null; - FileOutputStream fos = null; - File file = null; - try { - File dir = new File(filePath); - if (!dir.exists() && dir.isDirectory()) { - dir.mkdirs(); - } - file = new File(filePath + File.separator + fileName); - fos = new FileOutputStream(file); - bos = new BufferedOutputStream(fos); - bos.write(buf); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (bos != null) { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String[] args) throws RuntimeException { - - String pathUrl = "D:\\cz\\upload"; - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage bi = readImage(pathUrl + "\\sign1.png"); - BufferedImage bii = convertLayout(bi, alpha); - //生成透明背景图片 - saveFile(bii, "PNG", pathUrl + "\\sign3.png"); - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage b = readImage(pathUrl + "\\name1.png"); - BufferedImage b0 = convertLayout(b, alpha); - //生成透明背景图片 - saveFile(b0, "PNG", pathUrl + "\\name3.png"); - - // 目标文件地址 - String wordOldUrl = pathUrl + "\\wordExport.docx"; - - // 添加电子印章后文件存放地址 - String wordNewUrl = pathUrl + "\\tem.docx"; - //WORD转PDF存放位置 - String pdfNewUrl = pathUrl + "\\tem.pdf"; - //电子印章图片地址 - String stampImgUrl = pathUrl + "\\sign3.png"; - //电子签名图片地址 - String stampImgUrl1 = pathUrl + "\\name3.png"; - // word文档内容关键字 - String keyWord = "盖章"; - StampUtils addStampUtils = new StampUtils(); - List electronicSealList = new ArrayList(11); - int count = 0; - for (; count < 2; count++) { - ElectronicImage electronicSeal = new ElectronicImage(); - String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; - electronicSeal.setElectronicSealImgeUrl(tempStampImgUrl); - electronicSeal.setMereFlag(count == 1); - electronicSeal.setKeyWord(keyWord); - electronicSeal.setKeyWordIndex(keyWordIndex); - electronicSeal.setHorizontal(horizontal); - electronicSeal.setVertical(vertical); - electronicSeal.setStampHeight(stampHeight); - electronicSeal.setStampWidth(stampWidth); - electronicSealList.add(electronicSeal); - } - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); - // 将新word转化为pdf文件 - addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - } -} \ No newline at end of file diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java new file mode 100644 index 0000000..324a8a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java @@ -0,0 +1,14 @@ +package com.casic.missiles.mapper.sys; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface PrintFileRegisterMapper { + + @Select(" SELECT minio_file_name " + + " FROM ${tableName} " + + " where id =#{id}} ") + String getFileNameById(@Param("id")Long id,@Param("tableName")String tableName); +} diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml index 9d6058f..2df5f93 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml @@ -39,7 +39,7 @@ csi.sample_name AS "sampleName",csi.sample_model AS "sampleModel",csi.manufacturing_no AS "manufacturingNo",bo.order_code AS "orderNo", csi.measure_type AS "measureType",bcp.certificate_report_type AS "certificateType",bcp.print_status AS - "printStatus",bcp.print_num AS "printNum", + "printStatus",bcp.print_num AS "printNum",bcp.print_file_name AS "printFileName", bcp.approval_status AS "approvalStatus",bcp.create_time AS "createTime",bcp.measure_person_id AS "measurePersonId" FROM ( SELECT * @@ -51,6 +51,9 @@ and certificate_report_category like concat('%',#{request.certificateClass},'%') + + and approval_status =#{request.approvalStatus } + and print_status = #{request.printStatus} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java new file mode 100644 index 0000000..957858e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 校准证书参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.CALIBRATION_CERTIFICATE_BEAN) +public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java new file mode 100644 index 0000000..bcf5607 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 测试报告参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.TEST_REPORT_BEAN) +public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java deleted file mode 100644 index 3f30be3..0000000 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java +++ /dev/null @@ -1,472 +0,0 @@ -package com.casic.missiles.utils; - - -import cn.afterturn.easypoi.word.WordExportUtil; -import cn.hutool.core.lang.Assert; -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.spire.doc.*; -import com.spire.doc.documents.*; -import com.spire.doc.fields.DocPicture; -import com.spire.doc.fields.TextRange; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; -import java.util.ArrayList; -import java.util.Map; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author:zt - * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 - * @Version:1.0 - */ - -public class StampUtils { - - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - // 电子印章水平位置 - private final static float horizontal = 300f; - // 电子印章垂直位置 - private final static float vertical = -55f; - // 电子印章宽度 - private final static float stampWidth = 120; - // 电子印章高度 - private final static float stampHeight = 120; - //照片透明度设置 - private final static int alpha = 150; - - - /** - * @param filePrintRegister 标准文件注册表 - */ - public static void filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { - //1、按照模板填充数据,并导出word - String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 - for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { - BufferedImage bi = readImage(electronicSeal.getElectronicSealImgeUrl()); - BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); - String stampImgUrl = electronicSeal.getElectronicSealImgeUrl(); - String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; - String[] imageCutOffContents = stampImgUrl.split("."); - electronicSeal.setElectronicSealImgeUrl(imagePath); - saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); - } - //按关键字进行分组 - Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); - // 初始化world,pdf名称参数 - String[] filePrintType = filePrintRegister.getTemplatePath().split("."); - String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; - String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; - //3、根据关键字进行添加签章和签字 - for (Map.Entry> entry : sameKeySealMaps.entrySet()) { - String mapKey = entry.getKey(); - List electronicSeals = entry.getValue(); - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); - } - // 4、将新word转化为pdf文件 - wordToPdf(wordNewUrl, pdfNewUrl); - } - - /** - * 按照模板 填充数据生成word 只支持docx - * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 - */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); - Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); - if (!temDir.endsWith("/")) { - temDir = temDir + File.separator; - } - File dir = new File(temDir); - if (!dir.getParentFile().exists()) { - // 新建文件夹 - dir.getParentFile().mkdirs(); - } - String tmpPath = ""; - try { - XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); - doc.write(fos); - fos.flush(); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - return tmpPath; - } - - - /** - * 将相同关键字的印章添加到同一个位置进行打印 - * 1、根据关键词位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 - */ - private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImgeUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); - } - Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImgeUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(horizontal); - //垂直位置 - docPicture.setVerticalPosition(vertical); - //设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - } - //保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); - } - - /** - * 替换书签名位置文本内容 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newBookmarkText 新文本内容 - */ - private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 - bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); - } - - /** - * word转PDF - * - * @param wordNewUrl word文件路径 - * @param pdfNewUrl 存储新PDF文件路径 - */ - public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { -// 将新Word文档转换为PDF文件 - Document document = new Document(); - document.loadFromFile(wordNewUrl); - document.saveToFile(pdfNewUrl, FileFormat.PDF); - document.dispose(); - } - /** - * 图片透明背景转换 - * - * @param imgsrc - * @param alpha - * @return - */ - public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { - try { - //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 - BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); - int width = imgsrc.getWidth(); - int height = imgsrc.getHeight(); - for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i++) { - int rgb = imgsrc.getRGB(i, j); - Color color = new Color(rgb); - Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); - back.setRGB(i, j, newcolor.getRGB()); - } - } - return back; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - - /** - * 1、自定义位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param stampImgUrl 电子印章图片路径 - * @param horizontal 电子印章水平位置 (当前文件推荐260f) - * @param vertical 电子印章垂直位置 (当前推荐455f) - * @param stampWidth 电子印章宽度(推荐120) - * @param stampHeight 电子印章高度(推荐120) - * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 - * @param newBookmarkText 替换的文本新内容 - */ - public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, - Float horizontal, Float vertical, Float stampWidth, - Float stampHeight, String bookmarkName, String newBookmarkText) { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(bookmarkName)) { - replaceBookmarkContent(document, bookmarkName, newBookmarkText); - } - -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(stampImgUrl); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(horizontal); -// 垂直位置 - docPicture.setVerticalPosition(vertical); - -// 设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - - // 保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); - - } - - - /** - * 替换书签名位置文本内容为图片 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newImgUrl 图片地址 - */ - public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //添加图片,替换原有书签内容 - Paragraph para = new Paragraph(document); - para.appendPicture(newImgUrl); - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(para); - bookmarksNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 替换书签名位置文本内容为表格 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - */ - public void replaceBookmarkContentToTable(Document document, String bookmarkName) { - //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - - //创建表格 - Table table = new Table(document, true); - table.resetCells(4, 3); - for (int i = 0; i < data.length; i++) { - TableRow dataRow = table.getRows().get(i); - for (int j = 0; j < data[i].length; j++) { - TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); - range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); - range.getCharacterFormat().setFontName("楷体"); - dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); - dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); - } - } - - //创建TextBodyPart对象 - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(table); - - //定位到指定书签位置 - BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); - bookmarkNavigator.moveToBookmark(bookmarkName); - - //使用表格替换原书签的内容 - bookmarkNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - /** - * 流转文件 - * - * @param buf 流字节数组 - * @param filePath 新文件路径 - * @param fileName 新文件名称 - */ - public void byte2File(byte[] buf, String filePath, String fileName) { - BufferedOutputStream bos = null; - FileOutputStream fos = null; - File file = null; - try { - File dir = new File(filePath); - if (!dir.exists() && dir.isDirectory()) { - dir.mkdirs(); - } - file = new File(filePath + File.separator + fileName); - fos = new FileOutputStream(file); - bos = new BufferedOutputStream(fos); - bos.write(buf); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (bos != null) { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String[] args) throws RuntimeException { - - String pathUrl = "D:\\cz\\upload"; - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage bi = readImage(pathUrl + "\\sign1.png"); - BufferedImage bii = convertLayout(bi, alpha); - //生成透明背景图片 - saveFile(bii, "PNG", pathUrl + "\\sign3.png"); - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage b = readImage(pathUrl + "\\name1.png"); - BufferedImage b0 = convertLayout(b, alpha); - //生成透明背景图片 - saveFile(b0, "PNG", pathUrl + "\\name3.png"); - - // 目标文件地址 - String wordOldUrl = pathUrl + "\\wordExport.docx"; - - // 添加电子印章后文件存放地址 - String wordNewUrl = pathUrl + "\\tem.docx"; - //WORD转PDF存放位置 - String pdfNewUrl = pathUrl + "\\tem.pdf"; - //电子印章图片地址 - String stampImgUrl = pathUrl + "\\sign3.png"; - //电子签名图片地址 - String stampImgUrl1 = pathUrl + "\\name3.png"; - // word文档内容关键字 - String keyWord = "盖章"; - StampUtils addStampUtils = new StampUtils(); - List electronicSealList = new ArrayList(11); - int count = 0; - for (; count < 2; count++) { - ElectronicImage electronicSeal = new ElectronicImage(); - String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; - electronicSeal.setElectronicSealImgeUrl(tempStampImgUrl); - electronicSeal.setMereFlag(count == 1); - electronicSeal.setKeyWord(keyWord); - electronicSeal.setKeyWordIndex(keyWordIndex); - electronicSeal.setHorizontal(horizontal); - electronicSeal.setVertical(vertical); - electronicSeal.setStampHeight(stampHeight); - electronicSeal.setStampWidth(stampWidth); - electronicSealList.add(electronicSeal); - } - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); - // 将新word转化为pdf文件 - addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - } -} \ No newline at end of file diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java new file mode 100644 index 0000000..324a8a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java @@ -0,0 +1,14 @@ +package com.casic.missiles.mapper.sys; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface PrintFileRegisterMapper { + + @Select(" SELECT minio_file_name " + + " FROM ${tableName} " + + " where id =#{id}} ") + String getFileNameById(@Param("id")Long id,@Param("tableName")String tableName); +} diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml index 9d6058f..2df5f93 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml @@ -39,7 +39,7 @@ csi.sample_name AS "sampleName",csi.sample_model AS "sampleModel",csi.manufacturing_no AS "manufacturingNo",bo.order_code AS "orderNo", csi.measure_type AS "measureType",bcp.certificate_report_type AS "certificateType",bcp.print_status AS - "printStatus",bcp.print_num AS "printNum", + "printStatus",bcp.print_num AS "printNum",bcp.print_file_name AS "printFileName", bcp.approval_status AS "approvalStatus",bcp.create_time AS "createTime",bcp.measure_person_id AS "measurePersonId" FROM ( SELECT * @@ -51,6 +51,9 @@ and certificate_report_category like concat('%',#{request.certificateClass},'%') + + and approval_status =#{request.approvalStatus } + and print_status = #{request.printStatus} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 1253d35..47fc55e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -8,32 +8,47 @@ @Data public class ElectronicImage { + { + //关键字索引 (-1) + final Integer keyWordIndex = -1; + // 电子印章水平位置 + final float horizontal = 300f; + // 电子印章垂直位置 + final float vertical = -55f; + // 电子印章宽度 + final float stampWidth = 120; + // 电子印章高度 + final float stampHeight = 120; + //照片透明度设置 + final int alpha = 150; + } + /** * 电子签章资源路径 */ - private String electronicSealImgeUrl; + private String electronicSealImageUrl; /** - * 透明度 + * 透明度 */ - private Integer diaphaneity; + private Integer diaphaneity; /** - * 透明度 + * 透明度 */ - private Boolean mereFlag; + private Boolean mereFlag; /** * 电子印章水平位置 (当前文件推荐260f) */ private Float horizontal; /** - * 关键字 + * 关键字 */ - private String keyWord; + private String keyWord; /** - * 关键字索引 + * 关键字索引 */ private Integer keyWordIndex; /** diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java new file mode 100644 index 0000000..957858e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 校准证书参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.CALIBRATION_CERTIFICATE_BEAN) +public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java new file mode 100644 index 0000000..bcf5607 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 测试报告参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.TEST_REPORT_BEAN) +public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java deleted file mode 100644 index 3f30be3..0000000 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java +++ /dev/null @@ -1,472 +0,0 @@ -package com.casic.missiles.utils; - - -import cn.afterturn.easypoi.word.WordExportUtil; -import cn.hutool.core.lang.Assert; -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.spire.doc.*; -import com.spire.doc.documents.*; -import com.spire.doc.fields.DocPicture; -import com.spire.doc.fields.TextRange; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; -import java.util.ArrayList; -import java.util.Map; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author:zt - * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 - * @Version:1.0 - */ - -public class StampUtils { - - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - // 电子印章水平位置 - private final static float horizontal = 300f; - // 电子印章垂直位置 - private final static float vertical = -55f; - // 电子印章宽度 - private final static float stampWidth = 120; - // 电子印章高度 - private final static float stampHeight = 120; - //照片透明度设置 - private final static int alpha = 150; - - - /** - * @param filePrintRegister 标准文件注册表 - */ - public static void filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { - //1、按照模板填充数据,并导出word - String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 - for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { - BufferedImage bi = readImage(electronicSeal.getElectronicSealImgeUrl()); - BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); - String stampImgUrl = electronicSeal.getElectronicSealImgeUrl(); - String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; - String[] imageCutOffContents = stampImgUrl.split("."); - electronicSeal.setElectronicSealImgeUrl(imagePath); - saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); - } - //按关键字进行分组 - Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); - // 初始化world,pdf名称参数 - String[] filePrintType = filePrintRegister.getTemplatePath().split("."); - String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; - String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; - //3、根据关键字进行添加签章和签字 - for (Map.Entry> entry : sameKeySealMaps.entrySet()) { - String mapKey = entry.getKey(); - List electronicSeals = entry.getValue(); - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); - } - // 4、将新word转化为pdf文件 - wordToPdf(wordNewUrl, pdfNewUrl); - } - - /** - * 按照模板 填充数据生成word 只支持docx - * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 - */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); - Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); - if (!temDir.endsWith("/")) { - temDir = temDir + File.separator; - } - File dir = new File(temDir); - if (!dir.getParentFile().exists()) { - // 新建文件夹 - dir.getParentFile().mkdirs(); - } - String tmpPath = ""; - try { - XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); - doc.write(fos); - fos.flush(); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - return tmpPath; - } - - - /** - * 将相同关键字的印章添加到同一个位置进行打印 - * 1、根据关键词位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 - */ - private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImgeUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); - } - Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImgeUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(horizontal); - //垂直位置 - docPicture.setVerticalPosition(vertical); - //设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - } - //保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); - } - - /** - * 替换书签名位置文本内容 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newBookmarkText 新文本内容 - */ - private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 - bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); - } - - /** - * word转PDF - * - * @param wordNewUrl word文件路径 - * @param pdfNewUrl 存储新PDF文件路径 - */ - public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { -// 将新Word文档转换为PDF文件 - Document document = new Document(); - document.loadFromFile(wordNewUrl); - document.saveToFile(pdfNewUrl, FileFormat.PDF); - document.dispose(); - } - /** - * 图片透明背景转换 - * - * @param imgsrc - * @param alpha - * @return - */ - public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { - try { - //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 - BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); - int width = imgsrc.getWidth(); - int height = imgsrc.getHeight(); - for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i++) { - int rgb = imgsrc.getRGB(i, j); - Color color = new Color(rgb); - Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); - back.setRGB(i, j, newcolor.getRGB()); - } - } - return back; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - - /** - * 1、自定义位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param stampImgUrl 电子印章图片路径 - * @param horizontal 电子印章水平位置 (当前文件推荐260f) - * @param vertical 电子印章垂直位置 (当前推荐455f) - * @param stampWidth 电子印章宽度(推荐120) - * @param stampHeight 电子印章高度(推荐120) - * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 - * @param newBookmarkText 替换的文本新内容 - */ - public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, - Float horizontal, Float vertical, Float stampWidth, - Float stampHeight, String bookmarkName, String newBookmarkText) { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(bookmarkName)) { - replaceBookmarkContent(document, bookmarkName, newBookmarkText); - } - -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(stampImgUrl); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(horizontal); -// 垂直位置 - docPicture.setVerticalPosition(vertical); - -// 设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - - // 保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); - - } - - - /** - * 替换书签名位置文本内容为图片 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newImgUrl 图片地址 - */ - public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //添加图片,替换原有书签内容 - Paragraph para = new Paragraph(document); - para.appendPicture(newImgUrl); - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(para); - bookmarksNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 替换书签名位置文本内容为表格 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - */ - public void replaceBookmarkContentToTable(Document document, String bookmarkName) { - //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - - //创建表格 - Table table = new Table(document, true); - table.resetCells(4, 3); - for (int i = 0; i < data.length; i++) { - TableRow dataRow = table.getRows().get(i); - for (int j = 0; j < data[i].length; j++) { - TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); - range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); - range.getCharacterFormat().setFontName("楷体"); - dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); - dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); - } - } - - //创建TextBodyPart对象 - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(table); - - //定位到指定书签位置 - BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); - bookmarkNavigator.moveToBookmark(bookmarkName); - - //使用表格替换原书签的内容 - bookmarkNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - /** - * 流转文件 - * - * @param buf 流字节数组 - * @param filePath 新文件路径 - * @param fileName 新文件名称 - */ - public void byte2File(byte[] buf, String filePath, String fileName) { - BufferedOutputStream bos = null; - FileOutputStream fos = null; - File file = null; - try { - File dir = new File(filePath); - if (!dir.exists() && dir.isDirectory()) { - dir.mkdirs(); - } - file = new File(filePath + File.separator + fileName); - fos = new FileOutputStream(file); - bos = new BufferedOutputStream(fos); - bos.write(buf); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (bos != null) { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String[] args) throws RuntimeException { - - String pathUrl = "D:\\cz\\upload"; - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage bi = readImage(pathUrl + "\\sign1.png"); - BufferedImage bii = convertLayout(bi, alpha); - //生成透明背景图片 - saveFile(bii, "PNG", pathUrl + "\\sign3.png"); - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage b = readImage(pathUrl + "\\name1.png"); - BufferedImage b0 = convertLayout(b, alpha); - //生成透明背景图片 - saveFile(b0, "PNG", pathUrl + "\\name3.png"); - - // 目标文件地址 - String wordOldUrl = pathUrl + "\\wordExport.docx"; - - // 添加电子印章后文件存放地址 - String wordNewUrl = pathUrl + "\\tem.docx"; - //WORD转PDF存放位置 - String pdfNewUrl = pathUrl + "\\tem.pdf"; - //电子印章图片地址 - String stampImgUrl = pathUrl + "\\sign3.png"; - //电子签名图片地址 - String stampImgUrl1 = pathUrl + "\\name3.png"; - // word文档内容关键字 - String keyWord = "盖章"; - StampUtils addStampUtils = new StampUtils(); - List electronicSealList = new ArrayList(11); - int count = 0; - for (; count < 2; count++) { - ElectronicImage electronicSeal = new ElectronicImage(); - String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; - electronicSeal.setElectronicSealImgeUrl(tempStampImgUrl); - electronicSeal.setMereFlag(count == 1); - electronicSeal.setKeyWord(keyWord); - electronicSeal.setKeyWordIndex(keyWordIndex); - electronicSeal.setHorizontal(horizontal); - electronicSeal.setVertical(vertical); - electronicSeal.setStampHeight(stampHeight); - electronicSeal.setStampWidth(stampWidth); - electronicSealList.add(electronicSeal); - } - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); - // 将新word转化为pdf文件 - addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - } -} \ No newline at end of file diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java new file mode 100644 index 0000000..324a8a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java @@ -0,0 +1,14 @@ +package com.casic.missiles.mapper.sys; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface PrintFileRegisterMapper { + + @Select(" SELECT minio_file_name " + + " FROM ${tableName} " + + " where id =#{id}} ") + String getFileNameById(@Param("id")Long id,@Param("tableName")String tableName); +} diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml index 9d6058f..2df5f93 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml @@ -39,7 +39,7 @@ csi.sample_name AS "sampleName",csi.sample_model AS "sampleModel",csi.manufacturing_no AS "manufacturingNo",bo.order_code AS "orderNo", csi.measure_type AS "measureType",bcp.certificate_report_type AS "certificateType",bcp.print_status AS - "printStatus",bcp.print_num AS "printNum", + "printStatus",bcp.print_num AS "printNum",bcp.print_file_name AS "printFileName", bcp.approval_status AS "approvalStatus",bcp.create_time AS "createTime",bcp.measure_person_id AS "measurePersonId" FROM ( SELECT * @@ -51,6 +51,9 @@ and certificate_report_category like concat('%',#{request.certificateClass},'%') + + and approval_status =#{request.approvalStatus } + and print_status = #{request.printStatus} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 1253d35..47fc55e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -8,32 +8,47 @@ @Data public class ElectronicImage { + { + //关键字索引 (-1) + final Integer keyWordIndex = -1; + // 电子印章水平位置 + final float horizontal = 300f; + // 电子印章垂直位置 + final float vertical = -55f; + // 电子印章宽度 + final float stampWidth = 120; + // 电子印章高度 + final float stampHeight = 120; + //照片透明度设置 + final int alpha = 150; + } + /** * 电子签章资源路径 */ - private String electronicSealImgeUrl; + private String electronicSealImageUrl; /** - * 透明度 + * 透明度 */ - private Integer diaphaneity; + private Integer diaphaneity; /** - * 透明度 + * 透明度 */ - private Boolean mereFlag; + private Boolean mereFlag; /** * 电子印章水平位置 (当前文件推荐260f) */ private Float horizontal; /** - * 关键字 + * 关键字 */ - private String keyWord; + private String keyWord; /** - * 关键字索引 + * 关键字索引 */ private Integer keyWordIndex; /** 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 index 778fedb..5a0949b 100644 --- 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 @@ -25,10 +25,17 @@ */ private String fileName; /** + * 生成文件工作空间目录id + */ + private String fileNameId; + /** * 模板参数 */ private Map params; + + private List beDownloadedFileNames; + /** * electronicSealList 填充的电子图片信息 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java new file mode 100644 index 0000000..957858e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 校准证书参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.CALIBRATION_CERTIFICATE_BEAN) +public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java new file mode 100644 index 0000000..bcf5607 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 测试报告参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.TEST_REPORT_BEAN) +public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java deleted file mode 100644 index 3f30be3..0000000 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java +++ /dev/null @@ -1,472 +0,0 @@ -package com.casic.missiles.utils; - - -import cn.afterturn.easypoi.word.WordExportUtil; -import cn.hutool.core.lang.Assert; -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.spire.doc.*; -import com.spire.doc.documents.*; -import com.spire.doc.fields.DocPicture; -import com.spire.doc.fields.TextRange; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; -import java.util.ArrayList; -import java.util.Map; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author:zt - * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 - * @Version:1.0 - */ - -public class StampUtils { - - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - // 电子印章水平位置 - private final static float horizontal = 300f; - // 电子印章垂直位置 - private final static float vertical = -55f; - // 电子印章宽度 - private final static float stampWidth = 120; - // 电子印章高度 - private final static float stampHeight = 120; - //照片透明度设置 - private final static int alpha = 150; - - - /** - * @param filePrintRegister 标准文件注册表 - */ - public static void filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { - //1、按照模板填充数据,并导出word - String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 - for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { - BufferedImage bi = readImage(electronicSeal.getElectronicSealImgeUrl()); - BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); - String stampImgUrl = electronicSeal.getElectronicSealImgeUrl(); - String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; - String[] imageCutOffContents = stampImgUrl.split("."); - electronicSeal.setElectronicSealImgeUrl(imagePath); - saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); - } - //按关键字进行分组 - Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); - // 初始化world,pdf名称参数 - String[] filePrintType = filePrintRegister.getTemplatePath().split("."); - String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; - String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; - //3、根据关键字进行添加签章和签字 - for (Map.Entry> entry : sameKeySealMaps.entrySet()) { - String mapKey = entry.getKey(); - List electronicSeals = entry.getValue(); - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); - } - // 4、将新word转化为pdf文件 - wordToPdf(wordNewUrl, pdfNewUrl); - } - - /** - * 按照模板 填充数据生成word 只支持docx - * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 - */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); - Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); - if (!temDir.endsWith("/")) { - temDir = temDir + File.separator; - } - File dir = new File(temDir); - if (!dir.getParentFile().exists()) { - // 新建文件夹 - dir.getParentFile().mkdirs(); - } - String tmpPath = ""; - try { - XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); - doc.write(fos); - fos.flush(); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - return tmpPath; - } - - - /** - * 将相同关键字的印章添加到同一个位置进行打印 - * 1、根据关键词位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 - */ - private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImgeUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); - } - Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImgeUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(horizontal); - //垂直位置 - docPicture.setVerticalPosition(vertical); - //设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - } - //保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); - } - - /** - * 替换书签名位置文本内容 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newBookmarkText 新文本内容 - */ - private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 - bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); - } - - /** - * word转PDF - * - * @param wordNewUrl word文件路径 - * @param pdfNewUrl 存储新PDF文件路径 - */ - public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { -// 将新Word文档转换为PDF文件 - Document document = new Document(); - document.loadFromFile(wordNewUrl); - document.saveToFile(pdfNewUrl, FileFormat.PDF); - document.dispose(); - } - /** - * 图片透明背景转换 - * - * @param imgsrc - * @param alpha - * @return - */ - public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { - try { - //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 - BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); - int width = imgsrc.getWidth(); - int height = imgsrc.getHeight(); - for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i++) { - int rgb = imgsrc.getRGB(i, j); - Color color = new Color(rgb); - Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); - back.setRGB(i, j, newcolor.getRGB()); - } - } - return back; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - - /** - * 1、自定义位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param stampImgUrl 电子印章图片路径 - * @param horizontal 电子印章水平位置 (当前文件推荐260f) - * @param vertical 电子印章垂直位置 (当前推荐455f) - * @param stampWidth 电子印章宽度(推荐120) - * @param stampHeight 电子印章高度(推荐120) - * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 - * @param newBookmarkText 替换的文本新内容 - */ - public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, - Float horizontal, Float vertical, Float stampWidth, - Float stampHeight, String bookmarkName, String newBookmarkText) { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(bookmarkName)) { - replaceBookmarkContent(document, bookmarkName, newBookmarkText); - } - -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(stampImgUrl); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(horizontal); -// 垂直位置 - docPicture.setVerticalPosition(vertical); - -// 设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - - // 保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); - - } - - - /** - * 替换书签名位置文本内容为图片 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newImgUrl 图片地址 - */ - public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //添加图片,替换原有书签内容 - Paragraph para = new Paragraph(document); - para.appendPicture(newImgUrl); - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(para); - bookmarksNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 替换书签名位置文本内容为表格 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - */ - public void replaceBookmarkContentToTable(Document document, String bookmarkName) { - //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - - //创建表格 - Table table = new Table(document, true); - table.resetCells(4, 3); - for (int i = 0; i < data.length; i++) { - TableRow dataRow = table.getRows().get(i); - for (int j = 0; j < data[i].length; j++) { - TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); - range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); - range.getCharacterFormat().setFontName("楷体"); - dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); - dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); - } - } - - //创建TextBodyPart对象 - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(table); - - //定位到指定书签位置 - BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); - bookmarkNavigator.moveToBookmark(bookmarkName); - - //使用表格替换原书签的内容 - bookmarkNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - /** - * 流转文件 - * - * @param buf 流字节数组 - * @param filePath 新文件路径 - * @param fileName 新文件名称 - */ - public void byte2File(byte[] buf, String filePath, String fileName) { - BufferedOutputStream bos = null; - FileOutputStream fos = null; - File file = null; - try { - File dir = new File(filePath); - if (!dir.exists() && dir.isDirectory()) { - dir.mkdirs(); - } - file = new File(filePath + File.separator + fileName); - fos = new FileOutputStream(file); - bos = new BufferedOutputStream(fos); - bos.write(buf); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (bos != null) { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String[] args) throws RuntimeException { - - String pathUrl = "D:\\cz\\upload"; - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage bi = readImage(pathUrl + "\\sign1.png"); - BufferedImage bii = convertLayout(bi, alpha); - //生成透明背景图片 - saveFile(bii, "PNG", pathUrl + "\\sign3.png"); - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage b = readImage(pathUrl + "\\name1.png"); - BufferedImage b0 = convertLayout(b, alpha); - //生成透明背景图片 - saveFile(b0, "PNG", pathUrl + "\\name3.png"); - - // 目标文件地址 - String wordOldUrl = pathUrl + "\\wordExport.docx"; - - // 添加电子印章后文件存放地址 - String wordNewUrl = pathUrl + "\\tem.docx"; - //WORD转PDF存放位置 - String pdfNewUrl = pathUrl + "\\tem.pdf"; - //电子印章图片地址 - String stampImgUrl = pathUrl + "\\sign3.png"; - //电子签名图片地址 - String stampImgUrl1 = pathUrl + "\\name3.png"; - // word文档内容关键字 - String keyWord = "盖章"; - StampUtils addStampUtils = new StampUtils(); - List electronicSealList = new ArrayList(11); - int count = 0; - for (; count < 2; count++) { - ElectronicImage electronicSeal = new ElectronicImage(); - String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; - electronicSeal.setElectronicSealImgeUrl(tempStampImgUrl); - electronicSeal.setMereFlag(count == 1); - electronicSeal.setKeyWord(keyWord); - electronicSeal.setKeyWordIndex(keyWordIndex); - electronicSeal.setHorizontal(horizontal); - electronicSeal.setVertical(vertical); - electronicSeal.setStampHeight(stampHeight); - electronicSeal.setStampWidth(stampWidth); - electronicSealList.add(electronicSeal); - } - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); - // 将新word转化为pdf文件 - addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - } -} \ No newline at end of file diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java new file mode 100644 index 0000000..324a8a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java @@ -0,0 +1,14 @@ +package com.casic.missiles.mapper.sys; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface PrintFileRegisterMapper { + + @Select(" SELECT minio_file_name " + + " FROM ${tableName} " + + " where id =#{id}} ") + String getFileNameById(@Param("id")Long id,@Param("tableName")String tableName); +} diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml index 9d6058f..2df5f93 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml @@ -39,7 +39,7 @@ csi.sample_name AS "sampleName",csi.sample_model AS "sampleModel",csi.manufacturing_no AS "manufacturingNo",bo.order_code AS "orderNo", csi.measure_type AS "measureType",bcp.certificate_report_type AS "certificateType",bcp.print_status AS - "printStatus",bcp.print_num AS "printNum", + "printStatus",bcp.print_num AS "printNum",bcp.print_file_name AS "printFileName", bcp.approval_status AS "approvalStatus",bcp.create_time AS "createTime",bcp.measure_person_id AS "measurePersonId" FROM ( SELECT * @@ -51,6 +51,9 @@ and certificate_report_category like concat('%',#{request.certificateClass},'%') + + and approval_status =#{request.approvalStatus } + and print_status = #{request.printStatus} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 1253d35..47fc55e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -8,32 +8,47 @@ @Data public class ElectronicImage { + { + //关键字索引 (-1) + final Integer keyWordIndex = -1; + // 电子印章水平位置 + final float horizontal = 300f; + // 电子印章垂直位置 + final float vertical = -55f; + // 电子印章宽度 + final float stampWidth = 120; + // 电子印章高度 + final float stampHeight = 120; + //照片透明度设置 + final int alpha = 150; + } + /** * 电子签章资源路径 */ - private String electronicSealImgeUrl; + private String electronicSealImageUrl; /** - * 透明度 + * 透明度 */ - private Integer diaphaneity; + private Integer diaphaneity; /** - * 透明度 + * 透明度 */ - private Boolean mereFlag; + private Boolean mereFlag; /** * 电子印章水平位置 (当前文件推荐260f) */ private Float horizontal; /** - * 关键字 + * 关键字 */ - private String keyWord; + private String keyWord; /** - * 关键字索引 + * 关键字索引 */ private Integer keyWordIndex; /** 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 index 778fedb..5a0949b 100644 --- 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 @@ -25,10 +25,17 @@ */ private String fileName; /** + * 生成文件工作空间目录id + */ + private String fileNameId; + /** * 模板参数 */ private Map params; + + private List beDownloadedFileNames; + /** * electronicSealList 填充的电子图片信息 */ diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java index 267b9a1..f043071 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java @@ -102,4 +102,8 @@ @ExcelProperty(value = "审批状态",order = 13) private String approvalStatusName; + @ApiModelProperty(value = "证书打印名称", dataType = "String") + private String printFileName; + + } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java new file mode 100644 index 0000000..957858e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 校准证书参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.CALIBRATION_CERTIFICATE_BEAN) +public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java new file mode 100644 index 0000000..bcf5607 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 测试报告参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.TEST_REPORT_BEAN) +public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java deleted file mode 100644 index 3f30be3..0000000 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java +++ /dev/null @@ -1,472 +0,0 @@ -package com.casic.missiles.utils; - - -import cn.afterturn.easypoi.word.WordExportUtil; -import cn.hutool.core.lang.Assert; -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.spire.doc.*; -import com.spire.doc.documents.*; -import com.spire.doc.fields.DocPicture; -import com.spire.doc.fields.TextRange; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; -import java.util.ArrayList; -import java.util.Map; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author:zt - * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 - * @Version:1.0 - */ - -public class StampUtils { - - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - // 电子印章水平位置 - private final static float horizontal = 300f; - // 电子印章垂直位置 - private final static float vertical = -55f; - // 电子印章宽度 - private final static float stampWidth = 120; - // 电子印章高度 - private final static float stampHeight = 120; - //照片透明度设置 - private final static int alpha = 150; - - - /** - * @param filePrintRegister 标准文件注册表 - */ - public static void filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { - //1、按照模板填充数据,并导出word - String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 - for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { - BufferedImage bi = readImage(electronicSeal.getElectronicSealImgeUrl()); - BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); - String stampImgUrl = electronicSeal.getElectronicSealImgeUrl(); - String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; - String[] imageCutOffContents = stampImgUrl.split("."); - electronicSeal.setElectronicSealImgeUrl(imagePath); - saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); - } - //按关键字进行分组 - Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); - // 初始化world,pdf名称参数 - String[] filePrintType = filePrintRegister.getTemplatePath().split("."); - String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; - String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; - //3、根据关键字进行添加签章和签字 - for (Map.Entry> entry : sameKeySealMaps.entrySet()) { - String mapKey = entry.getKey(); - List electronicSeals = entry.getValue(); - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); - } - // 4、将新word转化为pdf文件 - wordToPdf(wordNewUrl, pdfNewUrl); - } - - /** - * 按照模板 填充数据生成word 只支持docx - * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 - */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); - Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); - if (!temDir.endsWith("/")) { - temDir = temDir + File.separator; - } - File dir = new File(temDir); - if (!dir.getParentFile().exists()) { - // 新建文件夹 - dir.getParentFile().mkdirs(); - } - String tmpPath = ""; - try { - XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); - doc.write(fos); - fos.flush(); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - return tmpPath; - } - - - /** - * 将相同关键字的印章添加到同一个位置进行打印 - * 1、根据关键词位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 - */ - private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImgeUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); - } - Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImgeUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(horizontal); - //垂直位置 - docPicture.setVerticalPosition(vertical); - //设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - } - //保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); - } - - /** - * 替换书签名位置文本内容 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newBookmarkText 新文本内容 - */ - private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 - bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); - } - - /** - * word转PDF - * - * @param wordNewUrl word文件路径 - * @param pdfNewUrl 存储新PDF文件路径 - */ - public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { -// 将新Word文档转换为PDF文件 - Document document = new Document(); - document.loadFromFile(wordNewUrl); - document.saveToFile(pdfNewUrl, FileFormat.PDF); - document.dispose(); - } - /** - * 图片透明背景转换 - * - * @param imgsrc - * @param alpha - * @return - */ - public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { - try { - //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 - BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); - int width = imgsrc.getWidth(); - int height = imgsrc.getHeight(); - for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i++) { - int rgb = imgsrc.getRGB(i, j); - Color color = new Color(rgb); - Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); - back.setRGB(i, j, newcolor.getRGB()); - } - } - return back; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - - /** - * 1、自定义位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param stampImgUrl 电子印章图片路径 - * @param horizontal 电子印章水平位置 (当前文件推荐260f) - * @param vertical 电子印章垂直位置 (当前推荐455f) - * @param stampWidth 电子印章宽度(推荐120) - * @param stampHeight 电子印章高度(推荐120) - * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 - * @param newBookmarkText 替换的文本新内容 - */ - public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, - Float horizontal, Float vertical, Float stampWidth, - Float stampHeight, String bookmarkName, String newBookmarkText) { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(bookmarkName)) { - replaceBookmarkContent(document, bookmarkName, newBookmarkText); - } - -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(stampImgUrl); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(horizontal); -// 垂直位置 - docPicture.setVerticalPosition(vertical); - -// 设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - - // 保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); - - } - - - /** - * 替换书签名位置文本内容为图片 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newImgUrl 图片地址 - */ - public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //添加图片,替换原有书签内容 - Paragraph para = new Paragraph(document); - para.appendPicture(newImgUrl); - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(para); - bookmarksNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 替换书签名位置文本内容为表格 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - */ - public void replaceBookmarkContentToTable(Document document, String bookmarkName) { - //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - - //创建表格 - Table table = new Table(document, true); - table.resetCells(4, 3); - for (int i = 0; i < data.length; i++) { - TableRow dataRow = table.getRows().get(i); - for (int j = 0; j < data[i].length; j++) { - TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); - range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); - range.getCharacterFormat().setFontName("楷体"); - dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); - dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); - } - } - - //创建TextBodyPart对象 - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(table); - - //定位到指定书签位置 - BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); - bookmarkNavigator.moveToBookmark(bookmarkName); - - //使用表格替换原书签的内容 - bookmarkNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - /** - * 流转文件 - * - * @param buf 流字节数组 - * @param filePath 新文件路径 - * @param fileName 新文件名称 - */ - public void byte2File(byte[] buf, String filePath, String fileName) { - BufferedOutputStream bos = null; - FileOutputStream fos = null; - File file = null; - try { - File dir = new File(filePath); - if (!dir.exists() && dir.isDirectory()) { - dir.mkdirs(); - } - file = new File(filePath + File.separator + fileName); - fos = new FileOutputStream(file); - bos = new BufferedOutputStream(fos); - bos.write(buf); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (bos != null) { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String[] args) throws RuntimeException { - - String pathUrl = "D:\\cz\\upload"; - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage bi = readImage(pathUrl + "\\sign1.png"); - BufferedImage bii = convertLayout(bi, alpha); - //生成透明背景图片 - saveFile(bii, "PNG", pathUrl + "\\sign3.png"); - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage b = readImage(pathUrl + "\\name1.png"); - BufferedImage b0 = convertLayout(b, alpha); - //生成透明背景图片 - saveFile(b0, "PNG", pathUrl + "\\name3.png"); - - // 目标文件地址 - String wordOldUrl = pathUrl + "\\wordExport.docx"; - - // 添加电子印章后文件存放地址 - String wordNewUrl = pathUrl + "\\tem.docx"; - //WORD转PDF存放位置 - String pdfNewUrl = pathUrl + "\\tem.pdf"; - //电子印章图片地址 - String stampImgUrl = pathUrl + "\\sign3.png"; - //电子签名图片地址 - String stampImgUrl1 = pathUrl + "\\name3.png"; - // word文档内容关键字 - String keyWord = "盖章"; - StampUtils addStampUtils = new StampUtils(); - List electronicSealList = new ArrayList(11); - int count = 0; - for (; count < 2; count++) { - ElectronicImage electronicSeal = new ElectronicImage(); - String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; - electronicSeal.setElectronicSealImgeUrl(tempStampImgUrl); - electronicSeal.setMereFlag(count == 1); - electronicSeal.setKeyWord(keyWord); - electronicSeal.setKeyWordIndex(keyWordIndex); - electronicSeal.setHorizontal(horizontal); - electronicSeal.setVertical(vertical); - electronicSeal.setStampHeight(stampHeight); - electronicSeal.setStampWidth(stampWidth); - electronicSealList.add(electronicSeal); - } - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); - // 将新word转化为pdf文件 - addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - } -} \ No newline at end of file diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java new file mode 100644 index 0000000..324a8a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java @@ -0,0 +1,14 @@ +package com.casic.missiles.mapper.sys; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface PrintFileRegisterMapper { + + @Select(" SELECT minio_file_name " + + " FROM ${tableName} " + + " where id =#{id}} ") + String getFileNameById(@Param("id")Long id,@Param("tableName")String tableName); +} diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml index 9d6058f..2df5f93 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml @@ -39,7 +39,7 @@ csi.sample_name AS "sampleName",csi.sample_model AS "sampleModel",csi.manufacturing_no AS "manufacturingNo",bo.order_code AS "orderNo", csi.measure_type AS "measureType",bcp.certificate_report_type AS "certificateType",bcp.print_status AS - "printStatus",bcp.print_num AS "printNum", + "printStatus",bcp.print_num AS "printNum",bcp.print_file_name AS "printFileName", bcp.approval_status AS "approvalStatus",bcp.create_time AS "createTime",bcp.measure_person_id AS "measurePersonId" FROM ( SELECT * @@ -51,6 +51,9 @@ and certificate_report_category like concat('%',#{request.certificateClass},'%') + + and approval_status =#{request.approvalStatus } + and print_status = #{request.printStatus} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 1253d35..47fc55e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -8,32 +8,47 @@ @Data public class ElectronicImage { + { + //关键字索引 (-1) + final Integer keyWordIndex = -1; + // 电子印章水平位置 + final float horizontal = 300f; + // 电子印章垂直位置 + final float vertical = -55f; + // 电子印章宽度 + final float stampWidth = 120; + // 电子印章高度 + final float stampHeight = 120; + //照片透明度设置 + final int alpha = 150; + } + /** * 电子签章资源路径 */ - private String electronicSealImgeUrl; + private String electronicSealImageUrl; /** - * 透明度 + * 透明度 */ - private Integer diaphaneity; + private Integer diaphaneity; /** - * 透明度 + * 透明度 */ - private Boolean mereFlag; + private Boolean mereFlag; /** * 电子印章水平位置 (当前文件推荐260f) */ private Float horizontal; /** - * 关键字 + * 关键字 */ - private String keyWord; + private String keyWord; /** - * 关键字索引 + * 关键字索引 */ private Integer keyWordIndex; /** 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 index 778fedb..5a0949b 100644 --- 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 @@ -25,10 +25,17 @@ */ private String fileName; /** + * 生成文件工作空间目录id + */ + private String fileNameId; + /** * 模板参数 */ private Map params; + + private List beDownloadedFileNames; + /** * electronicSealList 填充的电子图片信息 */ diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java index 267b9a1..f043071 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java @@ -102,4 +102,8 @@ @ExcelProperty(value = "审批状态",order = 13) private String approvalStatusName; + @ApiModelProperty(value = "证书打印名称", dataType = "String") + private String printFileName; + + } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificatePrint.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificatePrint.java index c058524..052513d 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificatePrint.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificatePrint.java @@ -117,6 +117,8 @@ @TableField("certificate_organization") private String certificateOrganization; + @TableField("print_file_name") + private String printFileName; /** * 证书报告附件(minio存储文件名) */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 770559b..01754a0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -87,15 +87,6 @@ certificatePrintService.certificatePrintExport(request, response, page); } - @ApiOperation("证书打印") - @PostMapping("/doPrint") - public ReturnDTO certificateDoPrint(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); - } - return certificatePrintService.submitAgainPrint(request); - } - /** * 证书打印列表,除了基本的列表的信息,需要判断证书打印审批中的状态,进而达到权限的控制 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 9848e68..5831350 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -2,8 +2,8 @@ import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.listeners.processor.register.FilePrintRegisterUtils; import com.casic.missiles.utils.PdfUtil; -import com.casic.missiles.utils.StampUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; @@ -62,7 +62,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "wordExport.docx"; - String word = StampUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/resources/config/application.yml b/casic-metering-api/src/main/resources/config/application.yml index 9dc27da..76f95b4 100644 --- a/casic-metering-api/src/main/resources/config/application.yml +++ b/casic-metering-api/src/main/resources/config/application.yml @@ -113,7 +113,8 @@ config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ - + file: + dir:D:\cz\203\file #代码生成器配置 code: generate: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java new file mode 100644 index 0000000..8250400 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/CertificateTypeEnum.java @@ -0,0 +1,7 @@ +package com.casic.missiles.enums.business; + +public interface CertificateTypeEnum { + + String CALIBRATION_CERTIFICATE = "1"; + String TEST_REPORT = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java new file mode 100644 index 0000000..6779003 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareCertificateTypeEnum.java @@ -0,0 +1,25 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.business.CertificateTypeEnum; + +import java.util.HashMap; + +public enum AwareCertificateTypeEnum implements PrintFileDataRegisterBeanEnum, CertificateTypeEnum { + + CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { + { + put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 + put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + } + }); + + public HashMap certificateTypeBeanMap; + + AwareCertificateTypeEnum(HashMap certificateTypeBeanMap) { + this.certificateTypeBeanMap = certificateTypeBeanMap; + } + + public HashMap getCertificateTypeBeanMap() { + return certificateTypeBeanMap; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java new file mode 100644 index 0000000..aeea182 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataRegisterBeanEnum.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums.notifyevent; + +public interface PrintFileDataRegisterBeanEnum { + + //校准证书 + String CALIBRATION_CERTIFICATE_BEAN= "calibrationBean"; + //检测报告 + String TEST_REPORT_BEAN = "testingReportBean"; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java index f5eb25d..3404409 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/CertificateReportEventPostProcessor.java @@ -8,6 +8,7 @@ import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.listeners.processor.register.PrintFileRegister; import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.customer.CustomerSampleMapper; @@ -53,37 +54,51 @@ if (row < 1 || rs < 1) throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } + //获取证书报告信息 certificateReport = certificateReportMapper.selectById(id); - CertificatePrintBuilder(certificateReport); + //进行证书报告生成,并在远程注册服务器注册 +// PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); +// String printFileName = printFileRegister.registerPrintFile(certificateReport); + String printFileName =""; + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); } /** * 通过审批的证书报告,产生证书打印 */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport) { + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); int row = certificatePrintMapper.insert(certificatePrint); if (row <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport) { + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .certificateReportCode(certificateReport.getCertificateReportCode()) .certificateReportFile(certificateReport.getCertificateReportFile()) .certificateReportType(certificateReport.getCertificateReportType()) .certificateReportCategory(certificateReport.getCertificateReportCategory()) .certificateReportName(certificateReport.getCertificateReportName()) - .sampleId(certificateReport.getSampleId()) .measureDeptId(certificateReport.getMeasureDeptId()) .measurePersonId(certificateReport.getMeasurePersonId()) .originalRecordId(certificateReport.getOriginalRecordId()) .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) .orderId(certificateReport.getOrderId()) .templateId(certificateReport.getTemplateId()) .signId(certificateReport.getSignId()) + .printFileName(printFileName) .printNum(0) .printStatus("1") .createUser(certificateReport.getCreateUser()) diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java new file mode 100644 index 0000000..ecf72e6 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/FilePrintRegisterUtils.java @@ -0,0 +1,473 @@ +package com.casic.missiles.listeners.processor.register; + + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +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.spire.doc.*; +import com.spire.doc.documents.*; +import com.spire.doc.fields.DocPicture; +import com.spire.doc.fields.TextRange; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Map; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author:zt + * @Create:2023/3/7/9:30 + * @Description:TODO Word文件操作工具类 + * @Version:1.0 + */ + +public class FilePrintRegisterUtils { + + //关键字索引 (-1) + private final static Integer keyWordIndex = -1; + // 电子印章水平位置 + private final static float horizontal = 300f; + // 电子印章垂直位置 + private final static float vertical = -55f; + // 电子印章宽度 + private final static float stampWidth = 120; + // 电子印章高度 + private final static float stampHeight = 120; + //照片透明度设置 + private final static int alpha = 150; + + + /** + * @param filePrintRegister 证书文件注册 + */ + public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + //1、按照模板填充数据,并导出word + String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); + //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 + for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { + BufferedImage bi = readImage(electronicSeal.getElectronicSealImageUrl()); + BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); + String stampImgUrl = electronicSeal.getElectronicSealImageUrl(); + String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; + String[] imageCutOffContents = stampImgUrl.split("."); + electronicSeal.setElectronicSealImageUrl(imagePath); + saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); + } + //按关键字进行分组 + Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + // 初始化world,pdf名称参数 + String[] filePrintType = filePrintRegister.getTemplatePath().split("."); + String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; + String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; + //3、根据关键字进行添加签章和签字 + for (Map.Entry> entry : sameKeySealMaps.entrySet()) { + List electronicSeals = entry.getValue(); + addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); + } + // 4、将新word转化为pdf文件 + wordToPdf(wordNewUrl, pdfNewUrl); + return pdfNewUrl; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + /** + * 将相同关键字的印章添加到同一个位置进行打印 + * 1、根据关键词位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param electronicSealList 电子印章信息 + */ + private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); + for (ElectronicImage electronicSeal : electronicSealList) { + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + } + Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + //指定电子章位置 + //水平位置 + docPicture.setHorizontalPosition(horizontal); + //垂直位置 + docPicture.setVerticalPosition(vertical); + //设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + } + //保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); + } + + /** + * 替换书签名位置文本内容 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newBookmarkText 新文本内容 + */ + private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 + bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); + } + + /** + * word转PDF + * + * @param wordNewUrl word文件路径 + * @param pdfNewUrl 存储新PDF文件路径 + */ + public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { +// 将新Word文档转换为PDF文件 + Document document = new Document(); + document.loadFromFile(wordNewUrl); + document.saveToFile(pdfNewUrl, FileFormat.PDF); + document.dispose(); + } + + /** + * 图片透明背景转换 + * + * @param imgsrc + * @param alpha + * @return + */ + public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { + try { + //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 + BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); + int width = imgsrc.getWidth(); + int height = imgsrc.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int rgb = imgsrc.getRGB(i, j); + Color color = new Color(rgb); + Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + back.setRGB(i, j, newcolor.getRGB()); + } + } + return back; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //读取图片 + private static BufferedImage readImage(String imgpath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); + return bufferedImage; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //保存图片,extent为格式,"jpg"、"png"等 + private static void saveFile(BufferedImage img, String extent, String newfile) { + try { + ImageIO.write(img, extent, new File(newfile)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 1、自定义位置添加电子印章 + * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param stampImgUrl 电子印章图片路径 + * @param horizontal 电子印章水平位置 (当前文件推荐260f) + * @param vertical 电子印章垂直位置 (当前推荐455f) + * @param stampWidth 电子印章宽度(推荐120) + * @param stampHeight 电子印章高度(推荐120) + * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 + * @param newBookmarkText 替换的文本新内容 + */ + public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, + Float horizontal, Float vertical, Float stampWidth, + Float stampHeight, String bookmarkName, String newBookmarkText) { + // 加载文档 + Document document = new Document(); + document.loadFromFile(wordOldUrl); + //获取指定段落 + Section section = document.getSections().get(0); + //获取段落总数 + int count = section.getParagraphs().getCount(); + //log.info("获取文档内容段落总数{}",count); + Paragraph paragraph = section.getParagraphs().get(0); + + // 判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(bookmarkName)) { + replaceBookmarkContent(document, bookmarkName, newBookmarkText); + } + +// 添加电子印章 + DocPicture docPicture = paragraph.appendPicture(stampImgUrl); + +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(horizontal); +// 垂直位置 + docPicture.setVerticalPosition(vertical); + +// 设置电子章大小 + docPicture.setWidth(stampWidth); + docPicture.setHeight(stampHeight); + +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + + // 保存添加电子章的Word文档 + document.saveToFile(wordNewUrl); + document.dispose(); +// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); + + } + + + /** + * 替换书签名位置文本内容为图片 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + * @param newImgUrl 图片地址 + */ + public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { + //定位到指定书签位置 + BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); + bookmarksNavigator.moveToBookmark(bookmarkName); + //添加图片,替换原有书签内容 + Paragraph para = new Paragraph(document); + para.appendPicture(newImgUrl); + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(para); + bookmarksNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 替换书签名位置文本内容为表格 + * + * @param document word文档对象 + * @param bookmarkName 书签名 + */ + public void replaceBookmarkContentToTable(Document document, String bookmarkName) { + //声明数组内容 + String[][] data = + { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; + + //创建表格 + Table table = new Table(document, true); + table.resetCells(4, 3); + for (int i = 0; i < data.length; i++) { + TableRow dataRow = table.getRows().get(i); + for (int j = 0; j < data[i].length; j++) { + TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); + range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); + range.getCharacterFormat().setFontName("楷体"); + dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); + dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); + } + } + + //创建TextBodyPart对象 + TextBodyPart bodyPart = new TextBodyPart(document); + bodyPart.getBodyItems().add(table); + + //定位到指定书签位置 + BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); + bookmarkNavigator.moveToBookmark(bookmarkName); + + //使用表格替换原书签的内容 + bookmarkNavigator.replaceBookmarkContent(bodyPart); + } + + /** + * 文件转流 + * + * @param wordNewUrl + * @return + */ + public byte[] getBytesByFile(String wordNewUrl) { + try { +// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); + File file = new File(wordNewUrl); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = fis.read(b)) != -1) { + bos.write(b, 0, len); + } + fis.close(); + bos.close(); + byte[] bytes = bos.toByteArray(); + System.out.println("successful..."); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 流转文件 + * + * @param buf 流字节数组 + * @param filePath 新文件路径 + * @param fileName 新文件名称 + */ + public static void byteToFile(byte[] buf, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath + File.separator + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(buf); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws RuntimeException { + String pathUrl = "http://111.198.10.15:21408/test"; + String localPathUrl = "D:\\cz\\203\\file"; + + //文件与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 + "/力学监测记录模板_1670813172669.docx"; +// +// // 添加电子印章后文件存放地址 +// String wordNewUrl = localPathUrl + "\\tem.docx"; +// //WORD转PDF存放位置 +// String pdfNewUrl = localPathUrl + "\\tem.pdf"; +// //电子印章图片地址 +// String stampImgUrl = localPathUrl + "\\sign3.png"; +// //电子签名图片地址 +// String stampImgUrl1 = localPathUrl + "\\name3.png"; +// // word文档内容关键字 +// String keyWord = "盖章"; +// StampUtils addStampUtils = new StampUtils(); +// List electronicSealList = new ArrayList(11); +// int count = 0; +// for (; count < 2; count++) { +// ElectronicImage electronicSeal = new ElectronicImage(); +// String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; +// electronicSeal.setElectronicSealImageUrl(tempStampImgUrl); +// electronicSeal.setMereFlag(count == 1); +// electronicSeal.setKeyWord(keyWord); +// electronicSeal.setKeyWordIndex(keyWordIndex); +// electronicSeal.setHorizontal(horizontal); +// electronicSeal.setVertical(vertical); +// electronicSeal.setStampHeight(stampHeight); +// electronicSeal.setStampWidth(stampWidth); +// electronicSealList.add(electronicSeal); +// } +// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); +// // 将新word转化为pdf文件 +// addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); + } + + +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java new file mode 100644 index 0000000..64213f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataGeneric.java @@ -0,0 +1,18 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import java.util.ArrayList; +import java.util.List; + +public interface PrintFileDataGeneric { + + /** + * * 1、查询fileName + * * 2、组装参数param外的参数 + * * 3、填充注册表信息参数 + */ + FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java new file mode 100644 index 0000000..6fe5810 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileDataSupport.java @@ -0,0 +1,28 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.mapper.sys.PrintFileRegisterMapper; +import com.casic.missiles.model.business.BusinessCertificateReport; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +public class PrintFileDataSupport { + + + @Resource + protected PrintFileRegisterMapper fileRegisterMapper; + + protected void initialization(FilePrintRegister filePrintRegister, String templateFileDir, BusinessCertificateReport certificateReport) { + String fileName = fileRegisterMapper.getFileNameById(certificateReport.getTemplateId(), "system_template"); + filePrintRegister.setFileName(fileName); + filePrintRegister.setTemDir(templateFileDir); + filePrintRegister.setFileName(templateFileDir + "\\" + fileName); + filePrintRegister.setFileNameId(String.valueOf(certificateReport.getId())); + List fileNames=new ArrayList<>(); + fileNames.add(fileName); + filePrintRegister.setBeDownloadedFileNames(fileNames); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java new file mode 100644 index 0000000..a65932c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/PrintFileRegister.java @@ -0,0 +1,149 @@ +package com.casic.missiles.listeners.processor.register; + +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.AwareCertificateTypeEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.SpringContextUtil; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +@Component +@Slf4j +public class PrintFileRegister { + + @Autowired + private MinioClient minioClient; + @Autowired + private MinioUtil minioUtil; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${casic.file.dir}") + private String localFileDir; + + /** + * 打印文件注册到服务器上有以下几个步骤 + * 1、根据打印证书的类型,获取自定义的注册打印文件对象 + * 2、进行远程文件的下载工作,支持文件的读写权限操作 + * 3、进行文件的填充合并等操作,即通过模板进行打印证书的信息注册 + * 4、将注册产生的打印证书信息上传到服务器 + * 5、删除因为打印产生的文件信息 + * 6、返还打印产生的证书文件 + */ + public String registerPrintFile(BusinessCertificateReport certificateReport) { + //获取对应证书的beanName + String fileDataRegisterBeanName = AwareCertificateTypeEnum.CERTIFICATE_TYPE_BEAN_MAP + .getCertificateTypeBeanMap().get(certificateReport.getCertificateReportType()); + if (StringUtils.isEmpty(fileDataRegisterBeanName)) { + throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); + } + PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + if (fileDataGeneric != null) { + FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(certificateReport, localFileDir); + localFileDir=localFileDir+"\\"+metaData.getFileNameId(); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + metaData.getBeDownloadedFileNames().forEach( + fileName -> downTemplateFile(fileName) + ); + //合并注册 + String certificatePdfName = FilePrintRegisterUtils.filePrintGenerate(metaData); + //上传到服务器 + uploadCertificate(certificatePdfName); + //删除无效的文件 + File invalidFile = new File(localFileDir); + log.debug("invalid print file start delete, the file directory is {}", localFileDir); + //删除运行空间下的文件 + deleteFile(invalidFile); + return certificatePdfName; + } + throw new RuntimeException("the bean mapped to this certificate type is empty..."); + } + + /** + * 下载文件,获取文件的读写权限 + */ + private void downTemplateFile(String fileName) { +// Properties properties = new Properties(); +// String bucketName = properties.getProperty("minio.bucketName"); +// MinioClient minioClient = SpringContextUtil.getBean(MinioClient.class); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + FilePrintRegisterUtils.byteToFile(bytes, localFileDir, fileName); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 通过生成的证书报告url,将证书报告上传到远程的文件服务器 + */ + public void uploadCertificate(String certificatePrintUrl) { + try { + //上传证书 + File file = new File(localFileDir + certificatePrintUrl); + //获取file对象的文件输入流 + FileInputStream input = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); + MultipartFile[] multipartFiles = new MultipartFile[1]; + multipartFiles[0] = multipartFile; + minioUtil.upload(multipartFiles); + } catch (IOException ie) { + log.error("Description Failed to upload the certificate to the server,the failed reason is {}...", ie); + } + } + + /** + * 对打印报告产生的空间进行清除 + */ + private void deleteFile(File invalidFile) { + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + files[i].delete(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i]); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java new file mode 100644 index 0000000..957858e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/CalibrationPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 校准证书参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.CALIBRATION_CERTIFICATE_BEAN) +public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java new file mode 100644 index 0000000..bcf5607 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/processor/register/data/TestReportPrintFileData.java @@ -0,0 +1,61 @@ +package com.casic.missiles.listeners.processor.register.data; + +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataRegisterBeanEnum; +import com.casic.missiles.listeners.processor.register.PrintFileDataGeneric; +import com.casic.missiles.listeners.processor.register.PrintFileDataSupport; +import com.casic.missiles.model.business.BusinessCertificateReport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 测试报告参数生成 + */ +@Component(PrintFileDataRegisterBeanEnum.TEST_REPORT_BEAN) +public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + /** + * 1、进行打印证书对象的初始化 + * 2、获取定制化的签名 + * 3、获取定制化的参数 + * + * @param metaData 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(BusinessCertificateReport metaData, String templateFileDir) { + FilePrintRegister filePrintRegister = new FilePrintRegister(); + initialization(filePrintRegister, templateFileDir, metaData); + filePrintRegister.setElectronicImageList(this.getCustomizedSignName(metaData)); + doPopulatePrintFileRegister(filePrintRegister, metaData); + return filePrintRegister; + } + + + /** + * 每一种证书可能存在一个或者多个定制化的签名、签章 + */ + private List getCustomizedSignName(BusinessCertificateReport certificateReport) { + List customizedSignNames = new ArrayList<>(); + List fileNames = new ArrayList<>(); + String signName = fileRegisterMapper.getFileNameById(certificateReport.getSignId(), ""); + return customizedSignNames; + } + + /** + * 定制化的证书参数 + */ + private void doPopulatePrintFileRegister(FilePrintRegister filePrintRegister, BusinessCertificateReport metaData) { + Map params = new HashMap<>(); +// params.put() + filePrintRegister.setParams(params); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java deleted file mode 100644 index 3f30be3..0000000 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/StampUtils.java +++ /dev/null @@ -1,472 +0,0 @@ -package com.casic.missiles.utils; - - -import cn.afterturn.easypoi.word.WordExportUtil; -import cn.hutool.core.lang.Assert; -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.spire.doc.*; -import com.spire.doc.documents.*; -import com.spire.doc.fields.DocPicture; -import com.spire.doc.fields.TextRange; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; -import java.util.ArrayList; -import java.util.Map; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author:zt - * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 - * @Version:1.0 - */ - -public class StampUtils { - - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - // 电子印章水平位置 - private final static float horizontal = 300f; - // 电子印章垂直位置 - private final static float vertical = -55f; - // 电子印章宽度 - private final static float stampWidth = 120; - // 电子印章高度 - private final static float stampHeight = 120; - //照片透明度设置 - private final static int alpha = 150; - - - /** - * @param filePrintRegister 标准文件注册表 - */ - public static void filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { - //1、按照模板填充数据,并导出word - String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - //设置透明属性 1、获取照片 2、签章背景透明设置 3、设置照片路径和照片类型进行图片保存 - for (ElectronicImage electronicSeal : filePrintRegister.getElectronicImageList()) { - BufferedImage bi = readImage(electronicSeal.getElectronicSealImgeUrl()); - BufferedImage electronSealImage = convertLayout(bi, electronicSeal.getDiaphaneity()); - String stampImgUrl = electronicSeal.getElectronicSealImgeUrl(); - String imagePath = stampImgUrl.substring(0, stampImgUrl.length() - 4) + "1.png"; - String[] imageCutOffContents = stampImgUrl.split("."); - electronicSeal.setElectronicSealImgeUrl(imagePath); - saveFile(electronSealImage, imageCutOffContents[imageCutOffContents.length - 1], imagePath); - } - //按关键字进行分组 - Map> sameKeySealMaps = filePrintRegister.getElectronicImageList().stream().collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); - // 初始化world,pdf名称参数 - String[] filePrintType = filePrintRegister.getTemplatePath().split("."); - String wordNewUrl = filePrintRegister.getFileName() + filePrintType[filePrintType.length - 1]; - String pdfNewUrl = filePrintRegister.getFileName() + "pdf"; - //3、根据关键字进行添加签章和签字 - for (Map.Entry> entry : sameKeySealMaps.entrySet()) { - String mapKey = entry.getKey(); - List electronicSeals = entry.getValue(); - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); - } - // 4、将新word转化为pdf文件 - wordToPdf(wordNewUrl, pdfNewUrl); - } - - /** - * 按照模板 填充数据生成word 只支持docx - * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 - */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); - Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); - if (!temDir.endsWith("/")) { - temDir = temDir + File.separator; - } - File dir = new File(temDir); - if (!dir.getParentFile().exists()) { - // 新建文件夹 - dir.getParentFile().mkdirs(); - } - String tmpPath = ""; - try { - XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); - doc.write(fos); - fos.flush(); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - return tmpPath; - } - - - /** - * 将相同关键字的印章添加到同一个位置进行打印 - * 1、根据关键词位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 - */ - private static void addSameKeyWordStamp(String wordOldUrl, String wordNewUrl, List electronicSealList) throws RuntimeException { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImgeUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); - } - Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph(); - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImgeUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(horizontal); - //垂直位置 - docPicture.setVerticalPosition(vertical); - //设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - } - //保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); - } - - /** - * 替换书签名位置文本内容 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newBookmarkText 新文本内容 - */ - private void replaceBookmarkContent(Document document, String bookmarkName, String newBookmarkText) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致 - bookmarksNavigator.replaceBookmarkContent(newBookmarkText, true); - } - - /** - * word转PDF - * - * @param wordNewUrl word文件路径 - * @param pdfNewUrl 存储新PDF文件路径 - */ - public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { -// 将新Word文档转换为PDF文件 - Document document = new Document(); - document.loadFromFile(wordNewUrl); - document.saveToFile(pdfNewUrl, FileFormat.PDF); - document.dispose(); - } - /** - * 图片透明背景转换 - * - * @param imgsrc - * @param alpha - * @return - */ - public static BufferedImage convertLayout(BufferedImage imgsrc, int alpha) { - try { - //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 - BufferedImage back = new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(), BufferedImage.TYPE_INT_ARGB); - int width = imgsrc.getWidth(); - int height = imgsrc.getHeight(); - for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i++) { - int rgb = imgsrc.getRGB(i, j); - Color color = new Color(rgb); - Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); - back.setRGB(i, j, newcolor.getRGB()); - } - } - return back; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - - /** - * 1、自定义位置添加电子印章 - * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 - * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param stampImgUrl 电子印章图片路径 - * @param horizontal 电子印章水平位置 (当前文件推荐260f) - * @param vertical 电子印章垂直位置 (当前推荐455f) - * @param stampWidth 电子印章宽度(推荐120) - * @param stampHeight 电子印章高度(推荐120) - * @param bookmarkName 书签名,通过名称寻找书签文本所在位置 - * @param newBookmarkText 替换的文本新内容 - */ - public void addStamp(String wordOldUrl, String wordNewUrl, String stampImgUrl, - Float horizontal, Float vertical, Float stampWidth, - Float stampHeight, String bookmarkName, String newBookmarkText) { - // 加载文档 - Document document = new Document(); - document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //获取段落总数 - int count = section.getParagraphs().getCount(); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(bookmarkName)) { - replaceBookmarkContent(document, bookmarkName, newBookmarkText); - } - -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(stampImgUrl); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(horizontal); -// 垂直位置 - docPicture.setVerticalPosition(vertical); - -// 设置电子章大小 - docPicture.setWidth(stampWidth); - docPicture.setHeight(stampHeight); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - - // 保存添加电子章的Word文档 - document.saveToFile(wordNewUrl); - document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); - - } - - - /** - * 替换书签名位置文本内容为图片 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - * @param newImgUrl 图片地址 - */ - public void replaceBookmarkContentToImg(Document document, String bookmarkName, String newImgUrl) { - //定位到指定书签位置 - BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document); - bookmarksNavigator.moveToBookmark(bookmarkName); - //添加图片,替换原有书签内容 - Paragraph para = new Paragraph(document); - para.appendPicture(newImgUrl); - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(para); - bookmarksNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 替换书签名位置文本内容为表格 - * - * @param document word文档对象 - * @param bookmarkName 书签名 - */ - public void replaceBookmarkContentToTable(Document document, String bookmarkName) { - //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - - //创建表格 - Table table = new Table(document, true); - table.resetCells(4, 3); - for (int i = 0; i < data.length; i++) { - TableRow dataRow = table.getRows().get(i); - for (int j = 0; j < data[i].length; j++) { - TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]); - range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center); - range.getCharacterFormat().setFontName("楷体"); - dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center); - dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); - } - } - - //创建TextBodyPart对象 - TextBodyPart bodyPart = new TextBodyPart(document); - bodyPart.getBodyItems().add(table); - - //定位到指定书签位置 - BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); - bookmarkNavigator.moveToBookmark(bookmarkName); - - //使用表格替换原书签的内容 - bookmarkNavigator.replaceBookmarkContent(bodyPart); - } - - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - /** - * 流转文件 - * - * @param buf 流字节数组 - * @param filePath 新文件路径 - * @param fileName 新文件名称 - */ - public void byte2File(byte[] buf, String filePath, String fileName) { - BufferedOutputStream bos = null; - FileOutputStream fos = null; - File file = null; - try { - File dir = new File(filePath); - if (!dir.exists() && dir.isDirectory()) { - dir.mkdirs(); - } - file = new File(filePath + File.separator + fileName); - fos = new FileOutputStream(file); - bos = new BufferedOutputStream(fos); - bos.write(buf); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (bos != null) { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String[] args) throws RuntimeException { - - String pathUrl = "D:\\cz\\upload"; - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage bi = readImage(pathUrl + "\\sign1.png"); - BufferedImage bii = convertLayout(bi, alpha); - //生成透明背景图片 - saveFile(bii, "PNG", pathUrl + "\\sign3.png"); - - //文件与BufferedImage间的转换 - //读取图片 - BufferedImage b = readImage(pathUrl + "\\name1.png"); - BufferedImage b0 = convertLayout(b, alpha); - //生成透明背景图片 - saveFile(b0, "PNG", pathUrl + "\\name3.png"); - - // 目标文件地址 - String wordOldUrl = pathUrl + "\\wordExport.docx"; - - // 添加电子印章后文件存放地址 - String wordNewUrl = pathUrl + "\\tem.docx"; - //WORD转PDF存放位置 - String pdfNewUrl = pathUrl + "\\tem.pdf"; - //电子印章图片地址 - String stampImgUrl = pathUrl + "\\sign3.png"; - //电子签名图片地址 - String stampImgUrl1 = pathUrl + "\\name3.png"; - // word文档内容关键字 - String keyWord = "盖章"; - StampUtils addStampUtils = new StampUtils(); - List electronicSealList = new ArrayList(11); - int count = 0; - for (; count < 2; count++) { - ElectronicImage electronicSeal = new ElectronicImage(); - String tempStampImgUrl = count == 0 ? stampImgUrl : stampImgUrl1; - electronicSeal.setElectronicSealImgeUrl(tempStampImgUrl); - electronicSeal.setMereFlag(count == 1); - electronicSeal.setKeyWord(keyWord); - electronicSeal.setKeyWordIndex(keyWordIndex); - electronicSeal.setHorizontal(horizontal); - electronicSeal.setVertical(vertical); - electronicSeal.setStampHeight(stampHeight); - electronicSeal.setStampWidth(stampWidth); - electronicSealList.add(electronicSeal); - } - addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSealList); - // 将新word转化为pdf文件 - addStampUtils.wordToPdf(wordNewUrl, pdfNewUrl); - } -} \ No newline at end of file diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java new file mode 100644 index 0000000..324a8a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/sys/PrintFileRegisterMapper.java @@ -0,0 +1,14 @@ +package com.casic.missiles.mapper.sys; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface PrintFileRegisterMapper { + + @Select(" SELECT minio_file_name " + + " FROM ${tableName} " + + " where id =#{id}} ") + String getFileNameById(@Param("id")Long id,@Param("tableName")String tableName); +} diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml index 9d6058f..2df5f93 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificatePrintMapper.xml @@ -39,7 +39,7 @@ csi.sample_name AS "sampleName",csi.sample_model AS "sampleModel",csi.manufacturing_no AS "manufacturingNo",bo.order_code AS "orderNo", csi.measure_type AS "measureType",bcp.certificate_report_type AS "certificateType",bcp.print_status AS - "printStatus",bcp.print_num AS "printNum", + "printStatus",bcp.print_num AS "printNum",bcp.print_file_name AS "printFileName", bcp.approval_status AS "approvalStatus",bcp.create_time AS "createTime",bcp.measure_person_id AS "measurePersonId" FROM ( SELECT * @@ -51,6 +51,9 @@ and certificate_report_category like concat('%',#{request.certificateClass},'%') + + and approval_status =#{request.approvalStatus } + and print_status = #{request.printStatus} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 1253d35..47fc55e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -8,32 +8,47 @@ @Data public class ElectronicImage { + { + //关键字索引 (-1) + final Integer keyWordIndex = -1; + // 电子印章水平位置 + final float horizontal = 300f; + // 电子印章垂直位置 + final float vertical = -55f; + // 电子印章宽度 + final float stampWidth = 120; + // 电子印章高度 + final float stampHeight = 120; + //照片透明度设置 + final int alpha = 150; + } + /** * 电子签章资源路径 */ - private String electronicSealImgeUrl; + private String electronicSealImageUrl; /** - * 透明度 + * 透明度 */ - private Integer diaphaneity; + private Integer diaphaneity; /** - * 透明度 + * 透明度 */ - private Boolean mereFlag; + private Boolean mereFlag; /** * 电子印章水平位置 (当前文件推荐260f) */ private Float horizontal; /** - * 关键字 + * 关键字 */ - private String keyWord; + private String keyWord; /** - * 关键字索引 + * 关键字索引 */ private Integer keyWordIndex; /** 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 index 778fedb..5a0949b 100644 --- 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 @@ -25,10 +25,17 @@ */ private String fileName; /** + * 生成文件工作空间目录id + */ + private String fileNameId; + /** * 模板参数 */ private Map params; + + private List beDownloadedFileNames; + /** * electronicSealList 填充的电子图片信息 */ diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java index 267b9a1..f043071 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/print/CertificateListResponse.java @@ -102,4 +102,8 @@ @ExcelProperty(value = "审批状态",order = 13) private String approvalStatusName; + @ApiModelProperty(value = "证书打印名称", dataType = "String") + private String printFileName; + + } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificatePrint.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificatePrint.java index c058524..052513d 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificatePrint.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificatePrint.java @@ -117,6 +117,8 @@ @TableField("certificate_organization") private String certificateOrganization; + @TableField("print_file_name") + private String printFileName; /** * 证书报告附件(minio存储文件名) */ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificatePrintServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificatePrintServiceImpl.java index 4211dfd..e378c28 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificatePrintServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificatePrintServiceImpl.java @@ -66,7 +66,7 @@ @Override public CertificatePrintDetail certificatePrintDetail(Long id) { - CertificatePrintDetail certificatePrintDetail=this.baseMapper.selectPrintDetailById(id); + CertificatePrintDetail certificatePrintDetail = this.baseMapper.selectPrintDetailById(id); return certificatePrintDetail; } @@ -97,7 +97,7 @@ } /** - * 更新工作流审批状态为拒绝,当返回值成功时,进行打印状态置为不可打印,审批状态为不通过 + * 更新工作流审批状态为拒绝,当返回值成功时,进行打印状态置为不可打印,审批状态为不通过 * * @return */ @@ -111,7 +111,7 @@ if (!ResponseData.DEFAULT_SUCCESS_CODE.equals(returnDTO.getCode())) { return returnDTO; } - BusinessCertificatePrint certificatePrint =BusinessCertificatePrint.builder() + BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() .id(request.getId()) .printStatus(NON_PRINTABLE) .approvalStatus(ApprovalStatusEnum.FAILED) @@ -124,7 +124,7 @@ } /** - * 提交审批流程,修改证书审批状态为待审批,打印状态为审批中 + * 提交审批流程,修改证书审批状态为待审批,打印状态为审批中 */ @Transactional @Override @@ -157,10 +157,10 @@ */ private Page handleApprovalStatus(Page page, CertificateListRequest request) throws Exception { Page approvalList = PageFactory.defaultPage(); - if (ApprovalStatusEnum.TO_BE_APPROVED.equals(request.getApprovalStatus())&&CollectionUtils.isEmpty(request.getIds())) { - approvalList=handlerBeApproved(approvalList, page, request); - }else { - approvalList=this.baseMapper.selectBatchForApprovalList(page, request, null); + if (ApprovalStatusEnum.TO_BE_APPROVED.equals(request.getApprovalStatus()) && CollectionUtils.isEmpty(request.getIds())) { + approvalList = handlerBeApproved(approvalList, page, request); + } else { + approvalList = this.baseMapper.selectBatchForApprovalList(page, request, null); } for (CertificateListResponse certificateListResponse : approvalList.getRecords()) { DictCodeUtils.convertDictCodeToName(certificateListResponse); @@ -178,7 +178,7 @@ businessKeys = toBeApprovedList.stream().map(ToBeApprovedDTO::getBusinessKey).collect(Collectors.toList()); } if (!CollectionUtils.isEmpty(businessKeys)) { - approvalList=this.baseMapper.selectBatchForApprovalList(page, request, businessKeys); + approvalList = this.baseMapper.selectBatchForApprovalList(page, request, businessKeys); //DTO根据业务主键补全taskId approvalList.getRecords().forEach(approval -> { toBeApprovedList.forEach(toBeApprovedDTO -> {