许鹏程
2024-07-17 a7e5e29bd9771b9cc65cfe09d213c470bbe4166b
src/main/java/com/product/file/util/FileUtil.java
@@ -33,6 +33,43 @@
   private FileUtil() {
   }
   public static String checkDocType(File file) {
      try (FileInputStream fis = new FileInputStream(file)) {
         byte[] bytes = new byte[8];
         fis.read(bytes, 0, 8);
         String hex = bytesToHex(bytes);
         if (hex.contains("504B0304") && (file.getName().endsWith(".doc") || file.getName().endsWith(".docx"))) {
            return "docx";
         } else if (hex.contains("D0CF11E0") && (file.getName().endsWith(".doc") || file.getName().endsWith(".docx"))) {
            //因为doc文件的头部也是D0CF11E0,所以需要判断文件后缀
            return "doc";
         }
         //增加xls 和 xlsx的判断
         else if (hex.contains("504B0304") && (file.getName().endsWith(".xls") || file.getName().endsWith(".xlsx"))) {
            return "xlsx";
         } else if (hex.contains("D0CF11E0") && (file.getName().endsWith(".xls") || file.getName().endsWith(".xlsx"))) {
            //因为xls文件的头部也是D0CF11E0,所以需要判断文件后缀
            return "xls";
         } else {
            return "unknown";
         }
      } catch (
            IOException e) {
         e.printStackTrace();
         return "unknown";
      }
   }
   private static String bytesToHex(byte[] bytes) {
      StringBuilder hex = new StringBuilder();
      for (byte b : bytes) {
         hex.append(String.format("%02X", b));
      }
      return hex.toString();
   }
   /**
    * 合并word文档
    *
@@ -41,16 +78,13 @@
    * @return
    */
   public static File mergeFile(File source, File target) throws Exception {
      //判断文件是否为 docx或doc格式
      if (!source.getName().endsWith(".docx") && !source.getName().endsWith(".doc")) {
         throw new BaseException(FileCode.ADD_FILE_NOT_ALLOWED);
      }
      //如果是doc格式则转换为docx格式
      if (source.getName().endsWith(".doc")) {
      if ("doc".equals(FileUtil.checkDocType(source))) {
         source = toDocx(source);
      }
      if (target.getName().endsWith(".doc")) {
      boolean delTarget = false;
      if ("doc".equals(FileUtil.checkDocType(target))) {
         target = toDocx(target);
         delTarget = true;
      }
      XWPFTemplate template = XWPFTemplate.compile(source);
      NiceXWPFDocument xwpfDocument = template.getXWPFDocument();
@@ -65,6 +99,9 @@
         } catch (IOException e) {
            throw e;
         } finally {
            if (delTarget) {
               target.delete();
            }
            newDoc.close();
            sub.close();
         }
@@ -83,8 +120,9 @@
      File docxFile = new File(file.getParent() + File.separator + docxName);
      String tempDir = Global.getSystemConfig("temp.dir", "./attachment/temp");
      File tempFile = new File(tempDir + File.separator + docxName);
      try {
         Document document = new Document(new FileInputStream(file));
      try (FileInputStream is = new FileInputStream(file);) {
         Document document = new Document(is);
         document.save(tempFile.getAbsolutePath(), com.aspose.words.SaveFormat.DOCX);
         return tempFile;
      } catch (Exception e) {