Bläddra i källkod

【CHG】导出DXF文件时图片加载失败

ZhaoMn 4 år sedan
förälder
incheckning
de1a0c1169

+ 15 - 0
railway-common/src/main/java/com/railway/common/utils/http/HttpUtils.java

@@ -8,6 +8,7 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.net.ConnectException;
+import java.net.HttpURLConnection;
 import java.net.SocketTimeoutException;
 import java.net.URL;
 import java.net.URLConnection;
@@ -101,6 +102,7 @@ public class HttpUtils {
     }
     log.info("sendGet - {}", urlNameString);
     try {
+      urlNameString = getRedirectUrl(urlNameString);
       URL realUrl = new URL(urlNameString);
       URLConnection connection = realUrl.openConnection();
       connection.setRequestProperty("accept", "*/*");
@@ -121,6 +123,19 @@ public class HttpUtils {
     return null;
   }
 
+  /**
+   * 获取重定向地址
+   * @param path 原URL地址
+   * @return 重定向之后的地址
+   * @throws Exception 读写异常
+   */
+  private static String getRedirectUrl(String path) throws Exception {
+    HttpURLConnection conn = (HttpURLConnection) new URL(path)
+        .openConnection();
+    conn.setInstanceFollowRedirects(false);
+    conn.setConnectTimeout(5000);
+    return conn.getHeaderField("Location");
+  }
 
   /**
    * 向指定 URL 发送POST方法的请求

+ 247 - 287
railway-common/src/main/java/com/railway/common/utils/poi/WordUtils.java

@@ -22,326 +22,286 @@ import org.apache.poi.xwpf.usermodel.XWPFTableRow;
 
 /*******************************************
  * 通过word模板生成新的word工具类
- * @Package com.railway.common.utils.poi
- * @Author wuhonghao
- * @Date 2021/10/16
+ * @author wuhonghao
+ * @date 2021/10/16
  *******************************************/
 public class WordUtils {
 
-    /**
-     * 根据模板生成word
-     * @param is     模板的路径
-     * @param params   需要替换的参数
-     * @param tableList   需要插入的参数
-     * @param fileName 生成word文件的文件名
-     * @param response 请求
-     */
-    public void getWord(InputStream is, Map<String, Object> params, List<String[]> tableList, String fileName, HttpServletResponse response) throws Exception {
-        CustomXWPFDocument doc = new CustomXWPFDocument(is);
-        //替换文本里面的变量
-        this.replaceInPara(doc, params);
-        //替换表格里面的变量
-        this.replaceInTable(doc, params, tableList);
-        OutputStream os = response.getOutputStream();
-        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
-        response.setHeader("Content-disposition", "attachment; filename=" + fileName);
-        doc.write(os);
-        this.close(os);
-        this.close(is);
-    }
+  /**
+   * 根据模板生成word
+   *
+   * @param is 模板的路径
+   * @param params 需要替换的参数
+   * @param tableList 需要插入的参数
+   * @param fileName 生成word文件的文件名
+   * @param response 请求
+   */
+  public void getWord(InputStream is, Map<String, Object> params, List<String[]> tableList,
+      String fileName, HttpServletResponse response) throws Exception {
+    CustomXWPFDocument doc = new CustomXWPFDocument(is);
+    //替换文本里面的变量
+    this.replaceInPara(doc, params);
+    //替换表格里面的变量
+    this.replaceInTable(doc, params, tableList);
+    OutputStream os = response.getOutputStream();
+    response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+    response.setHeader("Content-disposition", "attachment; filename=" + fileName);
+    doc.write(os);
+    this.close(os);
+    this.close(is);
+  }
 
-    /**
-     * 根据模板生成word
-     * @param params   需要替换的参数
-     * @param template 模板位置
-     * @param wordName 生成word文件的文件名
-     */
-    public String getWord(Map<String, Object> params, String template, String wordName)  {
-        return getWord(params, null, template, wordName);
-    }
+  /**
+   * 根据模板生成word
+   *
+   * @param params 需要替换的参数
+   * @param template 模板位置
+   * @param wordName 生成word文件的文件名
+   */
+  public String getWord(Map<String, Object> params, String template, String wordName) {
+    return getWord(params, null, template, wordName);
+  }
 
-    /**
-     * 根据模板生成word
-     * @param params   需要替换的参数
-     * @param tableList   需要插入的参数
-     * @param template 模板位置
-     * @param wordName 生成word文件的文件名
-     */
-    public String getWord(Map<String, Object> params, List<String[]> tableList,
-        String template, String wordName)  {
-        String fileName = encodingFilename(wordName);
-        String filePath = FileUploadUtils.getAbsoluteFile(fileName);
-        try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(template);
-            CustomXWPFDocument doc = new CustomXWPFDocument(is);
-            OutputStream os = new FileOutputStream(filePath)){
-            //替换文本里面的变量
-            this.replaceInPara(doc, params);
-            //替换表格里面的变量
-            this.replaceInTable(doc, params, tableList);
-            doc.write(os);
-        } catch (IOException e) {
-            return null;
-        }
-        return filePath;
+  /**
+   * 根据模板生成word
+   *
+   * @param params 需要替换的参数
+   * @param tableList 需要插入的参数
+   * @param template 模板位置
+   * @param wordName 生成word文件的文件名
+   */
+  public String getWord(Map<String, Object> params, List<String[]> tableList,
+      String template, String wordName) {
+    String fileName = encodingFilename(wordName);
+    String filePath = FileUploadUtils.getAbsoluteFile(fileName);
+    try (InputStream is = Thread.currentThread().getContextClassLoader()
+        .getResourceAsStream(template);
+        CustomXWPFDocument doc = new CustomXWPFDocument(is);
+        OutputStream os = new FileOutputStream(filePath)) {
+      //替换文本里面的变量
+      this.replaceInPara(doc, params);
+      //替换表格里面的变量
+      this.replaceInTable(doc, params, tableList);
+      doc.write(os);
+    } catch (IOException e) {
+      return null;
     }
+    return filePath;
+  }
 
-    /**
-     * 编码文件名
-     */
-    public String encodingFilename(String filename) {
-        filename = UUID.randomUUID() + Constants.UNDERLINE + filename;
-        return filename;
-    }
+  /**
+   * 编码文件名
+   */
+  public String encodingFilename(String filename) {
+    filename = UUID.randomUUID() + Constants.UNDERLINE + filename;
+    return filename;
+  }
 
-    /**
-     * 替换段落里面的变量
-     * @param doc    要替换的文档
-     * @param params 参数
-     */
-    private void replaceInPara(CustomXWPFDocument doc, Map<String, Object> params) {
-        Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
-        XWPFParagraph para;
-        while (iterator.hasNext()) {
-            para = iterator.next();
-            this.replaceInPara(para, params, doc);
-        }
+  /**
+   * 替换段落里面的变量
+   *
+   * @param doc 要替换的文档
+   * @param params 参数
+   */
+  private void replaceInPara(CustomXWPFDocument doc, Map<String, Object> params) {
+    Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
+    XWPFParagraph para;
+    while (iterator.hasNext()) {
+      para = iterator.next();
+      this.replaceInPara(para, params, doc);
     }
+  }
 
-    /**
-     * 替换段落里面的变量
-     *
-     * @param para   要替换的段落
-     * @param params 参数
-     */
-    private void replaceInPara(XWPFParagraph para, Map<String, Object> params, CustomXWPFDocument doc) {
-        List<XWPFRun> runs;
-        Matcher matcher;
-        if (this.matcher(para.getParagraphText()).find()) {
-            runs = para.getRuns();
-            /*int start = -1;
-            int end = -1;
-            String str = "";
-            for (int i = 0; i < runs.size(); i++) {
-                XWPFRun run = runs.get(i);
-                String runText = run.toString();
-                str += runText;
-                if ('$' == runText.charAt(0) && '{' == runText.charAt(1)) {
-                    start = i;
-                }
-                if ((start != -1)) {
-                    str += runText;
-                }
-                if ('}' == runText.charAt(runText.length() - 1)) {
-                    if (start != -1) {
-                        end = i;
-                        break;
-                    }
-                }
-            }*/
-
-/*            for (int i = start; i <= end; i++) {
-                para.removeRun(i);
-                i--;
-                end--;
-            }*/
-            for (int i = 0; i < runs.size(); i++) {
-                XWPFRun run = runs.get(i);
-                String str = run.toString();
-                for (Map.Entry<String, Object> entry : params.entrySet()) {
-                    String key = entry.getKey();
-                    if (str.indexOf(key) != -1) {
-                        Object value = entry.getValue();
-                        if (value instanceof String) {
-                            str = str.replace(key, value.toString());
-                            //if(run.getText(0).equals(key)){
-                                run.setText(str, 0);
-                            //}
-
-                            //para.createRun().setText(str, 0);
-                            //para.insertNewRun(start).setText(str);
-                            break;
-                        } else if (value instanceof Map) {
-                            str = str.replace(key, "");
-                            Map pic = (Map) value;
-                            int width = Integer.parseInt(pic.get("width").toString());
-                            int height = Integer.parseInt(pic.get("height").toString());
-                            int picType = getPictureType(pic.get("type").toString());
-                            byte[] byteArray = (byte[]) pic.get("content");
-                            ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);
-                            try {
-                                //int ind = doc.addPicture(byteInputStream,picType);
-                                //doc.createPicture(ind, width , height,para);
-                                String blipId = doc.addPictureData(byteInputStream, picType);
-                                doc.createPicture(run,blipId,doc.getAllPictures().size() - 1, width, height, para);
-                                run.setText(str, 0);
-                                //para.createRun().setText(str, 0);
-                                break;
-                            } catch (Exception e) {
-                                e.printStackTrace();
-                            }
-                        }
-                    }
-                }
+  /**
+   * 替换段落里面的变量
+   *
+   * @param para 要替换的段落
+   * @param params 参数
+   */
+  private void replaceInPara(XWPFParagraph para, Map<String, Object> params,
+      CustomXWPFDocument doc) {
+    List<XWPFRun> runs;
+    if (this.matcher(para.getParagraphText()).find()) {
+      runs = para.getRuns();
+      for (XWPFRun run : runs) {
+        String str = run.toString();
+        for (Map.Entry<String, Object> entry : params.entrySet()) {
+          String key = entry.getKey();
+          if (str.contains(key)) {
+            Object value = entry.getValue();
+            if (value instanceof String) {
+              str = str.replace(key, value.toString());
+              run.setText(str, 0);
+              break;
+            } else if (value instanceof Map) {
+              str = str.replace(key, "");
+              Map<String, Object> pic = (Map<String, Object>) value;
+              int width = Integer.parseInt(pic.get("width").toString());
+              int height = Integer.parseInt(pic.get("height").toString());
+              int picType = getPictureType(pic.get("type").toString());
+              byte[] byteArray = (byte[]) pic.get("content");
+              ByteArrayInputStream byteInputStream = new ByteArrayInputStream(
+                  byteArray);
+              try {
+                String blipId = doc.addPictureData(byteInputStream, picType);
+                doc.createPicture(run, blipId, doc.getAllPictures().size() - 1,
+                    width, height, para);
+                run.setText(str, 0);
+                break;
+              } catch (Exception e) {
+                e.printStackTrace();
+              }
             }
-
+          }
         }
+      }
     }
+  }
 
-
-    /**
-     * 为表格插入数据,行数不够添加新行
-     *
-     * @param table     需要插入数据的表格
-     * @param tableList 插入数据集合
-     */
-    private static void insertTable(XWPFTable table, List<String[]> tableList) {
-        //创建行,根据需要插入的数据添加新行,不处理表头
-        for (int i = 0; i < tableList.size(); i++) {
-            XWPFTableRow row = table.createRow();
-        }
-        //遍历表格插入数据
-        List<XWPFTableRow> rows = table.getRows();
-        int length = table.getRows().size();
-        for (int i = 1; i < length - 1; i++) {
-            XWPFTableRow newRow = table.getRow(i);
-            List<XWPFTableCell> cells = newRow.getTableCells();
-            for (int j = 0; j < cells.size(); j++) {
-                XWPFTableCell cell = cells.get(j);
-                String s = tableList.get(i - 1)[j];
-                cell.setText(s);
-            }
-        }
+  /**
+   * 为表格插入数据,行数不够添加新行
+   *
+   * @param table 需要插入数据的表格
+   * @param tableList 插入数据集合
+   */
+  private static void insertTable(XWPFTable table, List<String[]> tableList) {
+    //创建行,根据需要插入的数据添加新行,不处理表头
+    for (int i = 0; i < tableList.size(); i++) {
+      table.createRow();
     }
+    //遍历表格插入数据
+    int length = table.getRows().size();
+    for (int i = 1; i < length - 1; i++) {
+      XWPFTableRow newRow = table.getRow(i);
+      List<XWPFTableCell> cells = newRow.getTableCells();
+      for (int j = 0; j < cells.size(); j++) {
+        XWPFTableCell cell = cells.get(j);
+        String s = tableList.get(i - 1)[j];
+        cell.setText(s);
+      }
+    }
+  }
 
-    /**
-     * 替换表格里面的变量
-     * @param doc    要替换的文档
-     * @param params 参数
-     */
-    private void replaceInTable(CustomXWPFDocument doc, Map<String, Object> params, List<String[]> tableList) {
-        Iterator<XWPFTable> iterator = doc.getTablesIterator();
-        XWPFTable table;
-        List<XWPFTableRow> rows;
-        List<XWPFTableCell> cells;
-        List<XWPFParagraph> paras;
-        while (iterator.hasNext()) {
-            table = iterator.next();
-            if (table.getRows().size() > 1) {
-                //判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入
-                if (this.matcher(table.getText()).find()) {
-                    rows = table.getRows();
-                    for (XWPFTableRow row : rows) {
-                        cells = row.getTableCells();
-                        for (XWPFTableCell cell : cells) {
-                            paras = cell.getParagraphs();
-                            for (XWPFParagraph para : paras) {
-                                this.replaceInPara(para, params, doc);
-                            }
-                        }
-                    }
-                } else {
-                    if(tableList!=null){
-                        insertTable(table, tableList);  //插入数据
-                    }
-                }
+  /**
+   * 替换表格里面的变量
+   *
+   * @param doc 要替换的文档
+   * @param params 参数
+   */
+  private void replaceInTable(CustomXWPFDocument doc, Map<String, Object> params,
+      List<String[]> tableList) {
+    Iterator<XWPFTable> iterator = doc.getTablesIterator();
+    XWPFTable table;
+    List<XWPFTableRow> rows;
+    List<XWPFTableCell> cells;
+    List<XWPFParagraph> paras;
+    while (iterator.hasNext()) {
+      table = iterator.next();
+      if (table.getRows().size() > 1) {
+        //判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入
+        if (this.matcher(table.getText()).find()) {
+          rows = table.getRows();
+          for (XWPFTableRow row : rows) {
+            cells = row.getTableCells();
+            for (XWPFTableCell cell : cells) {
+              paras = cell.getParagraphs();
+              for (XWPFParagraph para : paras) {
+                this.replaceInPara(para, params, doc);
+              }
             }
+          }
+        } else {
+          if (tableList != null) {
+            //插入数据
+            insertTable(table, tableList);
+          }
         }
+      }
     }
+  }
 
 
-    /**
-     * 正则匹配字符串
-     *
-     * @param str
-     * @return
-     */
-    private Matcher matcher(String str) {
-        Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(str);
-        return matcher;
-    }
+  /**
+   * 正则匹配字符串
+   */
+  private Matcher matcher(String str) {
+    Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
+    return pattern.matcher(str);
+  }
 
 
-    /**
-     * 根据图片类型,取得对应的图片类型代码
-     *
-     * @param picType
-     * @return int
-     */
-    private static int getPictureType(String picType) {
-        int res = CustomXWPFDocument.PICTURE_TYPE_PICT;
-        if (picType != null) {
-            if (picType.equalsIgnoreCase("png")) {
-                res = CustomXWPFDocument.PICTURE_TYPE_PNG;
-            } else if (picType.equalsIgnoreCase("dib")) {
-                res = CustomXWPFDocument.PICTURE_TYPE_DIB;
-            } else if (picType.equalsIgnoreCase("emf")) {
-                res = CustomXWPFDocument.PICTURE_TYPE_EMF;
-            } else if (picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")) {
-                res = CustomXWPFDocument.PICTURE_TYPE_JPEG;
-            } else if (picType.equalsIgnoreCase("wmf")) {
-                res = CustomXWPFDocument.PICTURE_TYPE_WMF;
-            }
-        }
-        return res;
+  /**
+   * 根据图片类型,取得对应的图片类型代码
+   *
+   * @return int
+   */
+  private static int getPictureType(String picType) {
+    int res = CustomXWPFDocument.PICTURE_TYPE_PICT;
+    if (picType != null) {
+      if ("png".equalsIgnoreCase(picType)) {
+        res = CustomXWPFDocument.PICTURE_TYPE_PNG;
+      } else if ("dib".equalsIgnoreCase(picType)) {
+        res = CustomXWPFDocument.PICTURE_TYPE_DIB;
+      } else if ("emf".equalsIgnoreCase(picType)) {
+        res = CustomXWPFDocument.PICTURE_TYPE_EMF;
+      } else if ("jpg".equalsIgnoreCase(picType) || "jpeg".equalsIgnoreCase(picType)) {
+        res = CustomXWPFDocument.PICTURE_TYPE_JPEG;
+      } else if ("wmf".equalsIgnoreCase(picType)) {
+        res = CustomXWPFDocument.PICTURE_TYPE_WMF;
+      }
     }
+    return res;
+  }
 
-    /**
-     * 将输入流中的数据写入字节数组
-     *
-     * @param in
-     * @return
-     */
-    public static byte[] inputStream2ByteArray(InputStream in, boolean isClose) {
-        byte[] byteArray = null;
+  /**
+   * 将输入流中的数据写入字节数组
+   */
+  public static byte[] inputStream2ByteArray(InputStream in, boolean isClose) {
+    byte[] byteArray = null;
+    try {
+      int total = in.available();
+      byteArray = new byte[total];
+      in.read(byteArray);
+    } catch (IOException e) {
+      e.printStackTrace();
+    } finally {
+      if (isClose) {
         try {
-            int total = in.available();
-            byteArray = new byte[total];
-            in.read(byteArray);
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            if (isClose) {
-                try {
-                    in.close();
-                } catch (Exception e2) {
-                    e2.getStackTrace();
-                }
-            }
+          in.close();
+        } catch (Exception e2) {
+          e2.getStackTrace();
         }
-        return byteArray;
+      }
     }
+    return byteArray;
+  }
 
 
-    /**
-     * 关闭输入流
-     *
-     * @param is
-     */
-    private void close(InputStream is) {
-        if (is != null) {
-            try {
-                is.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
+  /**
+   * 关闭输入流
+   */
+  private void close(InputStream is) {
+    if (is != null) {
+      try {
+        is.close();
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
     }
+  }
 
-    /**
-     * 关闭输出流
-     *
-     * @param os
-     */
-    private void close(OutputStream os) {
-        if (os != null) {
-            try {
-                os.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
+  /**
+   * 关闭输出流
+   */
+  private void close(OutputStream os) {
+    if (os != null) {
+      try {
+        os.close();
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
     }
+  }
 
 
 }