feiyu02
2022-07-04 c93ad66797e4830ccf4de81c1e8787ab90b22791
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
package cn.flightfeather.supervision.common.pdf
 
import org.apache.poi.util.Units
import org.apache.poi.xwpf.usermodel.XWPFDocument
import org.apache.poi.xwpf.usermodel.XWPFParagraph
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
 
 
object PdfUtil {
 
    fun generateContract(dynamicParam: DynamicParam): String {
        val src = dynamicParam.templatePath+dynamicParam.templateName
        val out = dynamicParam.outPath + dynamicParam.outName
 
        val inputStream = FileInputStream(File(src))
        val xwpfDocument = XWPFDocument(inputStream)
 
        replace(xwpfDocument, dynamicParam.param)
 
        output(xwpfDocument, out)
 
        return out
    }
 
    /**
     * 替换段落中指定的文本
     */
    fun replace(doc:XWPFDocument, params:Map<String, Any>) {
        try {
            setContent(doc.paragraphs, params)
 
            for (tab in doc.tables) {
                for (row in tab.rows) {
                    for (cell in row.tableCells) {
                        //注意,getParagraphs一定不能漏掉
                        //因为一个表格里面可能会有多个需要替换的文字
                        //如果没有这个步骤那么文字会替换不了
                        setContent(cell.paragraphs, params)
                    }
                }
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
 
    private fun setContent(paragraphs: List<XWPFParagraph>, params: Map<String, Any>) {
        for (p in paragraphs) {
            for (r in p.runs) {
                //需要替换的文本
                val text = r.getText(0)
                //替换指定的文本
                for (key in params.keys) {
                    if (text != null && text == key) {
                        //替换的时候要注意,setText是有两个参数的
                        //第一个是替换的文本,第二个是从哪里开始替换
                        //0是替换全部,如果不设置那么默认就是从原文字
                        //结尾开始追加
                        val v = params[key]
                        when (v) {
                            is String -> r.setText(v, 0)
                            is File -> {
                                val input = FileInputStream(v)
                                val pic = r.addPicture(input, XWPFDocument.PICTURE_TYPE_JPEG, v.name, Units.toEMU(40.0), Units.toEMU(40.0))
 
                                input.close()
                            }
                        }
                    }
                }
            }
        }
    }
 
    fun output(doc: XWPFDocument, outSrc: String) {
        doc.write(FileOutputStream(outSrc))
        doc.close()
    }
}