读取docdocx中文字图片表格

目的

无模板 读取word中有图片、复杂表格、文字、目录、公式、word作图等

参考链接

poiApi
poi官方操作样例

项目难点

读取过度读取格式或过少读取带有特殊格式的word文字

图一
有很多很多代表具体格式的小方格

表格中的换行不能正确处理

表格中的换行会被真实转为为txt文档中的换行(见图一)

猜测阅读源码并有一定理解之后可以自己进行换行的转换

word中的画图、公式不能正确处理

word中的所有格式包括页眉页脚中的图片以及公式会被自动储存为图片
图片位置以及画图

正确识别图片位置:先转化为docx,之后参考https://www.cnblogs.com/ct-csu/p/8178932.html
word中的画图表示 参考https://blog.csdn.net/weixin_44396516/article/details/96836400
word中画图表示思路: 将doc转换为docx 将docx使用openoffice/iText转换为pdf,使用pdfbox转换为图片

公式

word中公式https://blog.csdn.net/qq_18219457/article/details/98963136
word doc直接转化的话包括目录在内的部分有格式文字被解析为乱码,因此使用docx poi直接将公式转换为图片,但是因此图片的位置、名称不确定(公式下并不会标注 图片+数字+图片名称)

尝试过的poi中方法不适用在这里插入图片描述

不能正确解析

不能正确处理页眉页脚中的图片和背景图片

全部储存为图片导致图片位置不确定

不能解决中间的转换,最后变为txt文档

我们知道续中间的部分是为了美观进行分割,但是只能死板读取。

解决方法一

1.尝试所有能找得到的poi方法,阅读源码

暂时没有成功

2.将doc转换为docx进行处理 遇到目录的时候进行替换

参考博客:https://my.oschina.net/u/3410302/blog/3048367
核心代码

CTSimpleField ctSimpleField = paragraph.getCTP().addNewFldSimple();
ctSimpleField.setInstr(fieldName);
ctSimpleField.setDirty(STOnOff.TRUE);

放弃
直接将doc转换为docx成功

Java可以使用Apache POI库来读取docdocx格式的Word文档,并且可以处理表格的合并单元格。 以下是一个读取Word表格的示例代码: ```java import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.xwpf.usermodel.*; import org.apache.poi.hwpf.usermodel.TableIterator; public class ReadWordTable { public static void main(String[] args) throws IOException, InvalidFormatException { InputStream inputStream = new FileInputStream("test.docx"); XWPFDocument document = new XWPFDocument(inputStream); // 获取文档所有表格 for (XWPFTable table : document.getTables()) { for (XWPFTableRow row : table.getRows()) { for (XWPFTableCell cell : row.getTableCells()) { // 获取单元格内容 String content = cell.getText(); System.out.print(content + "\t"); } System.out.println(); } } document.close(); } } ``` 如果要处理合并单元格,可以使用`getCTTc()`方法获取单元格的`CTTc`对象,然后判断该单元格是否被合并。以下是一个判断是否合并单元格的示例代码: ```java import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.xwpf.usermodel.*; import org.apache.poi.hwpf.usermodel.TableIterator; public class ReadWordTable { public static void main(String[] args) throws IOException, InvalidFormatException { InputStream inputStream = new FileInputStream("test.docx"); XWPFDocument document = new XWPFDocument(inputStream); for (XWPFTable table : document.getTables()) { for (XWPFTableRow row : table.getRows()) { for (XWPFTableCell cell : row.getTableCells()) { // 获取单元格内容 String content = cell.getText(); // 判断单元格是否被合并 boolean isMerged = false; CTTc cttc = cell.getCTTc(); if (cttc != null) { CTTcPr cttcPr = cttc.getTcPr(); if (cttcPr != null) { CTVMerge merge = cttcPr.getVMerge(); if (merge != null && merge.getVal() != null && merge.getVal().equals(STMerge.CONTINUE)) { isMerged = true; } } } if (isMerged) { System.out.print("[Merged]\t"); } else { System.out.print(content + "\t"); } } System.out.println(); } } document.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值