许鹏程
2024-07-16 28640fa008701e22fe1d1c54c31690d150914d4b
src/main/java/com/product/file/service/MergeDoc.java
@@ -1,5 +1,8 @@
package com.product.file.service;
import cn.hutool.core.io.FileUtil;
import com.product.file.util.AsposeUtil;
import com.product.file.util.FileUtils;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.tomcat.util.http.fileupload.IOUtils;
@@ -15,96 +18,56 @@
 */
public class MergeDoc {
    /**
     * 合并docx文件
     *
     * @param srcDocxs 需要合并的目标docx文件
     * @param response 合并后的docx输出文件
     */
    public static File mergeDoc(List<File> srcDocxs, String tempFilePath) {
        OutputStream dest = null;
        List<OPCPackage> opcpList = new ArrayList<>();
        int length = null == srcDocxs ? 0 : srcDocxs.size();
        /**
         * 循环获取每个docx文件的OPCPackage对象
         */
        for (int i = 0; i < length; i++) {
            File doc = srcDocxs.get(i);
            OPCPackage srcPackage = null;
            try {
                srcPackage = OPCPackage.open(doc);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (null != srcPackage) {
                opcpList.add(srcPackage);
            }
        }
        int opcpSize = opcpList.size();
        //获取的OPCPackage对象大于0时,执行合并操作
        if (opcpSize > 0) {
            try {
                dest = new FileOutputStream(tempFilePath);
                XWPFDocument src1Document = new XWPFDocument(opcpList.get(0));
                CTBody src1Body = src1Document.getDocument().getBody();
                //OPCPackage大于1的部分执行合并操作
                if (opcpSize > 1) {
                    for (int i = 1; i < opcpSize; i++) {
                        OPCPackage src2Package = opcpList.get(i);
                        XWPFDocument src2Document = new XWPFDocument(src2Package);
                        CTBody src2Body = src2Document.getDocument().getBody();
                        appendBody(src1Body, src2Body);
                    }
                }
                //将合并的文档写入目标文件中
                src1Document.write(dest);
                return new File(tempFilePath);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭流
                IOUtils.closeQuietly(dest);
            }
        }
        return null;
    }
   /**
    * 合并docx文件
    *
    * @param srcDocxs 需要合并的目标docx文件
    * @param response 合并后的docx输出文件
    */
   public static File mergeDoc(List<File> srcDocxs, String tempFilePath) {
      if (srcDocxs.size() > 1) {
         File file = srcDocxs.get(0);
         for (int i = 1; i < srcDocxs.size(); i++) {
            file = AsposeUtil.mergeWord(file, srcDocxs.get(i));
         }
         FileUtil.copyFile(file, new File(tempFilePath));
         FileUtil.del(file);
      }
      return null;
   }
    /**
     * 合并文档内容
     *
     * @param src    目标文档
     * @param append 要合并的文档
     * @throws Exception
     */
    private static void appendBody(CTBody src, CTBody append) throws Exception {
        XmlOptions optionsOuter = new XmlOptions();
        optionsOuter.setSaveOuter();
        String appendString = append.xmlText(optionsOuter);
        //替换word中得空行、根据自己需求来选择需不需要
        //word文档其实是由xml文件合成得,一下替换得是作者对应得xml文件中得空行标签
   /**
    * 合并文档内容
    *
    * @param src    目标文档
    * @param append 要合并的文档
    * @throws Exception
    */
   private static void appendBody(CTBody src, CTBody append) throws Exception {
      XmlOptions optionsOuter = new XmlOptions();
      optionsOuter.setSaveOuter();
      String appendString = append.xmlText(optionsOuter);
      //替换word中得空行、根据自己需求来选择需不需要
      //word文档其实是由xml文件合成得,一下替换得是作者对应得xml文件中得空行标签
//        appendString = appendString.replaceAll("<w:p><w:pPr><w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:ascii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"24\\\"/></w:rPr></w:pPr></w:p>","");
//        appendString = appendString.replaceAll("<w:p><w:pPr xsi:nil=\\\"true\\\" xmlns:xsi=\\\"xsi\\\"/></w:p>","");
//        appendString = appendString.replaceAll("<w:p><w:pPr><w:ind w:firstLineChars=\\\"200\\\" w:firstLine=\\\"600\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:ascii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"30\\\"/><w:szCs w:val=\\\"30\\\"/></w:rPr></w:pPr></w:p>","");
//        appendString = appendString.replaceAll("<w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/>","");;
        String srcString = src.xmlText();
      String srcString = src.xmlText();
//        srcString = srcString.replaceAll("<w:p><w:pPr><w:ind w:firstLineChars=\\\"200\\\" w:firstLine=\\\"600\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:ascii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"30\\\"/><w:szCs w:val=\\\"30\\\"/></w:rPr></w:pPr></w:p>","");
//        srcString = srcString.replaceAll("<w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/>","");
//        srcString = srcString.replaceAll("<w:p><w:pPr><w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:ascii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"24\\\"/></w:rPr></w:pPr></w:p>","");
//        srcString = srcString.replaceAll("<w:p><w:pPr xsi:nil=\\\"true\\\" xmlns:xsi=\\\"xsi\\\"/></w:p>","");
        String prefix = srcString.substring(0, srcString.indexOf(">") + 1);
        String mainPart = srcString.substring(srcString.indexOf(">") + 1,
                srcString.lastIndexOf("<"));
        String sufix = srcString.substring(srcString.lastIndexOf("<"));
        String addPart = appendString.substring(appendString.indexOf(">") + 1,
                appendString.lastIndexOf("<"));
        CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart
                + sufix);
        src.set(makeBody);
    }
      String prefix = srcString.substring(0, srcString.indexOf(">") + 1);
      String mainPart = srcString.substring(srcString.indexOf(">") + 1,
            srcString.lastIndexOf("<"));
      String sufix = srcString.substring(srcString.lastIndexOf("<"));
      String addPart = appendString.substring(appendString.indexOf(">") + 1,
            appendString.lastIndexOf("<"));
      CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart
            + sufix);
      src.set(makeBody);
   }
}