问题修改
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}*/
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user