From 46a52628430ba58c7fc4b973bec09070d3a3375c Mon Sep 17 00:00:00 2001 From: God <10745413@qq.com> Date: Thu, 17 Nov 2022 18:37:58 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yxt/common/base/utils/WordObj.java | 237 ++++++++++++++++++ .../com/yxt/common/base/utils/WordUtils.java | 149 ++++++++++- 2 files changed, 384 insertions(+), 2 deletions(-) create mode 100644 yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordObj.java diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordObj.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordObj.java new file mode 100644 index 0000000..4d7a7c0 --- /dev/null +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordObj.java @@ -0,0 +1,237 @@ +package com.yxt.common.base.utils; + +import com.jacob.activeX.ActiveXComponent; +import com.jacob.com.ComThread; +import com.jacob.com.Dispatch; +import com.jacob.com.Variant; + +public class WordObj { + public WordObj() + { + } + + private static WordObj instance; + + private Dispatch doc = null; + + private Dispatch activeWindow = null; + + private Dispatch docSelection = null; + + private Dispatch wrdDocs = null; + + private String fileName; + + private ActiveXComponent wrdCom; + + /** + * 获取Word操作静态实例对象 + * + * @return 报表汇总业务操作 + */ + public final static synchronized WordObj getInstance() + { + if (instance == null) + instance = new WordObj(); + return instance; + + } + + /** + * 初始化Word对象 + * + * @return 是否初始化成功 + */ + public boolean initWordObj() + { + boolean retFlag = false; + ComThread.InitSTA();// 初始化com的线程,非常重要!!使用结束后要调用 realease方法 + wrdCom = new ActiveXComponent("Word.Application"); + try + { + // 返回wrdCom.Documents的Dispatch + wrdDocs = wrdCom.getProperty("Documents").toDispatch(); + wrdCom.setProperty("Visible", new Variant(true)); + + retFlag = true; + } + catch (Exception e) + { + retFlag = false; + e.printStackTrace(); + } + return retFlag; + } + + /** + * 创建一个新的word文档 + * + */ + + public void createNewDocument() + { + doc = Dispatch.call(wrdDocs, "Add").toDispatch(); + docSelection = Dispatch.get(wrdCom, "Selection").toDispatch(); + + } + + /** + * 取得活动窗体对象 + * + */ + public void getActiveWindow() + { + // 取得活动窗体对象 + activeWindow = wrdCom.getProperty("ActiveWindow").toDispatch(); + + } + + /** + * 打开一个已存在的文档 + * + * @param docPath + */ + + public void openDocument(String docPath) + { + if (this.doc != null) + { + this.closeDocument(); + } + doc = Dispatch.call(wrdDocs, "Open", docPath).toDispatch(); + docSelection = Dispatch.get(wrdCom, "Selection").toDispatch(); + } + + /** + * 关闭当前word文档 + * + */ + public void closeDocument() + { + if (doc != null) + { + Dispatch.call(doc, "Save"); + Dispatch.call(doc, "Close", new Variant(0)); + doc = null; + } + } + + /** + * 文档设置水印 + * + * @param waterMarkStr 水印字符串 + */ + public void setWaterMark(String waterMarkStr) + { + // 取得活动窗格对象 + Dispatch activePan = Dispatch.get(activeWindow, "ActivePane") + .toDispatch(); + // 取得视窗对象 + Dispatch view = Dispatch.get(activePan, "View").toDispatch(); + //输入页眉内容 + Dispatch.put(view, "SeekView", new Variant(9)); + Dispatch headfooter = Dispatch.get(docSelection, "HeaderFooter") + .toDispatch(); + //取得图形对象 + Dispatch shapes = Dispatch.get(headfooter, "Shapes").toDispatch(); + //给文档全部加上水印 + Dispatch selection = Dispatch.call(shapes, "AddTextEffect", + new Variant(9), waterMarkStr, "宋体", new Variant(1), + new Variant(false), new Variant(false), new Variant(0), + new Variant(0)).toDispatch(); + Dispatch.call(selection, "Select"); + //设置水印参数 + Dispatch shapeRange = Dispatch.get(docSelection, "ShapeRange") + .toDispatch(); + Dispatch.put(shapeRange, "Name", "PowerPlusWaterMarkObject1"); + Dispatch textEffect = Dispatch.get(shapeRange, "TextEffect").toDispatch(); + Dispatch.put(textEffect, "NormalizedHeight", new Boolean(false)); + Dispatch line = Dispatch.get(shapeRange, "Line").toDispatch(); + Dispatch.put(line, "Visible", new Boolean(false)); + Dispatch fill = Dispatch.get(shapeRange, "Fill").toDispatch(); + Dispatch.put(fill, "Visible", new Boolean(true)); + //设置水印透明度 + Dispatch.put(fill, "Transparency", new Variant(0.5)); + Dispatch foreColor = Dispatch.get(fill, "ForeColor").toDispatch(); + //设置水印颜色 + Dispatch.put(foreColor, "RGB", new Variant(16711680)); + Dispatch.call(fill, "Solid"); + //设置水印旋转 + Dispatch.put(shapeRange, "Rotation", new Variant(315)); + Dispatch.put(shapeRange, "LockAspectRatio", new Boolean(true)); + Dispatch.put(shapeRange, "Height", new Variant(117.0709)); + Dispatch.put(shapeRange, "Width", new Variant(468.2835)); + Dispatch.put(shapeRange, "Left", new Variant(-999995)); + Dispatch.put(shapeRange, "Top", new Variant(-999995)); + Dispatch wrapFormat = Dispatch.get(shapeRange, "WrapFormat").toDispatch(); + //是否允许交叠 + Dispatch.put(wrapFormat, "AllowOverlap", new Variant(true)); + Dispatch.put(wrapFormat, "Side", new Variant(3)); + Dispatch.put(wrapFormat, "Type", new Variant(3)); + Dispatch.put(shapeRange, "RelativeHorizontalPosition", new Variant(0)); + Dispatch.put(shapeRange, "RelativeVerticalPosition", new Variant(0)); + Dispatch.put(view, "SeekView", new Variant(0)); + } + + + + /** + * 关闭Word资源 + * + * + */ + public void closeWordObj() + { + + // 关闭word文件 + wrdCom.invoke("Quit", new Variant[] {}); + // 释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理 + ComThread.Release(); + } + + /** + * 得到文件名 + * + * @return . + */ + public String getFileName() + { + return fileName; + } + + /** + * 设置文件名 + * + * @param fileName . + */ + public void setFileName(String fileName) + { + this.fileName = fileName; + } + + /** + * 测试功能 + * + */ + public static void main(String[] argv) + { + WordObj d = WordObj.getInstance(); + try + { + if (d.initWordObj()) + { + d.createNewDocument(); + d.getActiveWindow(); + d.setWaterMark("HEllo"); + // d.closeWordObj(); + } + else + System.out.println("初始化Word读写对象失败!"); + } + catch (Exception e) + { + d.closeWordObj(); + } + } + +} diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordUtils.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordUtils.java index 15a7bae..c06fa39 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordUtils.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordUtils.java @@ -4,6 +4,7 @@ import cn.hutool.core.codec.Base64; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; +import com.jacob.com.Variant; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.Version; @@ -84,6 +85,18 @@ public class WordUtils { * @param pdfName pdf名称 */ public static void doc2pdf(String wordFile, String pdfPath, String pdfName) { + doc2pdf( wordFile, pdfPath, pdfName,""); + } + + /** + * word转换为pdf + * + * @param wordFile word的路径 + * @param pdfPath pdf的路径 + * @param pdfName pdf名称 + * @param mark 水印 + */ + public static void doc2pdf(String wordFile, String pdfPath, String pdfName,String mark) { ActiveXComponent app = null; System.out.println("开始转换..."); long start = System.currentTimeMillis(); @@ -97,6 +110,8 @@ public class WordUtils { // 打开文档 document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch(); // 如果文件存在的话,不会覆盖,会直接报错,所以我们需要判断文件是否存在 + //addWatermark(wordFile,wordFile,mark); + //setWaterMark(app,mark); File targetFile = new File(pdfPath); if (!targetFile.exists()) { targetFile.mkdirs(); @@ -124,8 +139,6 @@ public class WordUtils { } } - - public static void main(String[] args) { Map dataMap = new HashMap(); String curDate = DateUtils.dateConvertStr(new Date(), "yyyy年MM月dd日"); @@ -199,4 +212,136 @@ public class WordUtils { this.remarks = remarks; } } + public static void addWatermark(String src, String des, String text) throws Exception { + ComThread.InitMTA(); + ActiveXComponent wordApp = new ActiveXComponent("word.Application"); + // 文档隐藏时进行应用操作 + wordApp.setProperty("Visible", new Variant(false)); + // 实例化模板Workbooks对象 + Dispatch documents = wordApp.getProperty("Documents").toDispatch(); + //打开文件 + Dispatch doc = Dispatch.call(documents, "Open", src, new Variant(false),new Variant(false)).toDispatch(); + Dispatch docSelect = Dispatch.get(wordApp, "Selection").toDispatch(); + //取得活动窗体对象 + Dispatch activeDoc = wordApp.getProperty("ActiveWindow").toDispatch(); + try { + //添加水印,多个水印 + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 4; j++) { + //取得活动窗体对象 + Dispatch activePan = Dispatch.get(activeDoc, "ActivePane").toDispatch(); + //取得视窗对象 + Dispatch view = Dispatch.get(activePan, "View").toDispatch(); + //打开页眉 + Dispatch.put(view, "SeekView", new Variant(9)); + //获取页眉和页脚 + Dispatch headfooter = Dispatch.get(docSelect, "HeaderFooter") + .toDispatch(); + //取得图形对象 + Dispatch shapes = Dispatch.get(headfooter, "Shapes").toDispatch(); + /**插入文字,并转为图片: + * 操作对象、方法、艺术字格式、水印内容、字体、字体大小、字体是否粗体、字体是否斜体、左边距、上边距 + */ + Dispatch selection = Dispatch.call(shapes, "AddTextEffect", + new Variant(9), text, "宋体", new Variant(10), + new Variant(false), new Variant(false), new Variant(0), + new Variant(0)).toDispatch(); + //选中当前文档水印 + Dispatch.call(selection, "Select"); + Dispatch shapeRange = Dispatch.get(docSelect, "ShapeRange") + .toDispatch(); + Dispatch textEffect = Dispatch.get(shapeRange, "TextEffect") + .toDispatch(); + Dispatch.put(textEffect, "NormalizedHeight", new Boolean(false)); + Dispatch line = Dispatch.get(shapeRange, "Line").toDispatch(); + Dispatch.put(line, "Visible", new Boolean(false)); + Dispatch fill = Dispatch.get(shapeRange, "Fill").toDispatch(); + Dispatch.put(fill, "Visible", new Boolean(true)); + // 设置水印透明度 + Dispatch.put(fill, "Transparency", new Variant(0.5)); + Dispatch foreColor = Dispatch.get(fill, "ForeColor").toDispatch(); + //设置水印颜色 + Dispatch.put(foreColor, "RGB", new Variant(16711620)); + Dispatch.call(fill, "Solid"); + // 设置水印旋转 + Dispatch.put(shapeRange, "Rotation", new Variant(315)); + Dispatch.put(shapeRange, "LockAspectRatio", new Boolean(true)); + //设置水印宽高 + Dispatch.put(shapeRange, "Height", new Variant(11)); + Dispatch.put(shapeRange, "Width", new Variant(90)); + //设置水印位置,相对左上角 + Dispatch.put(shapeRange, "Left", new Variant(j * 120 - 60)); + Dispatch.put(shapeRange, "Top", new Variant(i * 270)); + //恢复视图 + Dispatch.put(view, "SeekView", new Variant(0)); + } + } + //另存为目标文件 + Dispatch.call(doc, "SaveAS",des,new Variant(true) ); + } catch (Exception e) { + e.printStackTrace(); + } finally { + Dispatch.call(doc, "Close", new Variant(-1),new Variant(1),new Variant(true)); + if (wordApp != null) { + wordApp.invoke("Quit", new Variant[]{}); + } + ComThread.Release(); + } + } +/* + public static void setWaterMark(ActiveXComponent activeWindow,String waterMarkStr) + { + + + // 取得活动窗格对象 + Dispatch activePan = Dispatch.get(activeWindow, "ActivePane").toDispatch(); + // 取得视窗对象 + Dispatch view = Dispatch.get(activePan, "View").toDispatch(); + Dispatch docSelection=Dispatch.get(activeWindow, "Selection").toDispatch(); + //输入页眉内容 + Dispatch.put(view, "SeekView", new Variant(9)); + Dispatch headfooter = Dispatch.get(docSelection, "HeaderFooter") + .toDispatch(); + //取得图形对象 + Dispatch shapes = Dispatch.get(headfooter, "Shapes").toDispatch(); + //给文档全部加上水印 + Dispatch selection = Dispatch.call(shapes, "AddTextEffect", + new Variant(9), waterMarkStr, "宋体", new Variant(1), + new Variant(false), new Variant(false), new Variant(0), + new Variant(0)).toDispatch(); + Dispatch.call(selection, "Select"); + //设置水印参数 + Dispatch shapeRange = Dispatch.get(docSelection, "ShapeRange") + .toDispatch(); + Dispatch.put(shapeRange, "Name", "PowerPlusWaterMarkObject1"); + Dispatch textEffect = Dispatch.get(shapeRange, "TextEffect").toDispatch(); + Dispatch.put(textEffect, "NormalizedHeight", new Boolean(false)); + Dispatch line = Dispatch.get(shapeRange, "Line").toDispatch(); + Dispatch.put(line, "Visible", new Boolean(false)); + Dispatch fill = Dispatch.get(shapeRange, "Fill").toDispatch(); + Dispatch.put(fill, "Visible", new Boolean(true)); + //设置水印透明度 + Dispatch.put(fill, "Transparency", new Variant(0.5)); + Dispatch foreColor = Dispatch.get(fill, "ForeColor").toDispatch(); + //设置水印颜色 + Dispatch.put(foreColor, "RGB", new Variant(16711680)); + Dispatch.call(fill, "Solid"); + //设置水印旋转 + Dispatch.put(shapeRange, "Rotation", new Variant(315)); + Dispatch.put(shapeRange, "LockAspectRatio", new Boolean(true)); + Dispatch.put(shapeRange, "Height", new Variant(117.0709)); + Dispatch.put(shapeRange, "Width", new Variant(468.2835)); + Dispatch.put(shapeRange, "Left", new Variant(-999995)); + Dispatch.put(shapeRange, "Top", new Variant(-999995)); + Dispatch wrapFormat = Dispatch.get(shapeRange, "WrapFormat").toDispatch(); + //是否允许交叠 + Dispatch.put(wrapFormat, "AllowOverlap", new Variant(true)); + Dispatch.put(wrapFormat, "Side", new Variant(3)); + Dispatch.put(wrapFormat, "Type", new Variant(3)); + Dispatch.put(shapeRange, "RelativeHorizontalPosition", new Variant(0)); + Dispatch.put(shapeRange, "RelativeVerticalPosition", new Variant(0)); + Dispatch.put(view, "SeekView", new Variant(0)); + }*/ + + }