Browse Source

问题修改

master
God 3 years ago
parent
commit
46a5262843
  1. 237
      yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordObj.java
  2. 149
      yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordUtils.java

237
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();
}
}
}

149
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<String, Object> dataMap = new HashMap<String, Object>();
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));
}*/
}

Loading…
Cancel
Save