}
2、处理图片和段落文字
1 package com.poi.test;
3 import java.io.ByteArrayOutputStream;
4 import java.io.File;
5 import java.io.FileInputStream;
7 import org.apache.poi.hwpf.HWPFDocument;
8 import org.apache.poi.hwpf.model.PicturesTable;
9 import org.apache.poi.hwpf.usermodel.CharacterRun;
10 import org.apache.poi.hwpf.usermodel.Paragraph;
11 import org.apache.poi.hwpf.usermodel.Picture;
12 import org.apache.poi.hwpf.usermodel.Range;
14 public class PoiForWord {
15 /**
16 * 使用HWPFDocument解析word文档
17 * wps按doc处理即可
18 */
19 public void parseDocByHWPFDocument(){
20 try(FileInputStream is = new FileInputStream(new File("c:\\a.wps"));HWPFDocument document = new HWPFDocument(is);){
21 ByteArrayOutputStream baos = new ByteArrayOutputStream();//字节流,用来存储图片
22 PicturesSource pictures = new PicturesSource(document);
23 PicturesTable pictureTable = document.getPicturesTable();
25 Range r = document.getRange();//区间
26 for(int i=0;i<r.numParagraphs();i++){
27 Paragraph p = r.getParagraph(i);//段落
28 int fontSize = p.getCharacterRun(0).getFontSize();//字号,字号和是否加粗可用来当做标题或者某一关键标识的判断
boolean isBold = p.getCharacterRun(0).isBold();//是否加粗
29 String paragraphText = p.text();//段落文本
31 //以下代码解析图片,这样获取的图片是在文档流中的,是和文本按顺序解析的,可以很好的解决图片定位问题
32 for(int j=0;j<p.numCharacterRuns();j++){
33 CharacterRun cr = p.getCharacterRun(j);//字符
34 if(pictureTable.hasPicture(cr)){
35 Picture picture = pictures.getFor(cr);
36 //如果是在页面显示图片,可转换为base64编码的图片
37 picture.writeImageContent(baos);//将图片写入字节流
38 // String base64Image = "<img src='data:image/png;base64,"+new BASE64Encoder().encode(baos.toByteArray())+"'/>";
39 }
40 }
41 }
42 }catch(Exception e){
43 e.printStackTrace();
44 }
45 }
3、处理表格
5 @Test
6 public void parseDocTableByHWPFDocument(){
7 try(FileInputStream is = new FileInputStream(new File("d:\\b.doc"));HWPFDocument document = new HWPFDocument(is);){
8 Range r = document.getRange();//区间
9 for(int i=0;i<r.numParagraphs();i++){
10 Paragraph p = r.getParagraph(i);//段落
11 String text = p.text();
13 if(text.indexOf("序号")!=-1){//解析表格需要从表格第一个单元格获取表格,另一种表格的方式是直接获取所有表格,但是无法判断表格在文档中的位置
14 Table table = r.getTable(p);
16 int numRows = table.numRows();//获取行数
18 for(int j=0;j<numRows;j++){
19 TableRow row = table.getRow(j);
20 int numCells = row.numCells();//当前行列数
21 for(int k=0;k<numCells;k++){
22 TableCell cell = row.getCell(k);
23 System.out.print(cell.text()+" @ ");
24 }
25 System.out.println();
26 }
27 }
28 }
29 }catch(Exception e){
30 e.printStackTrace();
31 }
字符"?"可通过字符串替换或截取来解决
另一种解析的方式,只支持解析文本内容,且无法获取字号和加粗等字体格式
1 WordExtractor extor = new WordExtractor(is);
2 String[] paragraphText = extor.getParagraphText();