java word转pdf、word中关键字位置插入图片 工具类

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;
    }

}
相关推荐
七夜zippoe3 分钟前
Flink开发语言使用java还是Scala合适
java·flink·scala
zebdhr3 分钟前
java学习day18MyBatis2
java·学习·oracle
Mr. zhihao4 分钟前
解决 IntelliJ IDEA 编译错误 “Groovyc: Internal groovyc error: code 1” 及 JVM 内存配置问题
java·jvm·intellij-idea
Ares陌4 分钟前
Flink开发语言使用Java还是Scala合适?
java·开发语言·flink·scala
hai405875 分钟前
Apache Flink开发时选择Java还是Scala作为编程语言
java·flink·apache
SlothLu8 分钟前
Oracle-OracleConnectorTask
java·大数据·数据库·oracle·开源·数据库开发
我即将远走丶或许也能高飞9 分钟前
uniapp 使用renderjs通信
java·前端·uni-app
椰椰椰耶30 分钟前
【多线程-从零开始-伍】volatile关键字和内存可见性问题
java·多线程
chenthe142 分钟前
Java过滤HTML标签,即提取HTML中的纯文本,不使用正则表达式【jsoup方式,超级简单】,附富文本方式
java·正则表达式·html
Mr.Demo.44 分钟前
[Spring] SpringBoot统一功能处理与图书管理系统
java·后端·spring