6c
2023-11-16 a0e46f7f776b6c4526e9596fb0ee0ad51e8340cf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package com.product.print.util;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.deepoove.poi.data.TextRenderData;
import com.deepoove.poi.policy.AbstractRenderPolicy;
import com.deepoove.poi.render.RenderContext;
import com.deepoove.poi.xwpf.BodyContainer;
import com.deepoove.poi.xwpf.BodyContainerFactory;
import com.product.common.lang.StringUtils;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
 
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Base64;
import java.util.Optional;
 
/**
 * 自定义解析{{@var}}标签
 *
 * @Author cheng
 * @Date 2023/6/27 15:50
 * @Desc
 */
public class FlowOpinionRenderPolicy extends AbstractRenderPolicy<TextRenderData> {
    /**
     * 意见列表
     */
    private JSONArray opinionArray;
 
    public FlowOpinionRenderPolicy(JSONArray opinionArray) {
        this.opinionArray = opinionArray;
    }
 
 
    @Override
    public void doRender(RenderContext<TextRenderData> context) throws Exception {
        XWPFRun run = context.getRun();
        //标签名称
        String tagName = context.getEleTemplate().getTagName();
        JSONObject opinion=null;
        //支持多个标签名称,用|分隔 例如:{{@var1|var2|var3...}} 按照顺序查找意见列表
        for (String name : tagName.split("\\|")) {
            opinion = getOpinion(name);
            if(opinion!=null){
                break;
            }
        }
        if (opinion == null) {
            //如果意见列表中没有找到,则直接替换为空
            run.setText("", 0);
            return;
        }
        XWPFParagraph parent = (XWPFParagraph) run.getParent();
        XWPFRun newRun = run;
        //判断是否有签名
        if (!StringUtils.isEmpty(opinion.getString("sign_attachment_uuid"))) {
            XWPFParagraph paragraph = createParagraph(run);
            //设置签名的段落居右
            paragraph.setAlignment(ParagraphAlignment.RIGHT);
            //插入一个新的run
            newRun = paragraph.createRun();
            String signAttachmentBase64 = opinion.getString("sign_attachment_uuid");
            String[] split = signAttachmentBase64.split(",");
            //将base64转换字节流
            byte[] bytes = Base64.getDecoder().decode(split[split.length - 1]);
            //将字节流转为输入流
            InputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
            //插入图片
            newRun.addPicture(byteArrayInputStream, XWPFDocument.PICTURE_TYPE_PNG, "sign.png", Units.toEMU(50), Units.toEMU(20));
            byteArrayInputStream.close();
            newRun.setText("", 0);
        }
        XWPFParagraph paragraph = createParagraph(newRun);
        //段落样式与原始段落一致
        paragraph.getCTP().setPPr(parent.getCTP().getPPr());
        //设置创建新的run
        XWPFRun textRun = paragraph.createRun();
        //复制原始run
        PrintPoiUtil.copyRun(textRun, run);
        //设置run的内容
        textRun.setText(Optional.ofNullable(opinion.getString("opinion")).orElse("未填写办理意见"), 0);
        //删除段落parent,如果只删除run,则会导致段落中还有一个空的run
        parent.getCTP().newCursor().removeXml();
    }
 
    public XWPFParagraph createParagraph(XWPFRun run) {
        //获取body容器
        BodyContainer bodyContainer = BodyContainerFactory.getBodyContainer(run);
        //插入一个新的段落
        XWPFParagraph paragraph = bodyContainer.insertNewParagraph(run);
        return paragraph;
    }
 
    public JSONObject getOpinion(String tagName) {
        //先用tagName去意见列表中查找node_uuid是否存在,不存在则使用node_title去查找
        for (int i = 0; i < opinionArray.size(); i++) {
            JSONObject opinion = opinionArray.getJSONObject(i);
            if (tagName.equals(opinion.getString("node_uuid"))) {
                return opinion;
            }
        }
        for (int i = 0; i < opinionArray.size(); i++) {
            JSONObject opinion = opinionArray.getJSONObject(i);
            if (tagName.equals(opinion.getString("node_title"))) {
                return opinion;
            }
        }
        return null;
    }
}