package com.casic.missiles.utils; import cn.afterturn.easypoi.word.WordExportUtil; import cn.hutool.core.lang.Assert; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.docx4j.Docx4J; import org.docx4j.convert.out.FOSettings; import org.docx4j.fonts.IdentityPlusMapper; import org.docx4j.fonts.Mapper; import org.docx4j.fonts.PhysicalFonts; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.Map; /** * @Description: 根据word模板导出文件 * @Author: zt * @Date: 2023/2/2 9:27 */ public class PdfUtil { /** * 按照模板 填充数据生成word 只支持docx * * @param templatePath 模板文件路径 * @param temDir 生成文件的目录 * @param fileName 生成文件名 * @param params 参数 */ public static String exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params) { Assert.notNull(templatePath, "模板路径不能为空"); Assert.notNull(temDir, "临时文件路径不能为空"); Assert.notNull(fileName, "导出文件名不能为空"); Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); if (!temDir.endsWith("/")) { temDir = temDir + File.separator; } File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } String tmpPath = ""; try { XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); tmpPath = temDir + fileName; FileOutputStream fos = new FileOutputStream(tmpPath); doc.write(fos); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } return tmpPath; } public static String convertDocx2Pdf(String wordPath, String pdfPath) { OutputStream os = null; InputStream is = null; try { is = new FileInputStream(new File(wordPath)); WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); Mapper fontMapper = new IdentityPlusMapper(); fontMapper.put("隶书", PhysicalFonts.get("LiSu")); fontMapper.put("宋体", PhysicalFonts.get("SimSun")); fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); fontMapper.put("黑体", PhysicalFonts.get("SimHei")); fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); mlPackage.setFontMapper(fontMapper); os = new java.io.FileOutputStream(pdfPath); //docx4j docx转pdf FOSettings foSettings = Docx4J.createFOSettings(); foSettings.setWmlPackage(mlPackage); Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); is.close();//关闭输入流 os.close();//关闭输出流 return ""; } catch (Exception e) { //e.printStackTrace(); try { if (is != null) { is.close(); } if (os != null) { os.close(); } } catch (Exception ex) { ex.printStackTrace(); } } finally { File file = new File(wordPath); if (file != null && file.isFile() && file.exists()) { file.delete(); } } return ""; } public static byte[] getImageBase64(String path) throws IOException { InputStream input = new FileInputStream(path); ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int numBytesRead = 0; while ((numBytesRead = input.read(buf)) != -1) { output.write(buf, 0, numBytesRead); } byte[] data = output.toByteArray(); output.close(); input.close(); return data; } public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { File file = new File(downloadFilePath); if (file.exists()) { response.setContentType("application/force-download");// 设置强制下载不打开 // response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); //中文名称下载 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); byte[] buffer = new byte[1024]; FileInputStream fis = null; BufferedInputStream bis = null; OutputStream outputStream = null; try { fis = new FileInputStream(file); bis = new BufferedInputStream(fis); outputStream = response.getOutputStream(); int i = bis.read(buffer); while (i != -1) { outputStream.write(buffer, 0, i); i = bis.read(buffer); } outputStream.flush(); } catch (Exception e) { //e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { //e.printStackTrace(); } } if (bis != null) { try { bis.close(); } catch (IOException e) { //e.printStackTrace(); } } if (fis != null) { try { fis.close(); } catch (IOException e) { //e.printStackTrace(); } } } } } }