使用aspose-pdf识别pdf中的表格数据

一、引入依赖

<dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-pdf</artifactId>
            <version>21.11</version>
 </dependency>

如果不知道从哪下载,或者无法破解的请参考 Aspose for Java 去除水印和数量限制_aspose 去水印-CSDN博客

二、编写util类

public class AsposeUtil {
    private static final Logger log = LoggerFactory.getLogger(AsposeUtil.class);

    /**
     * 加载证书信息
     * @return
     */
    private static boolean judgeLicense() {
        boolean result = false;
        try {
            InputStream is = AsposeUtil.class.getClassLoader().getResourceAsStream("License.xml");
            License aposeLic = new License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception e) {
            log.error("Aspose License 文档转换失败!", e);
        }
        return result;
    }
    /**
     * 将PDF文件中的表格转换为基础数据。
     *
     * @param path PDF文件的路径。
     * @throws Exception 如果没有有效的许可证或转换过程中遇到错误,则抛出异常。
     */
    public static void pdfToData(String path) throws Exception {
        if (!judgeLicense()) {
            throw new Exception();
        }
        // 加载PDF文件
        Document pdfDocument = new Document(path);

        // 创建表格文本提取对象
        TextAbsorber textAbsorber = new TextAbsorber();
        // 创建表格文本提取对象
        TableAbsorber absorber = new TableAbsorber();
        // 设置提取选项,可选
        PageCollection pages = pdfDocument.getPages();
        int pagesCount = 10;// pages.size();
        for (int i = 1; i <= pagesCount; i++) {
            Page page = pages.get_Item(i);
            absorber.visit(page);
        }
        // 获取提取到的表格列表
        List<AbsorbedTable> tables = absorber.getTableList();
        // 遍历提取到的所有表格
        for (int i = 0; i < tables.size(); i++) {
            AbsorbedTable table = tables.get(i);
            List<AbsorbedRow> rowList = table.getRowList();
            // 遍历表格行
            for (AbsorbedRow row : rowList) {
                List<AbsorbedCell> cellList = row.getCellList();
                // 遍历表格行中的单元格
                for (AbsorbedCell cell : cellList) {
                    // 在提取的文本中根据单元格的位置提取相应的内容
                    TextFragmentCollection textFragments = cell.getTextFragments();
                    StringBuilder sb=new StringBuilder();
                    for (TextFragment textFragment:textFragments){
                        sb.append(textFragment.getText());
                    }
                    // 输出单元格文本
                    System.out.print(sb.toString() + "\t");
                }
                System.out.println();
            }
        }
    }
}

三、进行测试

public class OfficePdfTest {
    public static void main(String[] args) throws Exception {
        String path="D:\\temp\\1.pdf";
        AsposeUtil.pdfToData(path);
    }
}

注意:这种操作只能识别出pdf的表格未进行单元格合并的情况,如果pdf中的单元格进行了合并,则会导致数据混乱

 

请登录后发表评论

    没有回复内容