From 802ab045945aefd69f87ed9fc78f5e25b4e9014c Mon Sep 17 00:00:00 2001 From: wangzhijiang <12345678> Date: Tue, 24 May 2022 17:30:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=B3=95=E8=A7=84=E6=B8=85?= =?UTF-8?q?=E5=8D=95word=E6=96=87=E4=BB=B6=E6=8E=A5=E5=8F=A3=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E3=80=82=20=E6=A0=B9=E6=8D=AE=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=BA=93id=20=20=E6=9F=A5=E8=AF=A2=E5=BD=93=E5=89=8D=E7=99=BB?= =?UTF-8?q?=E9=99=86=E4=BA=BA=E5=9C=A8=E8=AF=A5=E9=A1=B9=E7=9B=AE=E4=B8=AD?= =?UTF-8?q?=E6=98=AF=E4=BB=80=E4=B9=88=E8=A7=92=E8=89=B2=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SynologyDrive/5.模板/1.模板说明.txt | 1 + .../5.模板/ComplianceReportTemplate.docx | Bin 0 -> 82149 bytes jero-boot/jero-boot-modules/pom.xml | 35 ++ ...ectCertificationDirectoryEOController.java | 10 + .../ProjectLawsInventoryEOController.java | 23 +- ...rojectCertificationDirectoryEOService.java | 7 + .../IProjectLawsInventoryEOService.java | 15 + ...ctCertificationDirectoryEOServiceImpl.java | 42 ++- .../ProjectLawsInventoryEOServiceImpl.java | 335 +++++++++++++++++- .../impl/ProjectLibraryBaseServiceImpl.java | 10 +- .../modules/project/util/Docx4jUtils.java | 246 +++++++++++++ .../jero/modules/project/util/WordUtil.java | 315 ++++++++++++++++ 12 files changed, 1009 insertions(+), 30 deletions(-) create mode 100644 SynologyDrive/5.模板/1.模板说明.txt create mode 100644 SynologyDrive/5.模板/ComplianceReportTemplate.docx create mode 100644 jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/Docx4jUtils.java create mode 100644 jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/WordUtil.java diff --git a/SynologyDrive/5.模板/1.模板说明.txt b/SynologyDrive/5.模板/1.模板说明.txt new file mode 100644 index 000000000..fa29afa71 --- /dev/null +++ b/SynologyDrive/5.模板/1.模板说明.txt @@ -0,0 +1 @@ +ComplianceReportTemplate.docx : 法规清单 - 导出报告模板 diff --git a/SynologyDrive/5.模板/ComplianceReportTemplate.docx b/SynologyDrive/5.模板/ComplianceReportTemplate.docx new file mode 100644 index 0000000000000000000000000000000000000000..bb2ddeb81771d273f4a0afd134cc2dc075b28286 GIT binary patch literal 82149 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 HHG=#fastjson 1.2.62 + + + + + org.docx4j + docx4j + 6.0.1 + + + + org.springframework + spring + + + org.slf4j + slf4j-log4j12 + + + + + org.docx4j + docx4j-export-fo + 6.0.1 + + + + org.springframework + spring + + + org.slf4j + slf4j-log4j12 + + + diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectCertificationDirectoryEOController.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectCertificationDirectoryEOController.java index ef8da523f..72be05f10 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectCertificationDirectoryEOController.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectCertificationDirectoryEOController.java @@ -159,4 +159,14 @@ public class ProjectCertificationDirectoryEOController extends JeroController queryUserPremissionByProjectLibraryId(@RequestParam(name="projectLibraryId",required=true) String projectLibraryId) { + return projectCertificationDirectoryEOService.queryUserPremissionByProjectLibraryId(projectLibraryId); + } + } diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectLawsInventoryEOController.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectLawsInventoryEOController.java index f5caa0ca2..7a9038e63 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectLawsInventoryEOController.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectLawsInventoryEOController.java @@ -380,12 +380,7 @@ public class ProjectLawsInventoryEOController extends JeroController params, HttpServletRequest req, HttpServletResponse resp) throws DocumentException { - public void downloadReport(@RequestParam("cut")String cut,@RequestParam("id")String id, HttpServletRequest req, HttpServletResponse resp) throws DocumentException { - Map params = new HashMap<>(); - params.put("cut",cut); - params.put("id",id); - + public void downloadReport(@RequestParam Map params, HttpServletRequest req, HttpServletResponse resp) throws DocumentException { this.projectLawsInventoryEOService.downloadReport(params,req,resp); } @@ -415,4 +410,20 @@ public class ProjectLawsInventoryEOController extends JeroController params, HttpServletRequest req, HttpServletResponse resp) throws DocumentException { + this.projectLawsInventoryEOService.downloadDocxReport(params,req,resp); + } + } diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectCertificationDirectoryEOService.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectCertificationDirectoryEOService.java index 62aec1d0a..3e10e3510 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectCertificationDirectoryEOService.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectCertificationDirectoryEOService.java @@ -71,4 +71,11 @@ public interface IProjectCertificationDirectoryEOService extends IService queryPageList(ProjectCertificationDirectoryEO projectCertificationDirectoryEO, Integer pageNo, Integer pageSize, HttpServletRequest req); + + /** + * 根据项目库id 查询当前登陆人在该项目中是什么角色 + * @param projectLibraryId + * @return + */ + Result queryUserPremissionByProjectLibraryId(String projectLibraryId); } diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectLawsInventoryEOService.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectLawsInventoryEOService.java index 61c7b047e..aba210a76 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectLawsInventoryEOService.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectLawsInventoryEOService.java @@ -121,5 +121,20 @@ public interface IProjectLawsInventoryEOService extends IService change(Map parmas); + /** + * 下载pdf报告 + * @param params + * @param req + * @param resp + * @throws DocumentException + */ void downloadReport(Map params,HttpServletRequest req, HttpServletResponse resp)throws DocumentException; + + /** + * 下载docx报告 + * @param params + * @param req + * @param resp + */ + void downloadDocxReport(Map params, HttpServletRequest req, HttpServletResponse resp); } diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectCertificationDirectoryEOServiceImpl.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectCertificationDirectoryEOServiceImpl.java index 8a4fcb5d0..4cf873edf 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectCertificationDirectoryEOServiceImpl.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectCertificationDirectoryEOServiceImpl.java @@ -145,38 +145,48 @@ public class ProjectCertificationDirectoryEOServiceImpl extends ServiceImpl queryUserPremissionByProjectLibraryId(String projectLibraryId) { + int roleCode = checkUserRole(projectLibraryId); + return Result.OK(roleCode); + } + public int checkUserRole(String projectLibraryId){ int result = -1; LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); try{ + QueryWrapper inventoryEOQueryWrapperRZ = new QueryWrapper<>(); + inventoryEOQueryWrapperRZ.lambda().eq(ProjectLawsInventoryEO::getProjectLibraryId,projectLibraryId); + inventoryEOQueryWrapperRZ.lambda().eq(ProjectLawsInventoryEO::getHomologationEngineerId,currentUser.getId()); + Integer lawsInventoryCountRZ = projectLawsInventoryEOMapper.selectCount(inventoryEOQueryWrapperRZ); + if(lawsInventoryCountRZ > 0){ + result = Integer.parseInt(ProjectRoleEnum.HOMOLOGATION_ENGINEER.getValue()); + return result; + } + + QueryWrapper projectLibraryBaseQueryWrapper = new QueryWrapper<>(); projectLibraryBaseQueryWrapper.lambda().eq(ProjectLibraryBase::getId,projectLibraryId); projectLibraryBaseQueryWrapper.lambda().eq(ProjectLibraryBase::getStudioEngineer,currentUser.getId()); Integer projectLibrayBaseCount = projectLibraryBaseMapper.selectCount(projectLibraryBaseQueryWrapper); if(projectLibrayBaseCount > 0){ result = Integer.parseInt(ProjectRoleEnum.STUDIO_ENGINEER.getValue()); - }else { - QueryWrapper inventoryEOQueryWrapperFG = new QueryWrapper<>(); - inventoryEOQueryWrapperFG.lambda().eq(ProjectLawsInventoryEO::getProjectLibraryId,projectLibraryId); - inventoryEOQueryWrapperFG.lambda().eq(ProjectLawsInventoryEO::getRegulationOwnerId,currentUser.getId()); - Integer lawsInventoryCountFG = projectLawsInventoryEOMapper.selectCount(inventoryEOQueryWrapperFG); - if(lawsInventoryCountFG > 0){ - result = Integer.parseInt(ProjectRoleEnum.REGULATI_ENGINEER.getValue()); - } + return result; + } - QueryWrapper inventoryEOQueryWrapperRZ = new QueryWrapper<>(); - inventoryEOQueryWrapperRZ.lambda().eq(ProjectLawsInventoryEO::getProjectLibraryId,projectLibraryId); - inventoryEOQueryWrapperRZ.lambda().eq(ProjectLawsInventoryEO::getHomologationEngineerId,currentUser.getId()); - Integer lawsInventoryCountRZ = projectLawsInventoryEOMapper.selectCount(inventoryEOQueryWrapperRZ); - if(lawsInventoryCountRZ > 0){ - result = Integer.parseInt(ProjectRoleEnum.HOMOLOGATION_ENGINEER.getValue()); - } + QueryWrapper inventoryEOQueryWrapperFG = new QueryWrapper<>(); + inventoryEOQueryWrapperFG.lambda().eq(ProjectLawsInventoryEO::getProjectLibraryId,projectLibraryId); + inventoryEOQueryWrapperFG.lambda().eq(ProjectLawsInventoryEO::getRegulationOwnerId,currentUser.getId()); + Integer lawsInventoryCountFG = projectLawsInventoryEOMapper.selectCount(inventoryEOQueryWrapperFG); + if(lawsInventoryCountFG > 0){ + result = Integer.parseInt(ProjectRoleEnum.REGULATI_ENGINEER.getValue()); + return result; } }catch (Exception ex){ log.error("验证用户在该项目中的角色失败:" + ex.getMessage()); throw new JeroBootException("验证用户在该项目中的角色失败!"); } - return result; + return -1; } /** diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectLawsInventoryEOServiceImpl.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectLawsInventoryEOServiceImpl.java index 0f33d185e..544f0ea0a 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectLawsInventoryEOServiceImpl.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectLawsInventoryEOServiceImpl.java @@ -1,11 +1,12 @@ package com.jero.modules.project.service.impl; import cn.hutool.core.util.ZipUtil; +//import com.jero.modules.project.util.WordUtil; +import cn.hutool.poi.word.DocUtil; import com.itextpdf.text.*; import com.itextpdf.text.Font; import com.itextpdf.text.pdf.*; import com.jero.modules.dummy.entity.DummyInventoryBaseEO; -import com.jero.modules.dummy.entity.DummyInventoryInfoEOEn; import com.jero.modules.dummy.enums.DummyInventoryBaseFieldEnum; import com.jero.modules.dummy.service.impl.DummyInventoryBaseEOServiceImpl; import com.alibaba.fastjson.JSON; @@ -26,11 +27,8 @@ import com.jero.common.system.vo.LoginUser; import com.jero.common.util.DateUtils; import com.jero.modules.document.entity.BussDocumentLibraryEO; import com.jero.modules.document.service.IBussDocumentLibraryEOService; -import com.jero.modules.dummy.entity.DummyInventoryBaseEO; import com.jero.modules.dummy.entity.DummyInventoryInfoEO; -import com.jero.modules.dummy.enums.DummyInventoryBaseFieldEnum; import com.jero.modules.dummy.service.IDummyInventoryInfoEOService; -import com.jero.modules.dummy.service.impl.DummyInventoryBaseEOServiceImpl; import com.jero.modules.dummy.util.ListDiff; import com.jero.modules.feishu.service.IFeishuService; import com.jero.modules.message.websocket.WebSocket; @@ -43,6 +41,7 @@ import com.jero.modules.project.mapper.ProjectLibraryBaseMapper; import com.jero.modules.project.mapper.ProjectNameInfoEOMapper; import com.jero.modules.project.mapper.ProjectRelatedPersonnelMapper; import com.jero.modules.project.service.*; +import com.jero.modules.project.util.WordUtil; import com.jero.modules.split.common.FileUnZip; import com.jero.modules.system.entity.SysAnnouncement; import com.jero.modules.system.entity.SysCategory; @@ -54,6 +53,9 @@ import com.jero.modules.system.service.ISysAnnouncementService; import com.jero.modules.system.service.ISysUserService; import com.jero.modules.system.service.impl.SysCategoryServiceImpl; import com.jero.modules.system.service.impl.SysDictItemServiceImpl; +import com.jero.modules.wkflow.entity.ProcessHistoryEO; +import com.jero.modules.wkflow.service.IProcessHistoryEOService; +import com.jero.modules.wkflow.service.impl.ProcessHistoryEOServiceImpl; import lombok.SneakyThrows; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; @@ -66,6 +68,18 @@ import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.shiro.SecurityUtils; import org.aspectj.util.FileUtil; +import org.docx4j.Docx4J; +import org.docx4j.TraversalUtil; +import org.docx4j.XmlUtils; +import org.docx4j.finders.ClassFinder; +import org.docx4j.finders.RangeFinder; +import org.docx4j.openpackaging.exceptions.Docx4JException; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; +import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; +import org.docx4j.wml.Body; +import org.docx4j.wml.CTBookmark; +import org.docx4j.wml.Tbl; +import org.docx4j.wml.Tr; import org.jeecgframework.poi.excel.ExcelExportUtil; import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.enmus.ExcelType; @@ -166,6 +180,9 @@ public class ProjectLawsInventoryEOServiceImpl extends ServiceImpl params, HttpServletRequest req, HttpServletResponse resp) { + File templateFile = null; + File exportFile = null; + InputStream fin = null; + ServletOutputStream out = null; + + String id = (String) params.get("id"); + String cut = (String) params.get("cut"); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + //查询数据 + QueryWrapper lawsInventoryQueryWrapper = new QueryWrapper<>(); + lawsInventoryQueryWrapper.lambda().eq(ProjectLawsInventoryEO::getId,id); + ProjectLawsInventoryEO projectLawsInventoryEO = this.baseMapper.selectOne(lawsInventoryQueryWrapper); + params.put("projectLawsInventoryEO",projectLawsInventoryEO); + + QueryWrapper taskInventoryQueryWrapper = new QueryWrapper<>(); + taskInventoryQueryWrapper.lambda().eq(ProjectTaskInventoryEO::getProjectLawsInventoryId,id); + ProjectTaskInventoryEO projectTaskInventoryEO = projectTaskInventoryEOService.getBaseMapper().selectOne(taskInventoryQueryWrapper); + params.put("projectTaskInventoryEO",projectTaskInventoryEO); + + QueryWrapper libraryBaseQueryWrapper = new QueryWrapper<>(); + libraryBaseQueryWrapper.lambda().eq(ProjectLibraryBase::getId,projectLawsInventoryEO.getProjectLibraryId()); + ProjectLibraryBase projectLibraryBase = projectLibraryBaseMapper.selectOne(libraryBaseQueryWrapper); + params.put("projectLibraryBase",projectLibraryBase); + + QueryWrapper projectNameQueryWrapper = new QueryWrapper<>(); + projectNameQueryWrapper.lambda().eq(ProjectNameInfoEO::getId,projectLibraryBase.getProjectNameId()); + ProjectNameInfoEO projectNameInfoEO = projectNameInfoEOMapper.selectOne(projectNameQueryWrapper); + params.put("projectNameInfoEO",projectNameInfoEO); + + + final Map dataMap = new HashMap<>(); + //对应 CR No + dataMap.put("crNo", String.valueOf(new SimpleDateFormat("yyyyMMddHHmmssSSSS").format(new Date()))); + + String flowStatus = ""; + if(StringUtils.isNotEmpty(projectTaskInventoryEO.getVerifyStatus())){ + flowStatus = projectTaskInventoryEO.getVerifyStatus() + ","; + } + if(StringUtils.isNotEmpty(projectTaskInventoryEO.getPrehomoStatus())){ + flowStatus += projectTaskInventoryEO.getPrehomoStatus() + ","; + } + if(StringUtils.isNotEmpty(projectTaskInventoryEO.getVerifyStatus())){ + flowStatus += projectTaskInventoryEO.getVerifyStatus() + ","; + } + if(StringUtils.isNotEmpty(flowStatus)){ + flowStatus = flowStatus.substring(0,flowStatus.length() - 1); + } + + //对应 crStatus + dataMap.put("FLOW_STATUS", StringUtils.isNotEmpty(flowStatus) ? flowStatus : ""); + //对应 Regulation + dataMap.put("REGULATION", StringUtils.isNotEmpty(projectLawsInventoryEO.getSerialNumber()) ? projectLawsInventoryEO.getSerialNumber() : ""); + //对应 Subject + dataMap.put("SUBJECT", StringUtils.isNotEmpty(projectLawsInventoryEO.getTitle()) ? projectLawsInventoryEO.getTitle() : ""); + //对应 Project + dataMap.put("PROJECT_NAME", StringUtils.isNotEmpty(projectNameInfoEO.getProjectName()) ? projectNameInfoEO.getProjectName() : ""); + + List regionDictList = sysDictItemServiceImpl.selectItemsByDictCode("region"); + String market = ""; + if(StringUtils.equals(cut,CutEnum.CN.getValue())){ + market = regionDictList.stream() + .filter(e -> projectLibraryBase.getTargetMarket().contains(e.getItemValue())) + .map(SysDictItem::getItemText) + .collect(Collectors.joining(",")); + }else if(StringUtils.equals(cut,CutEnum.EN.getValue())){ + market = regionDictList.stream() + .filter(e -> projectLibraryBase.getTargetMarket().contains(e.getItemValue())) + .map(SysDictItem::getEnName) + .collect(Collectors.joining(",")); + } + //对应 Market + dataMap.put("MARKET", StringUtils.isNotEmpty(market) ? market : ""); + //对应 nt 数字平台 + dataMap.put("NT", StringUtils.isNotEmpty(projectNameInfoEO.getDigitalPlatform()) ? projectNameInfoEO.getDigitalPlatform() : ""); + //对应 np 车型平台 + dataMap.put("NP", StringUtils.isNotEmpty(projectNameInfoEO.getVehiclePlatform()) ? projectNameInfoEO.getVehiclePlatform() : ""); + String processEndTimeStr = ""; + if(projectTaskInventoryEO.getProcessEndTime() != null){ + processEndTimeStr = sdf.format(projectTaskInventoryEO.getProcessEndTime()); + } + dataMap.put("COMPLETION_DATE", StringUtils.isNotEmpty(processEndTimeStr) ? processEndTimeStr : ""); + + String dutyTerritory = projectLawsInventoryEO.getDutyTerritory(); + String finalDutyTerritory = dutyTerritory; + List dutyTerritoryDictItemList = sysDictItemServiceImpl.selectItemsByDictCode("duty_territory"); + String dutyTerritoryName = ""; + if(StringUtils.equals(cut,CutEnum.CN.getValue())){ + dutyTerritoryName = dutyTerritoryDictItemList.stream() + .filter(e -> finalDutyTerritory.contains(e.getItemValue())) + .map(SysDictItem::getItemText) + .collect(Collectors.joining(",")); + }else if(StringUtils.equals(cut,CutEnum.EN.getValue())){ + dutyTerritoryName = dutyTerritoryDictItemList.stream() + .filter(e -> finalDutyTerritory.contains(e.getItemValue())) + .map(SysDictItem::getEnName) + .collect(Collectors.joining(",")); + } + dataMap.put("RESPONSIBLE_FIELD", StringUtils.isNotEmpty(dutyTerritoryName) ? dutyTerritoryName : ""); + + String studioEngineer = projectLibraryBase.getStudioEngineer(); + QueryWrapper queryStudioUserWrapper = new QueryWrapper<>(); + queryStudioUserWrapper.lambda().eq(SysUser::getId,studioEngineer); + SysUser studioUserInfo = sysUserMapper.selectOne(queryStudioUserWrapper); + dataMap.put("STUDIO", StringUtils.isNotEmpty(studioUserInfo.getUsername()) ? studioUserInfo.getUsername() : ""); + + String engineeringInterfacePerson = projectLawsInventoryEO.getEngineeringInterfacePerson(); + QueryWrapper queryEngineeringInterfaceUserWrapper = new QueryWrapper<>(); + queryEngineeringInterfaceUserWrapper.lambda().eq(SysUser::getId,engineeringInterfacePerson); + SysUser engineeringInterfaceInfo = sysUserMapper.selectOne(queryEngineeringInterfaceUserWrapper); + dataMap.put("ENGINEERING", StringUtils.isNotEmpty(engineeringInterfaceInfo.getUsername()) ? engineeringInterfaceInfo.getUsername() : ""); + + String homologationEngineerId = projectLawsInventoryEO.getHomologationEngineerId(); + QueryWrapper queryHomologationEngineerUserWrapper = new QueryWrapper<>(); + queryHomologationEngineerUserWrapper.lambda().eq(SysUser::getId,homologationEngineerId); + SysUser homologationEngineerInfo = sysUserMapper.selectOne(queryHomologationEngineerUserWrapper); + dataMap.put("HOMOLOGATION", StringUtils.isNotEmpty(homologationEngineerInfo.getUsername()) ? homologationEngineerInfo.getUsername() : ""); + + String regulationOwnerId = projectLawsInventoryEO.getRegulationOwnerId(); + QueryWrapper queryRegulationOwnerUserWrapper = new QueryWrapper<>(); + queryRegulationOwnerUserWrapper.lambda().eq(SysUser::getId,regulationOwnerId); + SysUser regulationOwnerInfo = sysUserMapper.selectOne(queryRegulationOwnerUserWrapper); + dataMap.put("REGULATION", StringUtils.isNotEmpty(regulationOwnerInfo.getUsername()) ? regulationOwnerInfo.getUsername() : ""); + + templateFile = new File(exportPdfTempPath + "temp/ComplianceReportTemplate.docx"); + if(templateFile != null){ + try { + String uuid = UUID.randomUUID().toString(); +// final String TEMP_FILE_PATH = System.getProperty("os.name").toLowerCase().contains("windows") ? System.getProperty("user.dir") + File.separator : "/home/admin/tempfile/"; + final String TEMP_FILE_PATH = exportPdfTempPath + "exportFile/"; + + File pathFile = new File(TEMP_FILE_PATH); + if (!pathFile.exists()) { + pathFile.mkdirs(); + } + String outFile = TEMP_FILE_PATH + uuid + ".docx"; + exportFile = new File(outFile); + FileOutputStream os = new FileOutputStream(outFile); + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new FileInputStream(templateFile)); + + //验证符合性流程实例id + String verifyPId = projectTaskInventoryEO.getVerifyPId(); + if(StringUtils.isNotEmpty(verifyPId)){ + //Compliance Attachments 验证符合性流程里最后通过审批的“工程确认”中的附件 + setTableContent(1,wordMLPackage,params,verifyPId); + //Validation Compliance Check Approvals(验证符合性确认的审批历史数据) + setTableContent(4,wordMLPackage,params,verifyPId); + } + //设计符合性流程实例id + String designPId = projectTaskInventoryEO.getDesignPId(); + if(StringUtils.isNotEmpty(designPId)){ + //Design Compliance Check Approvals (设计符合性确认的审批历史数据) + setTableContent(3,wordMLPackage,params,designPId); + } + + WordUtil.replaceVariable(wordMLPackage, dataMap); + Docx4J.save(wordMLPackage, os); + + //将替换后的文档输出出去。 + fin = new FileInputStream(outFile); + resp.setCharacterEncoding("utf-8"); + resp.setContentType("application/docx"); + + String filename = ""; + if(StringUtils.equals(cut,CutEnum.CN.getValue())){ + filename = "法规清单报告"; + }else if(StringUtils.equals(cut,CutEnum.EN.getValue())){ + filename = "Compliance List report"; + } + // 设置浏览器以下载的方式处理该文件 + if (req.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) { + filename = URLEncoder.encode(filename, "UTF-8"); + } else { + filename = new String(filename.getBytes("UTF-8"), "ISO8859-1"); + } + resp.setHeader("Content-Disposition", "attachment;filename=" + filename + ".docx"); + out = resp.getOutputStream(); + + // 缓冲区 + byte[] buffer = new byte[512]; + int bytesToRead = -1; + + // 通过循环将读入的Word文件的内容输出到浏览器中 + while ((bytesToRead = fin.read(buffer)) != -1) { + out.write(buffer, 0, bytesToRead); + } + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (fin != null){ + fin.close(); + } + if (out != null){ + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + + if (exportFile != null){ + // 删除导出去的文件 + exportFile.delete(); + } + } + }else { + throw new JeroBootException("路径 :" + exportPdfTempPath + "temp/ComplianceReportTemplate.docx" + " 中没有找到文件"); + } + } + + /** + * 设置表内容 + * @param tableIndex 表的下标 + * @param wordMLPackage + * @param params + * @param pId 流程实例id + */ + public void setTableContent(int tableIndex,WordprocessingMLPackage wordMLPackage, Map params,String pId){ + try{ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + List> dataList = new ArrayList<>(); + // 设置数据 + if(tableIndex == 1){ + QueryWrapper taskFeedbackQueryWrapper = new QueryWrapper<>(); + taskFeedbackQueryWrapper.lambda().eq(ProjectTaskInventoryFeedbackEO::getActiProcInstId,pId); + List projectTaskInventoryFeedbackEOList = projectTaskInventoryFeedbackEOService.getBaseMapper().selectList(taskFeedbackQueryWrapper); + if(CollectionUtils.isNotEmpty(projectTaskInventoryFeedbackEOList)){ + List fileIdList = projectTaskInventoryFeedbackEOList.stream().map(ProjectTaskInventoryFeedbackEO::getFileId).distinct().collect(Collectors.toList()); + String fileId = StringUtils.join(fileIdList,","); + List fileList = iOSSFileService.getFileInfos(fileId); + if(CollectionUtils.isNotEmpty(fileList)){ + fileList.forEach(file -> { + Map fileMap = new HashMap<>(); + fileMap.put("item.fileName", StringUtils.isNotEmpty(file.getFileName()) ? file.getFileName() : ""); + fileMap.put("item.filePath", StringUtils.isNotEmpty(file.getUrl()) ? file.getUrl() : ""); + dataList.add(fileMap); + }); + } + } + }else if(tableIndex == 3){ + params.put("actiProcInstId",pId); + List processHistoryEOList = processHistoryEOService.queryList(params); + if(CollectionUtils.isNotEmpty(processHistoryEOList)){ + processHistoryEOList.forEach(processHistory -> { + String createTime = sdf.format(processHistory.getCreateTime()); + + Map designMap = new HashMap<>(); + designMap.put("design.result", StringUtils.isNotEmpty(processHistory.getReviewResult()) ? processHistory.getReviewResult() : ""); + designMap.put("design.opinion", StringUtils.isNotEmpty(processHistory.getApprovalOpinion()) ? processHistory.getApprovalOpinion() : ""); + designMap.put("design.node", StringUtils.isNotEmpty(processHistory.getName()) ? processHistory.getName() : ""); + designMap.put("design.operator", StringUtils.isNotEmpty(processHistory.getAssignee()) ? processHistory.getAssignee() :""); + designMap.put("design.dateTime", StringUtils.isNotEmpty(createTime) ? createTime : ""); + dataList.add(designMap); + }); + } + }else if(tableIndex == 4){ + params.put("actiProcInstId",pId); + List processHistoryEOList = processHistoryEOService.queryList(params); + if(CollectionUtils.isNotEmpty(processHistoryEOList)){ + processHistoryEOList.forEach(processHistory -> { + String createTime = sdf.format(processHistory.getCreateTime()); + + Map verifyMap = new HashMap<>(); + verifyMap.put("verify.result", StringUtils.isNotEmpty(processHistory.getReviewResult()) ? processHistory.getReviewResult() : ""); + verifyMap.put("verify.opinion", StringUtils.isNotEmpty(processHistory.getApprovalOpinion()) ? processHistory.getApprovalOpinion() : ""); + verifyMap.put("verify.node", StringUtils.isNotEmpty(processHistory.getName()) ? processHistory.getName() : ""); + verifyMap.put("verify.operator", StringUtils.isNotEmpty(processHistory.getAssignee()) ? processHistory.getAssignee() :""); + verifyMap.put("verify.dateTime", StringUtils.isNotEmpty(createTime) ? createTime : ""); + dataList.add(verifyMap); + }); + } + } + + //构造循环列表的数据 + ClassFinder find = new ClassFinder(Tbl.class); + new TraversalUtil(wordMLPackage.getMainDocumentPart().getContent(), find); + Tbl table = (Tbl) find.results.get(tableIndex); + //第二行约定为模板 + Tr dynamicTr = (Tr) table.getContent().get(1); + //获取模板行的xml数据 + String dynamicTrXml = XmlUtils.marshaltoString(dynamicTr); + + for (Map mapList : dataList) { + Tr newTr = (Tr) XmlUtils.unmarshallFromTemplate(dynamicTrXml, mapList);//填充模板行数据 + table.getContent().add(newTr); + } + //删除模板行的占位行 + table.getContent().remove(1); + }catch (Exception ex){ + ex.printStackTrace(); + } + } + + public static WordprocessingMLPackage getTemplate(String name)throws Docx4JException,FileNotFoundException { + WordprocessingMLPackage template = WordprocessingMLPackage.load(new FileInputStream(new File(name))); + return template; + } } diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectLibraryBaseServiceImpl.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectLibraryBaseServiceImpl.java index e2c2b8bcd..9a42fb136 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectLibraryBaseServiceImpl.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectLibraryBaseServiceImpl.java @@ -527,10 +527,12 @@ public class ProjectLibraryBaseServiceImpl extends ServiceImpl data : datas) { List dutyTerritory = dictItemList.stream().filter(dict -> StringUtils.equals(dict.getItemValue(), data.get("dutyTerritory").toString())).collect(Collectors.toList()); - if(StringUtils.equals(cut,CutEnum.CN.getValue())){ - data.put("dutyTerritory",dutyTerritory.get(0).getItemText()); - }else if(StringUtils.equals(cut,CutEnum.EN.getValue())){ - data.put("dutyTerritory",dutyTerritory.get(0).getEnName()); + if(CollectionUtils.isNotEmpty(dutyTerritory)){ + if(StringUtils.equals(cut,CutEnum.CN.getValue())){ + data.put("dutyTerritory",dutyTerritory.get(0).getItemText()); + }else if(StringUtils.equals(cut,CutEnum.EN.getValue())){ + data.put("dutyTerritory",dutyTerritory.get(0).getEnName()); + } } } } diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/Docx4jUtils.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/Docx4jUtils.java new file mode 100644 index 000000000..6f58696cb --- /dev/null +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/Docx4jUtils.java @@ -0,0 +1,246 @@ +package com.jero.modules.project.util; + + +import org.docx4j.XmlUtils; +import org.docx4j.jaxb.Context; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; +import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; +import org.docx4j.wml.Document; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletResponse; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * 关于文件操作的工具类 + * + * @author kaizen + * @date 2018-10-23 17:21:36 + */ +public final class Docx4jUtils { + + private static final Logger logger = LoggerFactory.getLogger(Docx4jUtils.class); + + /** + * 替换变量并下载word文档 + * + * @param inputStream + * @param map + * @param response + * @param fileName + */ + public static void downloadDocUseDoc4j(InputStream inputStream, Map map, + HttpServletResponse response, String fileName) { + + try { + // 设置响应头 + fileName = URLEncoder.encode(fileName, "UTF-8"); + response.setContentType("application/octet-stream;charset=UTF-8"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".docx"); + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + + OutputStream outs = response.getOutputStream(); + Docx4jUtils.replaceDocUseDoc4j(inputStream,map,outs); + + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + } + + /** + * 替换变量并输出word文档 + * @param inputStream + * @param map + * @param outputStream + */ + public static void replaceDocUseDoc4j(InputStream inputStream, Map map, + OutputStream outputStream) { + try { + WordprocessingMLPackage doc = WordprocessingMLPackage.load(inputStream); + MainDocumentPart mainDocumentPart = doc.getMainDocumentPart(); + if (null != map && !map.isEmpty()) { + // 将${}里的内容结构层次替换为一层 + Docx4jUtils .cleanDocumentPart(mainDocumentPart); + // 替换文本内容 + mainDocumentPart.variableReplace((HashMap) map); + } + + // 输出word文件 + doc.save(outputStream); + outputStream.flush(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + } + + + /** + * cleanDocumentPart + * + * @param documentPart + */ + public static boolean cleanDocumentPart(MainDocumentPart documentPart) throws Exception { + if (documentPart == null) { + return false; + } + Document document = documentPart.getContents(); + String wmlTemplate = + XmlUtils.marshaltoString(document, true, false, Context.jc); + document = (Document) XmlUtils.unwrap(DocxVariableClearUtils.doCleanDocumentPart(wmlTemplate, Context.jc)); + documentPart.setContents(document); + return true; + } + + /** + * 清扫 docx4j 模板变量字符,通常以${variable}形式 + *

+ * XXX: 主要在上传模板时处理一下, 后续 + * + * @author liliang + * @since 2018-11-07 + */ + private static class DocxVariableClearUtils { + + + /** + * 去任意XML标签 + */ + private static final Pattern XML_PATTERN = Pattern.compile("<[^>]*>"); + + private DocxVariableClearUtils() { + } + + /** + * start符号 + */ + private static final char PREFIX = '$'; + + /** + * 中包含 + */ + private static final char LEFT_BRACE = '{'; + + /** + * 结尾 + */ + private static final char RIGHT_BRACE = '}'; + + /** + * 未开始 + */ + private static final int NONE_START = -1; + + /** + * 未开始 + */ + private static final int NONE_START_INDEX = -1; + + /** + * 开始 + */ + private static final int PREFIX_STATUS = 1; + + /** + * 左括号 + */ + private static final int LEFT_BRACE_STATUS = 2; + + /** + * 右括号 + */ + private static final int RIGHT_BRACE_STATUS = 3; + + + /** + * doCleanDocumentPart + * + * @param wmlTemplate + * @param jc + * @return + * @throws JAXBException + */ + private static Object doCleanDocumentPart(String wmlTemplate, JAXBContext jc) throws JAXBException { + // 进入变量块位置 + int curStatus = NONE_START; + // 开始位置 + int keyStartIndex = NONE_START_INDEX; + // 当前位置 + int curIndex = 0; + char[] textCharacters = wmlTemplate.toCharArray(); + StringBuilder documentBuilder = new StringBuilder(textCharacters.length); + documentBuilder.append(textCharacters); + // 新文档 + StringBuilder newDocumentBuilder = new StringBuilder(textCharacters.length); + // 最后一次写位置 + int lastWriteIndex = 0; + for (char c : textCharacters) { + switch (c) { + case PREFIX: + // TODO 不管其何状态直接修改指针,这也意味着变量名称里面不能有PREFIX + keyStartIndex = curIndex; + curStatus = PREFIX_STATUS; + break; + case LEFT_BRACE: + if (curStatus == PREFIX_STATUS) { + curStatus = LEFT_BRACE_STATUS; + } + break; + case RIGHT_BRACE: + if (curStatus == LEFT_BRACE_STATUS) { + // 接上之前的字符 + newDocumentBuilder.append(documentBuilder.substring(lastWriteIndex, keyStartIndex)); + // 结束位置 + int keyEndIndex = curIndex + 1; + // 替换 + String rawKey = documentBuilder.substring(keyStartIndex, keyEndIndex); + // 干掉多余标签 + String mappingKey = XML_PATTERN.matcher(rawKey).replaceAll(""); + if (!mappingKey.equals(rawKey)) { + char[] rawKeyChars = rawKey.toCharArray(); + // 保留原格式 + StringBuilder rawStringBuilder = new StringBuilder(rawKey.length()); + // 去掉变量引用字符 + for (char rawChar : rawKeyChars) { + if (rawChar == PREFIX || rawChar == LEFT_BRACE || rawChar == RIGHT_BRACE) { + continue; + } + rawStringBuilder.append(rawChar); + } + // FIXME 要求变量连在一起 + String variable = mappingKey.substring(2, mappingKey.length() - 1); + int variableStart = rawStringBuilder.indexOf(variable); + if (variableStart > 0) { + rawStringBuilder = rawStringBuilder.replace(variableStart, variableStart + variable.length(), mappingKey); + } + newDocumentBuilder.append(rawStringBuilder.toString()); + } else { + newDocumentBuilder.append(mappingKey); + } + lastWriteIndex = keyEndIndex; + + curStatus = NONE_START; + keyStartIndex = NONE_START_INDEX; + } + default: + break; + } + curIndex++; + } + // 余部 + if (lastWriteIndex < documentBuilder.length()) { + newDocumentBuilder.append(documentBuilder.substring(lastWriteIndex)); + } + return XmlUtils.unmarshalString(newDocumentBuilder.toString(), jc); + } + + } +} diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/WordUtil.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/WordUtil.java new file mode 100644 index 000000000..3872677ca --- /dev/null +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/WordUtil.java @@ -0,0 +1,315 @@ +package com.jero.modules.project.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import org.apache.commons.io.IOUtils; +import org.docx4j.Docx4J; +import org.docx4j.TraversalUtil; +import org.docx4j.XmlUtils; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.convert.out.HTMLSettings; +import org.docx4j.dml.wordprocessingDrawing.Inline; +import org.docx4j.finders.ClassFinder; +import org.docx4j.finders.RangeFinder; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; +import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; +import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; +import org.docx4j.wml.Body; +import org.docx4j.wml.CTBookmark; +import org.docx4j.wml.Document; +import org.docx4j.wml.Drawing; +import org.docx4j.wml.ObjectFactory; +import org.docx4j.wml.P; +import org.docx4j.wml.R; +import org.docx4j.wml.Tbl; +import org.docx4j.wml.Text; +import org.docx4j.wml.Tr; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.FileCopyUtils; + +public class WordUtil { + private static final Logger log = LoggerFactory.getLogger(WordUtil.class); + + public WordUtil() { + } + + public static void replaceVariable(String templatePath, Map map, String outPath) throws Exception { + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(templatePath)); + MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart(); + Docx4jUtils.cleanDocumentPart(documentPart); + documentPart.variableReplace((HashMap) map); + Docx4J.save(wordMLPackage, new File(outPath)); + } + + public static void replaceVariable(InputStream inputStream, Map map, OutputStream outputStream) throws Exception { + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(inputStream); + MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart(); + Docx4jUtils.cleanDocumentPart(documentPart); + documentPart.variableReplace((HashMap) map); + Docx4J.save(wordMLPackage, outputStream); + } + + public static void replaceVariable(WordprocessingMLPackage wordMLPackage, Map map) throws Exception { + MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart(); + Docx4jUtils.cleanDocumentPart(documentPart); + documentPart.variableReplace((HashMap) map); + } + + public static void replaceTable(String templatePath, int tableNum, int rowNum, List> dataList, String outPath) throws Exception { + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(templatePath)); + MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart(); + Docx4jUtils.cleanDocumentPart(mainDocumentPart); + ClassFinder find = new ClassFinder(Tbl.class); + new TraversalUtil(mainDocumentPart.getContent(), find); + Tbl table = (Tbl)find.results.get(tableNum - 1); + Tr dynamicTr = (Tr)table.getContent().get(rowNum - 1); + String dynamicTrXml = XmlUtils.marshaltoString(dynamicTr); + Iterator var11 = dataList.iterator(); + + while(var11.hasNext()) { + Map dataMap = (Map)var11.next(); + Tr newTr = (Tr)XmlUtils.unmarshallFromTemplate(dynamicTrXml, dataMap); + table.getContent().add(newTr); + } + + table.getContent().remove(rowNum - 1); + Docx4J.save(wordMLPackage, new File(outPath)); + } + + public static void replaceTable(InputStream inputStream, int tableNum, int rowNum, List> dataList, OutputStream outputStream) throws Exception { + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(inputStream); + MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart(); + Docx4jUtils.cleanDocumentPart(mainDocumentPart); + ClassFinder find = new ClassFinder(Tbl.class); + new TraversalUtil(mainDocumentPart.getContent(), find); + Tbl table = (Tbl)find.results.get(tableNum - 1); + Tr dynamicTr = (Tr)table.getContent().get(rowNum - 1); + String dynamicTrXml = XmlUtils.marshaltoString(dynamicTr); + Iterator var11 = dataList.iterator(); + + while(var11.hasNext()) { + Map dataMap = (Map)var11.next(); + Tr newTr = (Tr)XmlUtils.unmarshallFromTemplate(dynamicTrXml, dataMap); + table.getContent().add(newTr); + } + + table.getContent().remove(rowNum - 1); + Docx4J.save(wordMLPackage, outputStream); + } + + public static void replaceTable(WordprocessingMLPackage wordMLPackage, int tableNum, int rowNum, List> dataList) throws Exception { + MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart(); + Docx4jUtils.cleanDocumentPart(mainDocumentPart); + ClassFinder find = new ClassFinder(Tbl.class); + new TraversalUtil(mainDocumentPart.getContent(), find); + Tbl table = (Tbl)find.results.get(tableNum - 1); + Tr dynamicTr = (Tr)table.getContent().get(rowNum - 1); + String dynamicTrXml = XmlUtils.marshaltoString(dynamicTr); + Iterator var9 = dataList.iterator(); + + while(var9.hasNext()) { + Map dataMap = (Map)var9.next(); + Tr newTr = (Tr)XmlUtils.unmarshallFromTemplate(dynamicTrXml, dataMap); + table.getContent().add(newTr); + } + + table.getContent().remove(rowNum - 1); + } + + public static void replacePicture(WordprocessingMLPackage wordMLPackage, String bookmarkName, InputStream inputStream) throws Exception { + try { + MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart(); + Document wmlDoc = (Document)mainDocumentPart.getJaxbElement(); + Body body = wmlDoc.getBody(); + List paragraphs = body.getContent(); + RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange"); + new TraversalUtil(paragraphs, rt); + Iterator var8 = rt.getStarts().iterator(); + + while(var8.hasNext()) { + CTBookmark bm = (CTBookmark)var8.next(); + if (bm.getName().equals(bookmarkName)) { + byte[] bytes = IOUtils.toByteArray(inputStream); + BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes); + Inline inline = imagePart.createImageInline("", "", 0, 1, true); + P p = (P)((P)bm.getParent()); + ObjectFactory factory = new ObjectFactory(); + R run = factory.createR(); + Drawing drawing = factory.createDrawing(); + drawing.getAnchorOrInline().add(inline); + run.getContent().add(drawing); + p.getContent().add(run); + } + } + } catch (Exception var17) { + } + + } + + public static void replaceForTemplate(String templatePath, Map map, int tableNum, List> dataList, String outPath) throws Exception { + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(templatePath)); + MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart(); + Docx4jUtils.cleanDocumentPart(mainDocumentPart); + ClassFinder find = new ClassFinder(Tbl.class); + new TraversalUtil(mainDocumentPart.getContent(), find); + Tbl table = (Tbl)find.results.get(tableNum - 1); + Tr dynamicTr = (Tr)table.getContent().get(1); + String dynamicTrXml = XmlUtils.marshaltoString(dynamicTr); + Iterator var11 = dataList.iterator(); + + while(var11.hasNext()) { + Map dataMap = (Map)var11.next(); + Tr newTr = (Tr)XmlUtils.unmarshallFromTemplate(dynamicTrXml, dataMap); + table.getContent().add(newTr); + } + + table.getContent().remove(1); + wordMLPackage.getMainDocumentPart().variableReplace((HashMap) map); + Docx4J.save(wordMLPackage, new File(outPath)); + } + + public static void replaceForTemplate(InputStream inputStream, Map map, int tableNum, List> dataList, OutputStream outputStream) throws Exception { + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(inputStream); + MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart(); + Docx4jUtils.cleanDocumentPart(mainDocumentPart); + ClassFinder find = new ClassFinder(Tbl.class); + new TraversalUtil(mainDocumentPart.getContent(), find); + Tbl table = (Tbl)find.results.get(tableNum - 1); + Tr dynamicTr = (Tr)table.getContent().get(1); + String dynamicTrXml = XmlUtils.marshaltoString(dynamicTr); + Iterator var11 = dataList.iterator(); + + while(var11.hasNext()) { + Map dataMap = (Map)var11.next(); + Tr newTr = (Tr)XmlUtils.unmarshallFromTemplate(dynamicTrXml, dataMap); + table.getContent().add(newTr); + } + + table.getContent().remove(1); + wordMLPackage.getMainDocumentPart().variableReplace((HashMap) map); + Docx4J.save(wordMLPackage, outputStream); + } + + public static void toPDF(InputStream inputStream, OutputStream outputStream) throws Exception { + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(inputStream); + Mapper fontMapper = new IdentityPlusMapper(); + wordMLPackage.setFontMapper(fontMapper); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(wordMLPackage); + Docx4J.toFO(foSettings, outputStream, 1); + } + + public static void toPDF(WordprocessingMLPackage wordMLPackage, OutputStream outputStream) throws Exception { + Mapper fontMapper = new IdentityPlusMapper(); + wordMLPackage.setFontMapper(fontMapper); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(wordMLPackage); + Docx4J.toFO(foSettings, outputStream, 1); + } + + public static void toHTML(InputStream inputStream, OutputStream outputStream) throws Exception { + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(inputStream); + HTMLSettings htmlSettings = Docx4J.createHTMLSettings(); + String folder = "optimages"; + htmlSettings.setImageDirPath(folder); + htmlSettings.setImageTargetUri("images"); + htmlSettings.setWmlPackage(wordMLPackage); + Docx4J.toHTML(htmlSettings, outputStream, 0); + } + + public static void toHTML(WordprocessingMLPackage wordMLPackage, OutputStream outputStream) throws Exception { + HTMLSettings htmlSettings = Docx4J.createHTMLSettings(); + String folder = "optimages"; + htmlSettings.setImageDirPath(folder); + htmlSettings.setImageTargetUri("images"); + htmlSettings.setWmlPackage(wordMLPackage); + Docx4J.toHTML(htmlSettings, outputStream, 0); + } + + private static void addImageInlineToPackage(WordprocessingMLPackage wordMLPackage, byte[] bytes) throws Exception { + BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes); + int docPrId = 1; + int cNvPrId = 2; + Inline inline = imagePart.createImageInline("Filename hint", "Alternative text", docPrId, cNvPrId, false); + ObjectFactory factory = new ObjectFactory(); + P paragraph = factory.createP(); + R run = factory.createR(); + paragraph.getContent().add(run); + Drawing drawing = factory.createDrawing(); + run.getContent().add(drawing); + drawing.getAnchorOrInline().add(inline); + wordMLPackage.getMainDocumentPart().addObject(paragraph); + } + + private static void addImageInlineAndTextToPackage(WordprocessingMLPackage wordMLPackage, byte[] bytes, String text) throws Exception { + BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes); + int docPrId = 1; + int cNvPrId = 2; + Inline inline = imagePart.createImageInline("Filename hint", "Alternative text", docPrId, cNvPrId, false); + ObjectFactory factory = new ObjectFactory(); + P paragraph = factory.createP(); + R run = factory.createR(); + paragraph.getContent().add(run); + if (text != null) { + Text txt = factory.createText(); + txt.setValue(text); + txt.setSpace("preserve"); + run.getContent().add(txt); + } + + Drawing drawing = factory.createDrawing(); + run.getContent().add(drawing); + drawing.getAnchorOrInline().add(inline); + wordMLPackage.getMainDocumentPart().addObject(paragraph); + } + + public static void main(String[] args) throws Exception { + File file = new File("d:" + File.separator + "opt" + File.separator + "template" + File.separator + "请假条_template.docx"); + InputStream is = new FileInputStream(file); + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(is); + File png = new File("d:" + File.separator + "opt" + File.separator + "template" + File.separator + "badge.png"); + byte[] bytes = FileCopyUtils.copyToByteArray(new FileInputStream(png)); + addImageInlineToPackage(wordMLPackage, bytes); + addImageInlineAndTextToPackage(wordMLPackage, bytes, "这是图3,name.png,看图片的嵌入方式"); + wordMLPackage.save(new File("d:/opt/测试" + System.currentTimeMillis() + ".docx")); + } +} +