引入pom依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.22</version>
</dependency>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>3.9.0</version>
</dependency>
工具类
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.TextSelection;
import com.spire.doc.documents.TextWrappingStyle;
import com.spire.doc.fields.DocPicture;
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.*;
import java.util.Map;
public class WordUtils {
private static Configuration configuration = null;
//这里注意的是利用WordUtils的类加载器动态获得模板文件的位置
private static final String templateFolder = "/static/wordFtl";
static {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(WordUtils.class, templateFolder);
}
private WordUtils() {
throw new AssertionError();
}
/**
* 生成word文件
* @param dataMap 数据
* @param ftlName ftl文件名
* @param filePath 生成的文件路径
* @return
*/
public static boolean createDoc(Map<String, Object> dataMap, String ftlName, String filePath) {
Template t = null;
Writer out = null;
FileOutputStream fos = null;
OutputStreamWriter oWriter = null;
boolean b = false;
try {
//输出文档路径及名称
File outFile = new File(filePath);
t = configuration.getTemplate(ftlName);
fos = new FileOutputStream(outFile);
oWriter = new OutputStreamWriter(fos, "UTF-8");
//这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
//out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
out = new BufferedWriter(oWriter);
t.process(dataMap, out);
b = true;
} catch (Exception e1) {
b = false;
e1.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (null != oWriter) {
oWriter.close();
}
if (fos != null) {
fos.close();
}
} catch (IOException e) {
b = false;
e.printStackTrace();
}
}
return b;
}
/**
* 根据关键字盖章
*/
public static boolean addStampByKeyword(String inFilePath, String outFilePath, String imgPath, String keyword,
int keywordIndex, float horizontalPosition, float verticalPosition) {
FileInputStream inputStream = null;
boolean b = false;
Document doc = null;
try {
inputStream = new FileInputStream(imgPath);
// 加载文档
doc = new Document();
doc.loadFromFile(inFilePath);
// 搜索关键字段落
TextSelection[] textSelections = doc.findAllString(keyword, false, false);
if (textSelections != null) {
Paragraph paragraph = textSelections[keywordIndex > -1 ? keywordIndex : textSelections.length - 1].getAsOneRange().getOwnerParagraph();
// 根据关键字段落盖章
appendPicture(paragraph, inputStream, horizontalPosition, verticalPosition);
}
// 保存文档
doc.saveToFile(outFilePath, FileFormat.Docx);
doc.dispose();
doc.close();
b = true;
} catch (Exception e) {
b = false;
e.printStackTrace();
} finally {
try {
if (null != doc) {
doc.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
b = false;
e.printStackTrace();
}
}
return b;
}
/**
* 根据关键字盖章
* @param inFilePath 需要盖章的word文件
* @param outFilePath 盖章后的word文件地址
* @param imgPath 图片章的路径
* @param keyword 关键字
* @return
*/
public static boolean addStampByKeyword(String inFilePath, String outFilePath, String imgPath, String keyword) {
return addStampByKeyword(inFilePath, outFilePath, imgPath, keyword, -1, 70f, -30f);
}
/**
* 盖章
*/
private static void appendPicture(Paragraph paragraph, InputStream stampIs, float horizontalPosition, float verticalPosition) {
DocPicture picture = paragraph.appendPicture(stampIs);
// 衬于文字下方
picture.setTextWrappingStyle(TextWrappingStyle.Behind);
// 指定电子章在段落的位置
picture.setHorizontalPosition(horizontalPosition);
picture.setVerticalPosition(verticalPosition);
picture.setHeight(130f);
picture.setWidth(130f);
}
public static void main(String[] args) {
String docPath = "C:\\Users\\54405\\Desktop\\tp\\xch123.doc";
String outPath = "C:\\Users\\54405\\Desktop\\tp\\new.doc";
String key = "协查单位名称、盖章";
String img = "C:\\Users\\54405\\Desktop\\tp\\pie.png";
WordUtils.addStampByKeyword(docPath, outPath, img, key);
}
}
效果如下: