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


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

    1.pom依赖

    
    		<dependency>
    			<groupId>org.apache.poigroupId>
    			<artifactId>poiartifactId>
    			<version>3.15version>
    		dependency>
    		<dependency>
    			<groupId>org.apache.poigroupId>
    			<artifactId>poi-ooxmlartifactId>
    			<version>3.15version>
    		dependency>
    		<dependency>
    			<groupId>org.apache.poigroupId>
    			<artifactId>poi-scratchpadartifactId>
    			<version>3.15version>
    		dependency>
    		<dependency>
    			<groupId>org.apache.poigroupId>
    			<artifactId>ooxml-schemasartifactId>
    			<version>1.4version>
    		dependency>
    
    		<dependency>
    			<groupId>org.apache.poigroupId>
    			<artifactId>poi-ooxml-schemasartifactId>
    			<version>3.15version>
    

    2.依赖jar包

    		<dependency>
    			<groupId>com.asposegroupId>
    			<artifactId>aspose-wordsartifactId>
    			<version>15.8.0version>
    			<scope>systemscope>
    			<systemPath>${pom.basedir}/src/main/webapp/WEB-INF/lib/aspose-words-15.8.0-jdk16.jarsystemPath>
    		dependency>
    

    aspose-words是需要在我们项目中引入的,并且使用时要在resouces目录下导入license.xml文件,否则生成的文件抬头会有红色的license信息。

    aspose-words-15.8.0-jdk16.jar 与license.xml

    3.工具类

    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;
        }
    
    }
    
    
  • 相关阅读:
    双向数据绑定
    SpringMVC常见面试题总结
    bazel远程缓存(Remote Cache)
    MybatisPlus整合笔记(2022)
    Java运算符及流程控制
    qt学习之旅--QToolBar的使用(一)
    【详识JAVA语言】面向对象程序三大特性之一:封装
    python爬虫教程:selenium常用API用法和浏览器控制
    Zigbee组网控制流程
    CSS实现超链接标签:鼠标光标为手形、取消下划线、当鼠标悬停时显示下划线
  • 原文地址:https://blog.csdn.net/qq_38105536/article/details/140385315