阅读量:0
java word转pdf、word中关键字位置插入图片 工具类
1.pom依赖
<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包
<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.工具类
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; } }