以前写过用asposeword 替换文字和图片,但是后来遇到问题,有些word替换替换图片后会导致打开时弹出错误:此文件中检测到错误,单word可以通过进行一下修复来打开文件。

考虑可能是版本有bug,于是从官网下了最新的20.7版本。

下载:aspose word for java 20.7

新版替换字符为图片的方法有些不一样

使用方法:

package xf.test;import com.aspose.words.*;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;public class TestAspose {public static void main(String[] args) {try {//doc 和docx 都是可以的Map<String,String>pmap = new HashMap<String,String>();pmap.put("[编写签名区域]","$pic:D:/javatest/sign2.png");pmap.put("$编号$","BH12345");//replace("D:/javatest/test删除图片.doc","D:/javatest/aspose测试删除图片.doc",pmap);
//            replace("D:/javatest/田清单A8.docx","D:/javatest/aspose测试删除图片.docx",pmap);replace("D:/javatest/aspose测试删除图片.docx","D:/javatest/aspose测试删除图片2.docx",pmap);}catch (Exception e){e.printStackTrace();}}public static boolean replace(String path, String outPath, Map<String,String> paramMap){if(path == null || path.isEmpty()) return false;if(outPath == null || outPath.isEmpty()) return false;if(paramMap == null || paramMap.isEmpty()) return false;try {Document doc = new Document(path);Iterator<String> paramKey = paramMap.keySet().iterator();while(paramKey.hasNext()){String key = paramKey.next();String v = paramMap.get(key);if(v.startsWith("$pic:")){v = v.substring(5);//如果key已经被替换成图片了,那就要将图片替换成新的图片,相当于重新插入图片NodeCollection shapeCollection = doc.getChildNodes(NodeType.SHAPE, true);Iterator<Shape>  shapeIterate =  shapeCollection.iterator();java.util.List<Shape> shaplist = new ArrayList<Shape>();while(shapeIterate.hasNext()){Shape shape = shapeIterate.next();if(key.equals(shape.getName())){shaplist.add(shape);}}DocumentBuilder builder = new DocumentBuilder(doc);for(int i=0;i<shaplist.size();i++){Shape shape = shaplist.get(i);//将光标移动到指定节点builder.moveTo(shape);Shape img = builder.insertImage(v);img.setName(key);System.out.println("replace" +key);shape.remove();}//替换文字为图片doc.getRange().replace(key, "", new FindReplaceOptions(new ReplaceAndInsertImage(v,key)));}else{doc.getRange().replace(key,v);}}doc.save(outPath);}catch (Exception e){e.printStackTrace();return false;}return true;}
}class ReplaceAndInsertImage implements IReplacingCallback {private String url;private String name;public ReplaceAndInsertImage(String url,String name){this.url = url;this.name = name;}@Overridepublic int replacing(ReplacingArgs e) throws Exception {//获取当前节点Node currentNode = e.getMatchNode();//节点拆分处理当前匹配字段splitRun(currentNode,e.getMatchOffset());//获取当前文档Document document =  (Document) currentNode.getDocument();DocumentBuilder builder = new DocumentBuilder(document);//将光标移动到指定节点builder.moveTo(currentNode);//插入图片Shape img = builder.insertImage(url);img.setName(name);return ReplaceAction.SKIP;}private void splitRun(Node currentNode ,int position){String text =  currentNode.getText();Node newNode = currentNode.deepClone(true);if(text.length() >= position+this.name.length()){((Run)currentNode).setText (text.substring(position+this.name.length()));}else{int morlength = position+this.name.length() - text.length();((Run)currentNode).setText ("");Node tmpnode = currentNode;for(int i=0;i<this.name.length();i++){System.out.println(i);tmpnode = tmpnode.getNextSibling();String tmptext= tmpnode.getText();System.out.println(tmptext);System.out.println(morlength);System.out.println("--------"+(tmptext.length() >= morlength));if(tmptext.length() >= morlength){((Run)tmpnode).setText(tmptext.substring(morlength));break;}else{morlength = morlength - tmptext.length();((Run)tmpnode).setText("");}}}if(position>0){((Run)newNode).setText(text.substring(0, position));currentNode.getParentNode().insertBefore(newNode, currentNode);}}
}

20200813更新:原方法处理doc时存在bug,替换占位符为图片后,图片不是在占位符所在的位置,而是在占位符所在的node的起始位置,增加splitRun方法分割node节点。

aspose.word 20 java 替换占位符为文字或图片相关推荐

  1. JAVA操作Word合并、替换占位符、Word插入富文本、生成水印

    pox.xml文件配置: <?xml version="1.0" encoding="UTF-8"?> 4.0.0 <groupId>c ...

  2. aspose word for Java 处理word 模板,替换字符串或图片

    20200806更新:此版本好像存在某些bug,复杂的doc替换图片后导致打开时弹出错误修复框.新版见:aspose word 20 java 替换占位符为文字或图片 找了很久Java处理word的方 ...

  3. JAVA字符串占位符替换

    JAVA字符串占位符替换 如果有字符串 "我是{0},我来自{1},今年{2}岁. 请问怎样用String的内置方法用替换掉字符串的占位符:比如"我是中国人,我来自北京,今年22岁 ...

  4. JAVA 字符串替换占位符

    JAVA 字符串替换占位符 1 MessageFormat.format() code public static void main(String[] args) {String a= " ...

  5. Mybatis日志参数快速替换占位符工具

    Mybatis log printf工具网页地址: http://www.feedme.ltd/log.html Mybatis执行的sql的打印格式为: 2020-08-04 09:16:44 -D ...

  6. aspose Word for java 表格中插入斜下框线、斜上框线

    aspose Word for java 表格中插入斜下框线.斜上框线 //添加斜线 //拿到表格 Table table = (Table) allTables.get(3); //获取具体的表格中 ...

  7. java微信公众号自动回复文字加图片

    java微信公众号自动回复文字加图片 开发流程 详细流程,附上代码: 第一步服务器(url)接口配置 服务器(url)接口配置,此步骤就是微信授权接口的过程,如果域名都不改变,微信只会校验一次.此请求 ...

  8. 使用aspose.word.for.java解析word文档图片并替换

    /** *需要import的包有如下 *import com.aspose.words.Document; *import com.aspose.words.DocumentBuilder; *imp ...

  9. java将占位符替换成指定字符串的函数

    提供一个可以将占位符替换成指定字符串的函数 /*** 将message中的占位符按照从左到右的顺序替换成制定的字符串.* 如:info("你好,我是{},我{}岁了", " ...

最新文章

  1. OpenCV代码提取:cvtColor函数的实现
  2. python字典用法(创建、添加、删除(del()、clear()、pop()、popitem())、修改、查找(get()、keys()、values()、items())、更新update、遍历)
  3. 水准网测量平差matlab_【干货】史诗级测量大神分享道路测量全过程经验
  4. python信息管理系统统计功能_用Python实现职工信息管理系统
  5. rabitMQ-centos7安装
  6. Linux下程序的保护机制(checksec)
  7. python课堂整理9---函数1
  8. winform进度条实现
  9. 资产管理日志分类参考截图
  10. 解决PopupWindow的阴影覆盖问题
  11. 中文NER碎碎念—聊聊词汇增强与实体嵌套
  12. 计算机仿真塞曼效应实验报告,实验报告模板
  13. 基于 Mybatis 和 Springboot 的后台管理系统 BootDo | 软件推介
  14. 使用命令行把debian变成实时系统
  15. java基础巩固-宇宙第一AiYWM:为了维持生计,JVM_Part4~(4种垃圾收集算法(标清、标整、复制、分代)、判断是否是垃圾(引用计数、根可达算法))、四种引用类型、整起
  16. 7z linux压缩命令行,压缩解压.7z格式文件示例——Linux命令行方式
  17. 5年后、10年后,你希望自己是个什么样的人?
  18. Android Gmail 邮件签名客制化需求
  19. POCO C++库学习和分析 -- 序
  20. LRM-00101: unknown parameter name 'location' LRM-00101: unknown parameter name 'valid_for' 粗心引起问题一例

热门文章

  1. 线性代数 21 相似矩阵
  2. LTE issue 0
  3. 螺杆机过热保护php,螺杆式空压机出现过热现象的三大因素
  4. 朱啸虎:创业公司不要一开始就想着教育市场
  5. 【无标题】洛必塔法则的使用条件
  6. photoshop-v.1.0.1源码分析第三篇–FilterInterface.p
  7. 使用cv2.fisheye.calibrate标定时出现的错误:(-215:Assertion failed)
  8. POJ1029 题解
  9. 已经安装了PCV但pycharm还是报错:no model named PCV
  10. PCB的铺地以及电源回路问题