From a82c0300d749826355841048fd3b866dbe104a9a Mon Sep 17 00:00:00 2001 From: alllenliufor3 <1009545232@qq.com> Date: Mon, 11 Apr 2022 10:47:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E7=94=9F=E6=88=90word?= =?UTF-8?q?=E5=8F=8Aword=E8=BD=ACpdf=20=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/component/DocPdfComponent.java | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java new file mode 100644 index 0000000..0b9e8e6 --- /dev/null +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java @@ -0,0 +1,168 @@ +package com.yxt.common.base.config.component; + +import com.jacob.activeX.ActiveXComponent; +import com.jacob.com.Dispatch; +import com.yxt.common.base.utils.DateUtils; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.Version; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import sun.misc.BASE64Encoder; + +import java.io.*; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author liuguohui + * @version 1.0 + * @description 生成word及word转pdf 组件 + * @date 2022/04/09 + */ +@Component +public class DocPdfComponent { + + private static final Logger log = LoggerFactory.getLogger(DocPdfComponent.class); + + @Value("${templateUrl.uploadUrl:static/template/}") + private String uploadTemplateUrl; + + @Value("${templateUrl.prefixUrl:http://127.0.0.1:8080/template/}") + private String prefixTemplateUrl; + + /** + * 根据ftl模板生成word + * + * @param map 数据 + * @param typeName 模板名称 + * @param fileName 文件名 + * @return 返回word文件路径和链接路径 + */ + public Map creatWord(Map map, String typeName, String fileName) { + String dateStr = DateUtils.dateConvertStr(new Date(), "yyyyMMdd"); + String targetPath = uploadTemplateUrl + dateStr; + try { + //Configuration 用于读取ftl文件 + Configuration configuration = new Configuration(new Version("2.3.0")); + configuration.setDefaultEncoding("utf-8"); + //指定路径的第一种方式(根据某个类的相对路径指定) +// configuration.setClassForTemplateLoading(this.getClass(), ""); + //指定路径的第二种方式 + configuration.setDirectoryForTemplateLoading(new File(uploadTemplateUrl)); + //输出文档路径及名称 + File targetFile = new File(targetPath); + if (!targetFile.exists()) { + targetFile.mkdirs(); + } + targetPath = targetPath + File.separator + fileName; + File outFile = new File(targetPath); + //以utf-8的编码读取ftl文件 + Template template = configuration.getTemplate(typeName + ".ftl", "utf-8"); + Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240); + template.process(map, out); + out.close(); + } catch (Exception e) { + e.printStackTrace(); + } + Map resultMap = new HashMap<>(); + String prefixUrl = prefixTemplateUrl + targetPath.replace(uploadTemplateUrl, ""); + resultMap.put("uploadTemplateUrl", targetPath); // 文件路径 + resultMap.put("prefixTemplateUrl", prefixUrl); // 链接路径 + return resultMap; + } + + /** + * 图片文件转换 + * @param imgPath + * @return + */ + public String getImageStr(String imgPath) { + String imgFile = imgPath; + InputStream in = null; + byte[] data = null; + try { + in = new FileInputStream(imgFile); + data = new byte[in.available()]; + in.read(data); + in.close(); + } catch (Exception e) { + e.printStackTrace(); + } + BASE64Encoder encoder = new BASE64Encoder(); + return encoder.encode(data); + } + + /** + * word转换为pdf + * @param wordFile word的路径 + * @param pdfName pdf名称 + * @return 返回pdf文件路径和链接路径 + */ + public Map doc2pdf(String wordFile, String pdfName) { + String dateStr = DateUtils.dateConvertStr(new Date(), "yyyyMMdd"); + String targetPath = uploadTemplateUrl + dateStr; + ActiveXComponent app = null; + Map resultMap = new HashMap<>(); + log.info("doc开始转换pdf..."); + try { + // 打开word + app = new ActiveXComponent("Word.Application"); + // 获得word中所有打开的文档 + Dispatch documents = app.getProperty("Documents").toDispatch(); + // 打开文档 + Dispatch document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch(); + // 如果文件存在的话,不会覆盖,会直接报错,所以我们需要判断文件是否存在 + File targetFile = new File(targetPath); + if (!targetFile.exists()) { + targetFile.mkdirs(); + } + String pdfFile = targetPath + File.separator + pdfName; + File target = new File(pdfFile); + if (target.exists()) { + target.delete(); + } + Dispatch.call(document, "SaveAs", pdfFile, 17); + // 关闭文档 + Dispatch.call(document, "Close", false); + String prefixUrl = prefixTemplateUrl + pdfFile.replace(uploadTemplateUrl, ""); + resultMap.put("uploadTemplateUrl", pdfFile); // 文件路径 + resultMap.put("prefixTemplateUrl", prefixUrl); // 链接路径 + } catch (Exception e) { + log.error("转换失败" + e.getMessage()); + } finally { + // 关闭office + app.invoke("Quit", 0); + } + return resultMap; + } + + /** + * 根据ftl模板生成word并转为pdf + * @param map + * @param typeName + * @param docName + * @return 返回pdf文件路径和链接路径 + */ + public Map createDocToPdf(Map map, String typeName, String docName) { + // 生成doc文件 + Map docMap = creatWord(map, typeName, docName); + String uploadTemplateUrl = docMap.get("uploadTemplateUrl"); + // pdf的文件名 + String pdfName = docName.replace(".doc", ".pdf"); + // 生成pdf文件 + Map pdfMap = doc2pdf(uploadTemplateUrl, pdfName); + return pdfMap; + } + + public String getUploadTemplateUrl() { + return uploadTemplateUrl; + } + + public String getPrefixTemplateUrl() { + return prefixTemplateUrl; + } +}