Jelajahi Sumber

模板修改

aQiu6 3 bulan lalu
induk
melakukan
8c1fac3608

TEMPAT SAMPAH
jijinhui.docx


TEMPAT SAMPAH
jijinhui1.docx


+ 101 - 4
pom.xml

@@ -20,6 +20,73 @@
     </properties>
 
     <dependencies>
+        <!-- https://mvnrepository.com/artifact/org.docx4j/docx4j-JAXB-ReferenceImpl -->
+        <dependency>
+            <groupId>org.docx4j</groupId>
+            <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
+            <version>11.5.2</version>
+        </dependency>
+
+            <!-- JAXB Reference Implementation -->
+            <dependency>
+                <groupId>org.glassfish.jaxb</groupId>
+                <artifactId>jaxb-runtime</artifactId>
+                <version>4.0.5</version>
+            </dependency>
+        <!-- docx4j core -->
+        <dependency>
+            <groupId>org.docx4j</groupId>
+            <artifactId>docx4j-JAXB-Internal</artifactId>
+            <version>8.3.14</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-compress</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- docx4j export to FO -->
+        <dependency>
+            <groupId>org.docx4j</groupId>
+            <artifactId>docx4j-export-fo</artifactId>
+            <version>11.5.2</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+            <version>2.3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-impl</artifactId>
+            <version>2.3.3</version>
+        </dependency>
+
+        <!-- JAXB 实现(适用于 Java 8+) -->
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-core</artifactId>
+            <version>4.0.5</version>
+        </dependency>
+        <!-- JAXB API -->
+        <dependency>
+            <groupId>jakarta.xml.bind</groupId>
+            <artifactId>jakarta.xml.bind-api</artifactId>
+            <version>4.0.2</version>
+        </dependency>
+
+        <!-- JAXB Runtime -->
+        <dependency>
+            <groupId>jakarta.activation</groupId>
+            <artifactId>jakarta.activation-api</artifactId>
+            <version>2.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.xml.ws</groupId>
+            <artifactId>jaxws-rt</artifactId>
+            <version>2.3.0</version>
+        </dependency>
+
         <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
         <dependency>
             <groupId>org.freemarker</groupId>
@@ -34,19 +101,31 @@
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi</artifactId>
-            <version>5.2.3</version>
+            <version>5.4.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-compress</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <!-- poi-scratchpad for PDF conversion -->
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-scratchpad</artifactId>
-            <version>5.2.3</version>
+            <version>5.4.0</version>
         </dependency>
 
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
-            <version>5.2.3</version>
+            <version>5.4.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-compress</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <!-- 图像处理支持 -->
         <dependency>
@@ -224,6 +303,13 @@
             <artifactId>validation-api</artifactId>
             <version>2.0.1.Final</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>1.27.1</version>
+        </dependency>
+
 
         <dependency>
             <groupId>commons-lang</groupId>
@@ -252,7 +338,18 @@
                         </exclude>
                     </excludes>
                 </configuration>
-            </plugin>
+            </plugin><plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-assembly-plugin</artifactId>
+            <version>3.6.0</version>
+            <executions>
+                <execution>
+                    <goals>
+                        <goal>single</goal>
+                    </goals>
+                </execution>
+            </executions>
+        </plugin>
         </plugins>
     </build>
 </project>

+ 45 - 4
src/main/java/org/example/mybatisplus/Controller/IndexController.java

@@ -5,10 +5,12 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 
 import org.example.mybatisplus.model.auto.CmsEnterpriseRiskInfoCheckBO;
-import org.example.mybatisplus.model.auto.CmsEnterpriseRiskInfoCheckItem;
 import org.example.mybatisplus.model.auto.CmsEnterpriseRiskInfoDeclaration;
 import org.example.mybatisplus.model.auto.CmsEnterpriseRiskQxbInfoBO;
+import org.example.mybatisplus.module.AuditResult;
 import org.example.mybatisplus.module.BasicInfo;
+import org.example.mybatisplus.module.ServiceProviderAuditReport;
+import org.example.mybatisplus.module.vo.ServiceProviderInfo;
 import org.example.mybatisplus.tools.WordPoiExporter;
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.core.io.Resource;
@@ -26,7 +28,41 @@ import java.util.Map;
 @ApiOperation("控制类")
 @RestController
 public class IndexController {
+    public static void main(String[] args) {
+        String wordFilePath = System.getProperty("user.dir")+File.separator+ "jijinhui.docx";
+        String wordExportpath = System.getProperty("user.dir")+File.separator+ "jijinhui1.docx";
+        String pdfFilePath =System.getProperty("user.dir")+File.separator+  "download.pdf";
+
+        // todo:
+        ServiceProviderInfo serviceProviderInfo=new ServiceProviderInfo();
+        serviceProviderInfo.setName("海潮基金会");
+        serviceProviderInfo.setReportDate("2025-03-11");
+        AuditResult auditResult=new AuditResult();
+        auditResult.setAuditDate("2025-03-11");
+        auditResult.setOpinion("test");
+        auditResult.setMocaRating("test");
+        auditResult.setDonationIncomeScale("test");
+        auditResult.setManagementExpense("test");
+        auditResult.setOperationYears("2025");
+        auditResult.setPublicExpenseGrowth("test");
+        BasicInfo basicInfo = new BasicInfo();
+        // ...
+
+        // 最后把所有片段合成一个完整报告
 
+        ServiceProviderAuditReport report=new ServiceProviderAuditReport();
+        report.setServiceProviderInfo(serviceProviderInfo);
+        report.setAuditResult(auditResult);
+        report.setBasicInfo(basicInfo);
+        try {
+            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(report));
+            // 生成Word文档
+            WordPoiExporter.init(wordFilePath,wordExportpath,jsonObject);
+            // 将Word文档转换为PDF
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
     //只要接口中,返回值存在实体类,就会被扫描到swagger中
     @GetMapping("/export")
     public ResponseEntity<Resource> export(@ApiParam("param")String param /* todo: 参数:服务商ID,校验ID,报告类型*/){
@@ -36,6 +72,9 @@ public class IndexController {
         String pdfFilePath =System.getProperty("user.dir")+File.separator+  "download.pdf";
 
         // todo:
+        ServiceProviderInfo serviceProviderInfo=new ServiceProviderInfo();
+        serviceProviderInfo.setName("海潮基金会");
+        serviceProviderInfo.setReportDate("2025-03-24");
         // 1. getWordTemplate for BasicInfo
         // 2. retrieve data
         //    2.1 get CmsEnterpriseRiskQxbInfoBO
@@ -54,13 +93,15 @@ public class IndexController {
 
         // 最后把所有片段合成一个完整报告
 
-
+        ServiceProviderAuditReport report=new ServiceProviderAuditReport();
+        report.setServiceProviderInfo(serviceProviderInfo);
+        report.setBasicInfo(basicInfo);
         try {
-            JSONObject jsonObject = new JSONObject();
+            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(report));
             // 生成Word文档
             WordPoiExporter.init(wordFilePath,wordExportpath,jsonObject);
             // 将Word文档转换为PDF
-//            WordPoiExporter.convertWordToPdf(wordExportpath, pdfFilePath);
+           WordPoiExporter.convert(wordExportpath, pdfFilePath);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 5 - 1
src/main/java/org/example/mybatisplus/model/auto/CmsEnterpriseRiskQxbInfoBO.java

@@ -1,5 +1,7 @@
 package org.example.mybatisplus.model.auto;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
 
 import org.example.mybatisplus.model.auto.EntRiskQxbEmployeesInfo.ItemsInner;
@@ -90,7 +92,9 @@ public class CmsEnterpriseRiskQxbInfoBO {
         info.setNumberOfDirectors(employeesInfo.getItems()
             .stream().filter(item -> item.getTitle().contains("理事")).count());
         info.setFoundationLocation(baseInfo.getAddress());
-        info.setSuperiorAuthority(new SuperiorAuthority(baseInfo.getBelongOrg(), "-"));
+        List list=new ArrayList<>();
+        list.add(new SuperiorAuthority(baseInfo.getBelongOrg(), "-"));
+        info.setSuperiorAuthority(list);
         info.setRenzcode(baseInfo.getRegNo());
         info.setValidate(String.format("%s至%s", baseInfo.getTermStart(), baseInfo.getTermEnd()));
         return info;

+ 8 - 8
src/main/java/org/example/mybatisplus/module/AuditResult.java

@@ -15,20 +15,20 @@ public class AuditResult {
     private String riskAlert;   // ${风险概述:风险提示}
     private String suggestion;  // ${风险概述:建议}
     // 基础信息评分
-    private Double donationIncomeScale;  // ${得分情况:基础信息:基金会捐赠收入规模}
+    private String donationIncomeScale;  // ${得分情况:基础信息:基金会捐赠收入规模}
     private String netAssetRating;       // ${得分情况:基础信息:净资产评级}
-    private Integer operationYears;      // ${得分情况:基础信息:运营年限}
+    private String operationYears;      // ${得分情况:基础信息:运营年限}
     private String mocaRating;           // ${得分情况:基础信息:MOCA评级}
 
     // 公共记录评分
-    private Double publicRecordScore;    // ${得分情况:公共记录:公共记录评分}
+    private String publicRecordScore;    // ${得分情况:公共记录:公共记录评分}
 
     // 财务信息评分
-    private Double publicFundExpense;    // ${得分情况:财务信息:运营能力-私募基金-公益支出}
-    private Double managementExpense;    // ${得分情况:财务信息:运营能力-私募基金-管理费用}
-    private Double totalIncomeGrowth;    // ${得分情况:财务信息:发展能力-总收入增长率}
-    private Double publicExpenseGrowth;  // ${得分情况:财务信息:发展能力-公益支出增长率}
+    private String publicFundExpense;    // ${得分情况:财务信息:运营能力-私募基金-公益支出}
+    private String managementExpense;    // ${得分情况:财务信息:运营能力-私募基金-管理费用}
+    private String totalIncomeGrowth;    // ${得分情况:财务信息:发展能力-总收入增长率}
+    private String publicExpenseGrowth;  // ${得分情况:财务信息:发展能力-公益支出增长率}
 
     // 项目情况评分
-    private Double projectScore;         // ${得分情况:项目情况:项目情况评分}
+    private String projectScore;         // ${得分情况:项目情况:项目情况评分}
 }

+ 1 - 1
src/main/java/org/example/mybatisplus/module/BasicInfo.java

@@ -47,7 +47,7 @@ public class BasicInfo {
     private String needOutsourcingService;     // 是否通常需要外包服务
     private String projectServiceVendors; // 项目服务执行方名单
 
-    private SuperiorAuthority superiorAuthority; // 直属上级机关(2.2)
+    private List<SuperiorAuthority> superiorAuthority; // 直属上级机关(2.2)
     private Attachment relatedEntitiesImage;            // ${image:实体关联情况}(2.3)
 
     private String authorityName;  // ${tableRow:直属机关}

+ 54 - 9
src/main/java/org/example/mybatisplus/tools/WordPoiExporter.java

@@ -4,21 +4,31 @@ import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import org.apache.commons.lang.StringUtils;
+import org.apache.pdfbox.pdmodel.font.FontMapper;
 import org.apache.poi.xwpf.usermodel.*;
+import org.docx4j.Docx4J;
+import org.docx4j.convert.out.FOSettings;
+import org.docx4j.fonts.IdentityPlusMapper;
+import org.docx4j.fonts.Mapper;
+import org.docx4j.fonts.PhysicalFont;
+import org.docx4j.fonts.PhysicalFonts;
+import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 
 import java.io.*;
+import java.net.URI;
+import java.net.URL;
 import java.util.List;
 import java.util.Map;
 
 public class WordPoiExporter {
 
     public static void init(String source,String path,JSONObject data) throws IOException {
-        InputStream stream = WordPoiExporter.class.getResourceAsStream("/foundation_report_template.json");
-        String json = inputStreamToString(stream);
-        JSONObject jsonObject = JSON.parseObject(json);
+//        InputStream stream = WordPoiExporter.class.getResourceAsStream("/foundation_report_template.json");
+//        String json = inputStreamToString(stream);
+//        JSONObject jsonObject = JSON.parseObject(json);
 
         try {
-            XWPFDocument doc = processTemplate(source, jsonObject);
+            XWPFDocument doc = processTemplate(source, data);
             FileOutputStream out = new FileOutputStream(path);
 
             doc.write(out);
@@ -56,15 +66,20 @@ public class WordPoiExporter {
                 if(keys.length==2){
                     String placeholder = "${" +key + "}";
                     if (runText.contains(placeholder)) {
+                        System.out.println(placeholder);
+                        String value=data.getString(keys[1]);
+                        if(value==null)value="";
                         // 直接修改Run的文本(保留原格式)
-                        run.setText(runText.replace(placeholder, data.getString(keys[1])), 0);
+                        run.setText(runText.replace(placeholder, value), 0);
                     }
                 }else if(keys.length==3){
                     JSONObject data1=data.getJSONObject(keys[1]);
                     String placeholder = "${" +key + "}";
                     if (runText.contains(placeholder)) {
                         // 直接修改Run的文本(保留原格式)
-                        run.setText(runText.replace(placeholder, data1.getString(keys[2])), 0);
+                        String value=data1.getString(keys[2]);
+                        if(value==null)value="";
+                        run.setText(runText.replace(placeholder, value), 0);
                     }
                 }
             }
@@ -89,11 +104,16 @@ public class WordPoiExporter {
                     for (XWPFParagraph p : cell.getParagraphs()) {
                         String text = p.getText();
                         if (text.contains("${tableRow:")) {
-                            String placeholder = text.substring(11, text.length()-1);
+                            String key=text.substring(text.indexOf("${")+2,text.indexOf("}"));
+                            String[] keys=key.split(":");
                             // 找到表格占位行
                             // 获取原行(这里选择第一行作为示例)
-                            JSONArray tableData = jsonObject.getJSONArray(placeholder);
-                            addTableRows(tbl, tableData,row);
+                            JSONObject obj = jsonObject.getJSONObject(keys[1]);
+                            System.out.println(JSONObject.toJSONString(keys));
+                            JSONArray tableData = obj.getJSONArray(keys[2]);
+                            if (tableData != null && tableData.size() > 0) {
+                                addTableRows(tbl, tableData, row);
+                            }
                             tbl.removeRow(tbl.getRows().indexOf(row));
                         } else {
                             replaceTextWithFormat(p, jsonObject);
@@ -187,7 +207,32 @@ public class WordPoiExporter {
 //            throw new RuntimeException(e);
 //        }
     }
+    public static void convert(String inputPath, String outputPath) {
+        try {
+            // 创建字体映射器
+            Mapper fontMapper = new IdentityPlusMapper();
+
+//            // 字体文件的 URI,可以是本地文件的 URI 或者网络文件的 URI
+//            String fontFilePath = "C:\\Windows\\Fonts\\微软雅黑.ttf"; // 替换为实际的字体文件 URI
+//            URI fontUri = new URI(fontFilePath);
+//
+//            PhysicalFonts.addPhysicalFont(fontUri);
+//            URI fontUri1 = new URI("C:\\Windows\\Fonts\\思源黑体.ttf");
+//
+//            PhysicalFonts.addPhysicalFont(fontUri1);
+
+            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(inputPath));
+            FOSettings foSettings = Docx4J.createFOSettings();
+            foSettings.setWmlPackage(wordMLPackage);
 
+            try (FileOutputStream fos = new FileOutputStream(outputPath)) {
+                Docx4J.toPDF(wordMLPackage, fos);
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
     private static void saveAsPdf(XWPFDocument doc, String pdfPath) throws Exception {
         // 创建PDF文档
         /*try (PDDocument pdfDoc = new PDDocument()) {

+ 0 - 13
src/test/java/org/example/mybatisplus/MybatisplusApplicationTests.java

@@ -1,13 +0,0 @@
-package org.example.mybatisplus;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class MybatisplusApplicationTests {
-
-    @Test
-    void contextLoads() {
-    }
-
-}