aspose.word 20 java 替换占位符为文字或图片
以前写过用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 替换占位符为文字或图片相关推荐
- JAVA操作Word合并、替换占位符、Word插入富文本、生成水印
pox.xml文件配置: <?xml version="1.0" encoding="UTF-8"?> 4.0.0 <groupId>c ...
- aspose word for Java 处理word 模板,替换字符串或图片
20200806更新:此版本好像存在某些bug,复杂的doc替换图片后导致打开时弹出错误修复框.新版见:aspose word 20 java 替换占位符为文字或图片 找了很久Java处理word的方 ...
- JAVA字符串占位符替换
JAVA字符串占位符替换 如果有字符串 "我是{0},我来自{1},今年{2}岁. 请问怎样用String的内置方法用替换掉字符串的占位符:比如"我是中国人,我来自北京,今年22岁 ...
- JAVA 字符串替换占位符
JAVA 字符串替换占位符 1 MessageFormat.format() code public static void main(String[] args) {String a= " ...
- Mybatis日志参数快速替换占位符工具
Mybatis log printf工具网页地址: http://www.feedme.ltd/log.html Mybatis执行的sql的打印格式为: 2020-08-04 09:16:44 -D ...
- aspose Word for java 表格中插入斜下框线、斜上框线
aspose Word for java 表格中插入斜下框线.斜上框线 //添加斜线 //拿到表格 Table table = (Table) allTables.get(3); //获取具体的表格中 ...
- java微信公众号自动回复文字加图片
java微信公众号自动回复文字加图片 开发流程 详细流程,附上代码: 第一步服务器(url)接口配置 服务器(url)接口配置,此步骤就是微信授权接口的过程,如果域名都不改变,微信只会校验一次.此请求 ...
- 使用aspose.word.for.java解析word文档图片并替换
/** *需要import的包有如下 *import com.aspose.words.Document; *import com.aspose.words.DocumentBuilder; *imp ...
- java将占位符替换成指定字符串的函数
提供一个可以将占位符替换成指定字符串的函数 /*** 将message中的占位符按照从左到右的顺序替换成制定的字符串.* 如:info("你好,我是{},我{}岁了", " ...
最新文章
- OpenCV代码提取:cvtColor函数的实现
- python字典用法(创建、添加、删除(del()、clear()、pop()、popitem())、修改、查找(get()、keys()、values()、items())、更新update、遍历)
- 水准网测量平差matlab_【干货】史诗级测量大神分享道路测量全过程经验
- python信息管理系统统计功能_用Python实现职工信息管理系统
- rabitMQ-centos7安装
- Linux下程序的保护机制(checksec)
- python课堂整理9---函数1
- winform进度条实现
- 资产管理日志分类参考截图
- 解决PopupWindow的阴影覆盖问题
- 中文NER碎碎念—聊聊词汇增强与实体嵌套
- 计算机仿真塞曼效应实验报告,实验报告模板
- 基于 Mybatis 和 Springboot 的后台管理系统 BootDo | 软件推介
- 使用命令行把debian变成实时系统
- java基础巩固-宇宙第一AiYWM:为了维持生计,JVM_Part4~(4种垃圾收集算法(标清、标整、复制、分代)、判断是否是垃圾(引用计数、根可达算法))、四种引用类型、整起
- 7z linux压缩命令行,压缩解压.7z格式文件示例——Linux命令行方式
- 5年后、10年后,你希望自己是个什么样的人?
- Android Gmail 邮件签名客制化需求
- POCO C++库学习和分析 -- 序
- LRM-00101: unknown parameter name 'location' LRM-00101: unknown parameter name 'valid_for' 粗心引起问题一例
热门文章
- 线性代数 21 相似矩阵
- LTE issue 0
- 螺杆机过热保护php,螺杆式空压机出现过热现象的三大因素
- 朱啸虎:创业公司不要一开始就想着教育市场
- 【无标题】洛必塔法则的使用条件
- photoshop-v.1.0.1源码分析第三篇–FilterInterface.p
- 使用cv2.fisheye.calibrate标定时出现的错误:(-215:Assertion failed)
- POJ1029 题解
- 已经安装了PCV但pycharm还是报错:no model named PCV
- PCB的铺地以及电源回路问题