6c
10 天以前 cfd0903dc0cfc7ffd39c2caa101f31a50441d39c
src/main/java/com/product/print/service/PrintRealizeService.java
@@ -10,10 +10,11 @@
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.TextRenderData;
import com.deepoove.poi.data.style.Style;
import com.deepoove.poi.render.RenderContext;
import com.google.common.collect.Lists;
import com.product.common.lang.StringUtils;
import com.product.core.cache.DataPoolCacheImpl;
import com.product.core.config.Global;
import com.product.core.entity.DataEntity;
import com.product.core.entity.DataTableEntity;
import com.product.core.entity.FieldSetEntity;
import com.product.core.exception.BaseException;
@@ -30,17 +31,15 @@
import com.product.tool.flow.service.FlowDetailService;
import com.product.util.BaseUtil;
import com.product.util.SystemParamReplace;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.multipdf.PDFMergerUtility;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;
@@ -121,17 +120,32 @@
   /**
    * 打印传输pdf流到前端
    *
    * @param fse          打印数据
    * @param fseOrDte          打印数据
    * @param response     响应
    * @param isConvertPdf 是否转换为pdf
    * @throws BaseException
    */
   @Override
   public void print(FieldSetEntity fse, HttpServletResponse response, boolean isConvertPdf) throws BaseException {
   public void print(DataEntity fseOrDte, HttpServletResponse response, boolean isConvertPdf) throws BaseException {
        FieldSetEntity fse;
        DataTableEntity dte;
      //打印配置
      FieldSetEntity printConfig = getPrintConfig(fse.getString("~" + CmnConst.PRINT_TEMP + "~"));
        FieldSetEntity printConfig;
        if (fseOrDte.isFieldsetEntity()) {
            fse = (FieldSetEntity) fseOrDte;
            printConfig = getPrintConfig(getPrintTemplateField(fse));
        } else if (fseOrDte.isDataTableEntity()) {
            dte = (DataTableEntity) fseOrDte;
            fse = dte.getFieldSetEntity(0);
            printConfig = getPrintConfig(getPrintTemplateField(fse));
        } else {
            throw new BaseException(CmnCode.GET_BEAN_FAIL);
        }
      //获取到替换后的文件路径 (pdf文件或者word文件)
      String tempPdfFilePath = replaceTemplateFileOut(printConfig, fse, isConvertPdf);
      String tempPdfFilePath = replaceTemplateFileOut(printConfig, fseOrDte, isConvertPdf);
        if (StringUtils.isEmpty(tempPdfFilePath)) {
            throw new BaseException(CmnCode.DEALT_FILE_PATH_IS_EMPTY);
        }
      //获取文件名
      String fileName = BaseUtil.ifNull(printConfig.getString(CmnConst.PRINT_FILE_NAME), printConfig.getString(CmnConst.PRINT_NAME));
      if (isConvertPdf) {
@@ -146,10 +160,26 @@
      // 设置自定义头Content-Disposition
      response.setHeader("Content-Disposition", "attachment;filename=" + URLEncodeUtil.encode(fileName));
      try (
            OutputStream out = response.getOutputStream();
      ) {
      try (OutputStream out = response.getOutputStream();) {
            if (tempPdfFilePath.contains(",")) {
                // 更高效的方式:直接从文件合并到输出流
                PDFMergerUtility merger = new PDFMergerUtility();
                merger.setDestinationStream(response.getOutputStream());
                String[] tempPdfFilePathArr = tempPdfFilePath.split(",");
                for (int i = 0; i < tempPdfFilePathArr.length; i++) {
                    String singleTempPdfFilePath = tempPdfFilePathArr[i];
                    File file = new File(singleTempPdfFilePath);
                    if (file.exists()) {
                        merger.addSource(file); // 直接添加文件源
                    }
                }
                // 执行合并
                merger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
            } else {
         FileUtil.writeToStream(new File(tempPdfFilePath), out);
            }
      } catch (Exception e) {
         e.printStackTrace();
         throw new BaseException(CmnCode.PRINT_CONTENT_FAIL, e);
@@ -159,7 +189,22 @@
         System.out.println(absolutePath);
         file.delete();
      }
   }
    /**
     * 获取打印模板字段
     * @param fse
     * @return
     */
    private String getPrintTemplateField(FieldSetEntity fse) {
        if (FieldSetEntity.isEmpty(fse)) {
            return null;
        }
        String printTemplateField = fse.getString("~" + CmnConst.PRINT_TEMP + "~");
        if (StringUtils.isEmpty(printTemplateField)) {
            printTemplateField = fse.getString("~print_template~");
        }
        return printTemplateField;
   }
   /**
@@ -183,12 +228,30 @@
    * 替换模板文件并输出
    *
    * @param printConf    打印配置
    * @param fse          替换数据
    * @param fseOrDte          替换数据
    * @param isConvertPdf 是否转换为pdf
    * @return 替换后的文件路径
    * @throws BaseException 异常
    */
   private String replaceTemplateFileOut(FieldSetEntity printConf, FieldSetEntity fse, boolean isConvertPdf) throws BaseException {
   private String replaceTemplateFileOut(FieldSetEntity printConf, DataEntity fseOrDte, boolean isConvertPdf) throws BaseException {
        FieldSetEntity fse = null;
        DataTableEntity dte = null;
        if (fseOrDte.isFieldsetEntity()) {
            fse = (FieldSetEntity) fseOrDte;
        } else if (fseOrDte.isDataTableEntity()) {
            dte = (DataTableEntity) fseOrDte;
        } else {
            throw new BaseException(CmnCode.GET_BEAN_FAIL);
        }
        if (fse != null) {
            dte = new DataTableEntity();
            dte.addFieldSetEntity(fse);
        }
        List<String> localTempPathList = Lists.newArrayList();
        if (!DataTableEntity.isEmpty(dte)) {
            for (int m = 0; m < dte.getRows(); m++) {
                fse = dte.getFieldSetEntity(m);
      Object[] fields = fse.getFields();
      for (int i = 0; i < fields.length; i++) {
@@ -244,14 +307,18 @@
            if (wordTemp.exists()) {
               wordTemp.delete();
            }
            return localTempPathPdf;
                        localTempPathList.add(localTempPathPdf);
         } catch (Exception e) {
            throw new BaseException(CmnCode.CONVERT_PDF_ERROR, e);
         } finally {
            FileUtil.del(localTempPathWord);
         }
                } else {
                    localTempPathList.add(localTempPathWord);
      }
      return localTempPathWord;
            }
        }
      return BaseUtil.collection2String(localTempPathList);
   }
   /**
@@ -274,18 +341,6 @@
      Map<String, DataTableEntity> subDataMap = dataFse.getSubData();
      ConfigureBuilder config = Configure.builder();
      config.addPlugin('@', new FlowOpinionRenderPolicy(flowOpinion));
      config.addPlugin('$', new com.deepoove.poi.policy.DynamicTableRenderPolicy() {
         @Override
         public void doRender(RenderContext<Object> context) throws Exception {
            return;
         }
         @Override
         public void render(XWPFTable table, Object data) throws Exception {
            return;
         }
      });
      config.addPlugin('&', new CustomPictureRenderPolicy());
      config.buildGrammerRegex("(#)?([\\w\\u4e00-\\u9fa5]+)(\\.?[\\w\\u4e00-\\u9fa5\\|]*)*(#)?");
      TableEmptyHandler tableEmptyHandler = new TableEmptyHandler();