目标:将word里的图片替换成文本

流程、思想:

读取出Word中的图片 - 存储读取到的图片(提供图片识别原) - 删除Word中的该图片 - 在Word中该图片位置插入替换文字 - 删除存储的图片

Maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- poi-实现word文件的读取和修改等操作 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.0</version>
</dependency>
<!-- 针对于2007版(.docx) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.0</version>
</dependency>
<!-- 针对于2003版(.doc) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.0.0</version>
</dependency>
<!-- poi-end -->

代码实现

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
public static void main(String[] args) throws Exception {
textReplacePhoto("D:\\Test\\原报格式样例3.docx",
"D:\\Test\\原报格式样例3-1.docx","D:/Test/img");
}

/**
* 将word里的图片全部替换成文本
* @param oldFileName 传入原文件的全路径(含文件名)
* @param newFileName 保存修改后文件的全路径(含文件名)
* @param picturePath 读取出来的图片保存路径
* @throws Exception
*/
public static void textReplacePhoto(String oldFileName, String newFileName,
String picturePath) throws Exception {
File newFile = new File(newFileName.replace(new File(newFileName).getName(),""));
//保存路径不存在,则创建
if (!newFile.exists()){
newFile.mkdirs();
}

if (oldFileName.endsWith(".docx")){ //.docx文件的处理方法
//为了确定图片集中的某一张图片
int imgNum=0;
//创建输入流
InputStream oldIs = new FileInputStream(oldFileName);
//创建输出流
OutputStream newOs = new FileOutputStream(newFileName);
//创建一个XWPFDocument
XWPFDocument docx = new XWPFDocument(oldIs);
//获取到该文档的所有段落集
List<XWPFParagraph> paras = docx.getParagraphs();
//获取到该文档的所有图片集
List<XWPFPictureData> pictures = docx.getAllPictures();

for (XWPFParagraph para:paras){
//段落中所有XWPFRun
List<XWPFRun> runList = para.getRuns();
for (int i=0;i<runList.size();i++) {
XWPFRun run=runList.get(i);
//判断该段落是否是图片
if (!run.getEmbeddedPictures().isEmpty()){
//存储读取到的图片,并获取图片全路径
String pictureName=savePictureDocx(pictures,picturePath,imgNum++);
//实际有图片才进行以下操作
if (pictureName!=null){
//删除图片
para.removeRun(i);
//插入文字
para.insertNewRun(i).setText("{{title}}");
//删除图片
deletePicture(pictureName);
}
}
}
}

docx.write(newOs);
docx.close();
oldIs.close();
newOs.flush();
newOs.close();
}
}

/**
* 存储读取到的图片 - docx
* @param pictures 图片集
* @param picturePath 图片保存路径
* @param imgNum 确定图片集中的某一张图片
* @return 图片全路径
* @throws IOException
*/
public static String savePictureDocx(List<XWPFPictureData> pictures,
String picturePath,int imgNum) throws IOException {

File pictureFile = new File(picturePath);
//保存路径不存在,则创建
if (!pictureFile.exists()){
pictureFile.mkdirs();
}

List<XWPFPictureData> pictures = para.getDocument().getAllPictures();
if (pictures.size()!=0){
XWPFPictureData picture = pictures.get(imgNum);
String rawName = picture.getFileName();
String fileExt = rawName.substring(rawName.lastIndexOf("."));
String newName = System.currentTimeMillis() +
UUID.randomUUID().toString() + fileExt;
String pictureName = picturePath + File.separator + newName;
FileOutputStream fos = new FileOutputStream(pictureName);
fos.write(picture.getData());

fos.flush();
fos.close();
return pictureName;
}
return null;
}

/**
* 删除临时存储的图片
* @param pictureName 图片全路径(含文件名)
* @return
*/
public static boolean deletePicture(String pictureName) {
File pictureFile = new File(pictureName);
// 目录此时为空,可以删除
return pictureFile.delete();
}