java word转pdf、word中关键字位置插入图片 工具类
1.pom依赖
xml
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.15</version>
2.依赖jar包
xml
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>15.8.0</version>
<scope>system</scope>
<systemPath>${pom.basedir}/src/main/webapp/WEB-INF/lib/aspose-words-15.8.0-jdk16.jar</systemPath>
</dependency>
aspose-words是需要在我们项目中引入的,并且使用时要在resouces目录下导入license.xml文件,否则生成的文件抬头会有红色的license信息。
aspose-words-15.8.0-jdk16.jar 与license.xml
3.工具类
java
import com.aspose.words.*;
import com.aspose.words.Document;
import org.apache.poi.xwpf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* @author dume
* @ClassName WordToPdf
* @description: TODO
* @date 2024年07月02日
* @version: 1.0
*/
public class WordUtils {
private static Logger logger = LoggerFactory.getLogger(WordUtils.class);
private static final String BASE_PATH = WordUtils.class.getClassLoader().getResource("").getPath();
/**
* Word转Pdf
* @param sourcePath 原路径
* @param targetPath 转出路径
* @return
*/
public static boolean WordToPdf(String sourcePath,String targetPath){
FileOutputStream os = null;
try{
// 验证License 若不验证则转化出的pdf文档会有水印产生
if (!getLicense()) {
logger.info("license验证失败");
return false;
}
File file = new File(targetPath);
os = new FileOutputStream(file);
FontSettings.setFontsFolder(BASE_PATH, true);
FontSettings.setDefaultFontName("STFANGSO");
Document doc = new Document(sourcePath);
doc.save(os, SaveFormat.PDF);
os.flush();
os.close();
}catch (Exception e){
e.printStackTrace();
logger.error(e.getMessage());
return false;
}finally {
if(os!=null){
try{
os.close();
}catch (Exception e){
}
}
}
return true;
}
/**
* word中插入图片方法
* @param sourcePath word路径
* @param imgPath 图片路径
* @param keyWords 关键字
* @return 插入是否成功
*/
public static boolean InsertImg(String sourcePath,String imgPath,String keyWords){
try{
// 验证License 若不验证则转化出的pdf文档会有水印产生
if (!getLicense()) {
logger.info("license验证失败");
return false;
}
Document doc = new Document(sourcePath);
DocumentBuilder builder = new DocumentBuilder(doc);
//插入图片的方法
NodeCollection runs = doc.getChildNodes(NodeType.PARAGRAPH, true);
for (int i = 0; i < runs.getCount(); i++) {
Node r = runs.get(i);
String text = r.getText();
//获取键
if(text.contains(keyWords)){
//锁定到当前段落即实现页面变换
builder.moveTo(r);
builder.insertImage(imgPath, RelativeHorizontalPosition.PAGE, 205, RelativeVerticalPosition.PAGE, 0, 20, 7, WrapType.INLINE);
break;
}
}
doc.save(sourcePath);
}catch (Exception e){
e.printStackTrace();
logger.error(e.getMessage());
return false;
}
return true;
}
public static boolean getLicense() {
boolean result = false;
try {
FileInputStream is = new FileInputStream (BASE_PATH+"license.xml");
License asposeLicense = new License();
asposeLicense.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/***
* @Description :替换段落文本
* @param document docx解析对象
* @param textMap 需要替换的信息集合
* @return void
*/
public static void changeText(XWPFDocument document, Map<String, Object> textMap) {
// 获取段落集合
Iterator<XWPFParagraph> iterator = document.getParagraphsIterator();
XWPFParagraph paragraph = null;
while (iterator.hasNext()) {
paragraph = iterator.next();
// 判断此段落是否需要替换
if (checkText(paragraph.getText())) {
replaceValue(paragraph, textMap);
}
}
}
/***
* @Description :替换表格内的文字
* @param document
* @param data
* @return void
*/
public static void changeTableText(XWPFDocument document, Map<String, Object> data) {
// 获取文件的表格
Iterator<XWPFTable> tableList = document.getTablesIterator();
XWPFTable table;
List<XWPFTableRow> rows;
List<XWPFTableCell> cells;
// 循环所有需要进行替换的文本,进行替换
while (tableList.hasNext()) {
table = tableList.next();
if (checkText(table.getText())) {
rows = table.getRows();
// 遍历表格,并替换模板
for (XWPFTableRow row : rows) {
cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
// 判断单元格是否需要替换
if (checkText(cell.getText())) {
List<XWPFParagraph> paragraphs = cell.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
replaceValue(paragraph, data);
}
}
}
}
}
}
}
/***
* @Description :检查文本中是否包含指定的字符(此处为"$")
* @param text
* @return boolean
*/
public static boolean checkText(String text) {
boolean check = false;
if (text.contains("$")) {
check = true;
}
return check;
}
/***
* @Description :替换内容
* @param paragraph
* @param textMap
* @return void
*/
public static void replaceValue(XWPFParagraph paragraph, Map<String, Object> textMap) {
XWPFRun run, nextRun;
String runsText;
List<XWPFRun> runs = paragraph.getRuns();
for (int i = 0; i < runs.size(); i++) {
run = runs.get(i);
runsText = run.getText(0);
if (runsText.contains("${") || (runsText.contains("$") && runs.get(i + 1).getText(0).substring(0, 1).equals("{"))) {
while (!runsText.contains("}")) {
nextRun = runs.get(i + 1);
runsText = runsText + nextRun.getText(0);
//删除该节点下的数据
paragraph.removeRun(i + 1);
}
Object value = changeValue(runsText, textMap);
//判断key在Map中是否存在
String replaceText = runsText.replace("${", "").replace("}", "");
if (textMap.containsKey(replaceText)) {
run.setText(value.toString(), 0);
} else {
//如果匹配不到,则不修改
run.setText(runsText, 0);
}
}
}
}
/***
* @Description :匹配参数
* @param value
* @param textMap
* @return java.lang.Object
*/
public static Object changeValue(String value, Map<String, Object> textMap) {
Object valu = "";
for (Map.Entry<String, Object> textSet : textMap.entrySet()) {
// 匹配模板与替换值 格式${key}
String key = textSet.getKey();
if (value.contains(key)) {
valu = textSet.getValue();
}
}
return valu;
}
}