poi获取段落位置_java poi读取.doc和.docx文件时获取图片与段落的对应关系

.doc文件

代码中的WordParagraph类是自己创建的实体类,用于记录文本信息和图片

file_word对象为前台上传的MultipartFile对象.

// doc格式

List wordParagraphs=new ArrayList<>();

HWPFDocument doc = new HWPFDocument(file_word.getInputStream());

Range range = doc.getRange();

int numP = range.numParagraphs();

//StringBuffer ret = new StringBuffer();

for (int i = 0; i < numP; ++i) {

//从每一段落中获取文字

Paragraph p = range.getParagraph(i);

//ret.append(p.text());

WordParagraph wordParagraph=new WordParagraph(p.text(),i);

wordParagraph.init();

wordParagraphs.add(wordParagraph);

}

// List pictsList = new ArrayList();

// 得到文档的数据流

byte[] dataStream = doc.getDataStream();

int numChar = range.numCharacterRuns();

Integer paragraphOrder=0;

PicturesTable pTable = new PicturesTable(doc, dataStream, new byte[1024]);

for (int j = 0; j < numChar; ++j) {

CharacterRun cRun = range.getCharacterRun(j);

boolean has = pTable.hasPicture(cRun);

String[] temp_array=(cRun.toString()+" ").split("\r");

paragraphOrder=paragraphOrder+temp_array.length-1;

if (has) {

Picture picture = pTable.extractPicture(cRun, true);

if(paragraphOrder

wordParagraphs.get(paragraphOrder).addPictures(picture);

}

}

}

当前处理方式存在一些局限性

无法确定图片在段落的具体位置信息.(该问题可通过对文档流处理的优化解决)

如果一个段落有多个图片,可能只解析一个

.docx

网上对标签解析的方式,实测不可行.poi实际有提供获取的方法.

同样的,无法获取图片在段落的具体位置

.doc和.docx读取的图片类不是同一个,兼容的时候需要注意.

// docx格式

XWPFDocument document=new XWPFDocument(file_word.getInputStream());

List XWPFParagraphList=document.getParagraphs();

//List picList = document.getAllPictures();

for (int i = 0; i < XWPFParagraphList.size(); ++i) {

//从每一段落中获取文字

XWPFParagraph p = XWPFParagraphList.get(i);

WordParagraph wordParagraph=new WordParagraph(p.getParagraphText(),i);

List pictureList=readImageInfoInParagraph(p);

wordParagraph.setPictures(pictureList);

wordParagraph.init();

wordParagraphs.add(wordParagraph);

}

//获取某一个段落中的所有图片

public static List readImageInfoInParagraph(XWPFParagraph paragraph) {

List res=new ArrayList<>();

//段落中所有XWPFRun

List runList = paragraph.getRuns();

for (XWPFRun run : runList) {

List pictures=run.getEmbeddedPictures();

for(int i=0;i

res.add(pictures.get(i).getPictureData());

}

}

return res;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,针对您的问题,可以使用 Apache POI 库来读取 docdocx 文件内容和图片,然后使用正则表达式或其他方法来区分段落。 以下是使用 Apache POI读取 docdocx 文件内容和图片的示例代码: ```java import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.apache.poi.xwpf.usermodel.XWPFPictureData; import org.apache.poi.xwpf.usermodel.XWPFPicture; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; public class ReadDocx { public static void main(String[] args) throws IOException, InvalidFormatException { InputStream fis = new FileInputStream("example.docx"); XWPFDocument document = new XWPFDocument(OPCPackage.open(fis)); for (XWPFParagraph paragraph : document.getParagraphs()) { String text = paragraph.getText(); // 处理段落内容 System.out.println(text); // 处理段落中的图片 for (XWPFRun run : paragraph.getRuns()) { for (XWPFPicture picture : run.getEmbeddedPictures()) { XWPFPictureData pictureData = picture.getPictureData(); String fileName = pictureData.getFileName(); byte[] data = pictureData.getData(); // 处理图片数据 } } } document.close(); } } ``` 在上述代码中,我们使用 `XWPFDocument` 类来读取 docx 文件,使用 `getParagraphs()` 方法来获取文件中的所有段落,然后使用 `getText()` 方法来获取段落的内容。如果需要处理段落中的图片,可以使用 `getRuns()` 方法获取段落中的所有 `XWPFRun` 对象,然后使用 `getEmbeddedPictures()` 方法获取 `XWPFPicture` 对象列表,进而获取图片数据。 需要注意的是,该方法只适用于读取 docx 文件,如果需要读取 doc 文件,则需要使用 HSSF 或 HWPF 类库。另外,针对段落的区分,可以使用正则表达式匹配段落的结尾符号,如 `\r\n` 或 `\n\n` 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值