3

Tabula 看起来像是从 PDF 中提取表格数据的好工具。有很多关于如何从命令行调用它或在 Python 中使用它的示例,但似乎没有任何用于在 Java 中使用的文档。有没有人有一个有效的例子?

请注意,tabula 确实提供了源代码,但版本之间似乎很混淆。例如,GitHub 上的示例引用了 JAR 中似乎不存在的 TableExtractor 类。

https://github.com/tabulapdf/tabula-java

4

2 回答 2

7

您可以使用以下代码从 java 中调用 tabula,希望对您有所帮助

  public static void main(String[] args) throws IOException {
    final String FILENAME="../test.pdf";

    PDDocument pd = PDDocument.load(new File(FILENAME));

    int totalPages = pd.getNumberOfPages();
    System.out.println("Total Pages in Document: "+totalPages);

    ObjectExtractor oe = new ObjectExtractor(pd);
    SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm();
    Page page = oe.extract(1);

    // extract text from the table after detecting
    List<Table> table = sea.extract(page);
    for(Table tables: table) {
        List<List<RectangularTextContainer>> rows = tables.getRows();

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

            List<RectangularTextContainer> cells = rows.get(i);

            for(int j=0; j<cells.size(); j++) {
                System.out.print(cells.get(j).getText()+"|");
            }

           // System.out.println();
        }
    }

}
于 2020-06-24T16:46:05.290 回答
0
// ****** Extract text from the table after detecting & TRANSFER TO XLSX *****
    XSSFWorkbook wb = new XSSFWorkbook();
    Sheet sheet = wb.createSheet("Barang Baik");
    List<Table> table = sea.extract(page);
    for (Table t : table) {
        int rowNumber = 0;
        try {
            while (sheet.getRow(rowNumber).getCell(0) != null) {
                rowNumber++;
            }
        } catch (Exception e) { }

        List<List<RectangularTextContainer>> rows = t.getRows();
        for (int i = 0; i < rows.size(); i++) {
            List<RectangularTextContainer> cells = rows.get(i);
            Row row = sheet.createRow(i+rowNumber);
            for (int j = 0; j < cells.size(); j++) {
                Cell cell = row.createCell(j);
                String cellValue = cells.get(j).getText();
                cell.setCellValue(cellValue);
            }
        }
        FileOutputStream fos = new FileOutputStream("C:\\your\\file.xlsx");
        wb.write(fos);
        fos.close();
    }
于 2020-10-22T16:12:45.327 回答