码迷,mamicode.com
首页 > Web开发 > 详细

aspose.word替换文字和图片及实现勾选效果等

时间:2021-03-31 12:09:50      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:apt   esc   parent   options   url   setname   art   keep   Servle   

1、引入依赖

<dependency>
   <groupId>com.aspose.words</groupId>
   <artifactId>aspose-words-18.8-jdk16-crack</artifactId>
   <version>18.8</version>
</dependency>

2、因为这个包下载不下来,在idea中Terminal运行引入本地仓库

  jar包地址

  因为我本地是无需安装的maven,进入本地mvn的bin目录下,运行语句

mvn install:install-file -Dfile=D:\workspace\aspose-words-18.8-jdk16-crack-18.8.jar -DgroupId=com.aspose.words -DartifactId=aspose-words-18.8-jdk16-crack -Dversion=18.8 -Dpackaging=jar

 3、文书制作方法

word上的占位符分为纯文字和域,占位符格式?key?

import com.aspose.words.*;//引用包

	/**
	 * 制作文书方法
	 * @param request
	 * @param inFilePath
	 * @param outFilePath
	 * @param datas
	 * @return
	 * @throws Exception
	 */
	public  Map<String, String> readwriteWord(HttpServletRequest request, String inFilePath, String outFilePath, Map<Object, Object> datas) throws Exception {
        Map<String, String> map = new HashMap<>();
        Document doc = null;
        for (int i = 0; i < 1; i++) {
            // 验证License
            if (!getLicense()) {
                continue;
            }
        }
        //定义文档接口
        doc = new Document(inFilePath);
		//处理列表数据
		Object object = datas.get("placeFileInfoList");
		List<Map> list = JSON.parseArray(String.valueOf(object), Map.class);
		if (list != null && list.size() > 0) {
			// 获取word中的第一个表格,index指定表格位置
			Table table = (Table) doc.getChild(NodeType.TABLE, 0, true);
			int rowNum = 1;
			for (Map map1 : list) { // 替换变量
				Node deepClone = table.getRows().get(rowNum).deepClone(true);
				Range range = table.getRows().get(rowNum).getRange();
				range.replace("?seq?", map1.get("seq") != null ? String.valueOf(map1.get("seq")) : "", true, false);
				range.replace("?itemName?", map1.get("itemName") != null ? String.valueOf(map1.get("itemName")) : "", true, false);
				range.replace("?number?", map1.get("number") != null ? String.valueOf(map1.get("number")) : "", true, false);
				range.replace("?remark?", map1.get("remark") != null ? String.valueOf(map1.get("remark")) : "", true, false);
				rowNum = rowNum + 1;
				table.getRows().insert(rowNum, deepClone);
			}
			table.getRows().get(rowNum).remove();
		}
		for (Map.Entry<Object, Object> entry : datas.entrySet()) { 
			String key = entry.getKey().toString();
			Object value;
            if ("placeFileInfoList".equals(key)) {
                value = null;
            } else {
                value = entry.getValue();
            }
			if (value != null) { 
				if("myPic".equals(key)){
          String imgPath = fileAPIUtils.downloadImg(datas.get(key)+"", datas.get("token")+"");//这里是自定义的下载功能,这里返回的是图片路径
                    doc.getRange().replace("?" + key + "?", "", new FindReplaceOptions(new ReplaceSignPhoto(imgPath, "?" + key + "?")));
                }else{
                    Pattern p = Pattern.compile("\n");
                    Matcher m = p.matcher(value.toString());
                    int i = 0;
                    String replaceValue = "";
                    Boolean flag = false;
                    while (m.find()) {
                        //换行处理
                        replaceValue = value.toString().replace(m.group(), "" + ControlChar.LINE_BREAK + "");
                        flag = true;
                    }
                    if (flag) {
                        // 要求替换的内容是完全匹配时的替换
                        doc.getRange().replace("?" + key + "?", replaceValue, true, false);
                    } else {
                        // 要求替换的内容是完全匹配时的替换
                        doc.getRange().replace("?" + key + "?", value.toString(), true, false);
                    }
                }
            }
        }
	//如果是写的占位符是文本域,可以实现
	Object object1 = datas.get("photoPath");
	List<Map> photoPath = JSON.parseArray(String.valueOf(object1), Map.class);
	if (CommonUtils.isNotEmpty(photoPath)) {
            Document fileDocs = null;
            int count = 0;
            for (String path : photoPath) {
                Document fileDoc = doc.deepClone();
                DocumentBuilder builder = new DocumentBuilder(fileDoc);
                builder.moveToMergeField("livePhotos");
                builder.insertImage(path, RelativeHorizontalPosition.MARGIN, 5, RelativeVerticalPosition.MARGIN, 15, 420, 300, WrapType.SQUARE);
                if(count==0){
                    fileDocs = fileDoc.deepClone();
                }else{
                    fileDocs.appendDocument(fileDoc, ImportFormatMode.KEEP_SOURCE_FORMATTING);
                }
                count++;
            }
            doc = fileDocs;
        }
        //生成四位随机数
        Random ne = new Random();
        int num = ne.nextInt(9999 - 1000 + 1) + 1000;
        String random = String.valueOf(num);
        String fileName = "" + System.currentTimeMillis() + random;
        //替换后的Word
        String docPath = outFilePath + fileName + inFilePath.substring(inFilePath.lastIndexOf("."));
        //生成的PDF位置
        String pdfPath = outFilePath + fileName + ".pdf";
        doc.save(docPath);
        File file = new File(docPath);
        if (file.exists()) {
            doc2pdf(docPath, pdfPath);
            map.put("pdfPath", pdfPath);
            map.put("docPath", docPath);
        }
        return map;
    }

 

package net.longjin.comm.utils;

import com.aspose.words.*;

/**
* @Description 签名照片处理
* @Author chenling
* @Date 2021/3/30
**/
public class ReplaceSignPhoto implements IReplacingCallback {

    private String url;
    private String name;

    public ReplaceSignPhoto(String url, String name){
        this.url = url;
        this.name = name;
    }

    @Override
    public 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);//shape可以设置图片的位置及属性
        //设置宽高
        img.setWidth(80);
        img.setHeight(30);
        img.setWrapType(WrapType.SQUARE);
        img.setDistanceLeft(10);
        img.setHorizontalAlignment(HorizontalAlignment.CENTER);
        img.setVerticalAlignment(VerticalAlignment.CENTER);
        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);
        }
    }
}

4、勾选框处理

默认都是□ 根据是或者否 将□ 替换成 ?

 

 

个人工作中用到的,如有更好的方式请留言,谢谢

aspose.word替换文字和图片及实现勾选效果等

标签:apt   esc   parent   options   url   setname   art   keep   Servle   

原文地址:https://www.cnblogs.com/instelly/p/14596976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!