Tabula的使用

对于不会多复杂的表格数据,tabula基本能实现完美的数据转换,对于格式制作良好的pdf表格,tabula对单元格中的多行数据也能进行处理,但事无绝对,由于再封装特性是 自上而下自左而右的文本识别,依然还是会出现识别错位,那这样基本获取到字符串也很难获取有效信息了

所以推荐: 对于表制式的pdf识别 最好保证 数据足够简单(不要出现过多的一个单元格中就有三行及以上数据)。

开源地址:https://github.com/tabulapdf/tabula-java

可调用下列方法自己测试,得到的字符串将是由坐标加文本的 格式,可用gsonformat插件自动生成JavaBean类,再调用阿里巴巴的fastjsonAPI去转换。

依赖

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

technology.tabula

tabula

1.0.3

slf4j-simple

org.slf4j

 调用方法

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

//多表处理

Public static String pdfByTabulafor3(String pdfPath){

String[] args=newString[]{"-f=JSON","-p=all",pdfPath};

CommandLineParser parser=newDefaultParser();

CommandLine cmd=null;

StringBuilder stringBuilder=newStringBuilder();

List list=newArrayList<>();

try{

cmd = parser.parse(CommandLineApp.buildOptions(),args);

newCommandLineApp(stringBuilder,cmd).extractTables(cmd);

}catch(ParseExceptione){

e.printStackTrace();

System.out.println("文件解析失败,请校验是否为PDF格式文件");

}

String string=stringBuilder.toString();

String tabulaPdfString=string.replaceAll("\r","");

Return tabulaPdfString;

}

 转换

    1

    2

    3

//json对象转换

ListtabulaPdf2Lists=JSON.parseObject(tabulaPdfString,newTypeReference>(){

});

 JavaBean

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

   24

   25

   26

   27

   28

   29

   30

   31

   32

   33

   34

   35

   36

   37

   38

   39

   40

   41

   42

   43

   44

   45

   46

   47

   48

   49

   50

   51

   52

   53

   54

   55

   56

   57

   58

   59

   60

   61

   62

   63

   64

   65

   66

   67

   68

   69

   70

   71

   72

   73

   74

   75

   76

   77

   78

   79

   80

   81

   82

   83

   84

   85

   86

   87

   88

   89

   90

   91

   92

   93

   94

   95

   96

   97

   98

   99

  100

  101

  102

  103

  104

  105

  106

  107

  108

  109

  110

  111

  112

  113

  114

  115

  116

  117

  118

  119

  120

  121

  122

  123

  124

  125

  126

  127

  128

  129

  130

  131

  132

  133

  134

  135

  136

  137

  138

  139

  140

  141

  142

  143

  144

  145

  146

  147

  148

  149

  150

  151

  152

  153

  154

  155

  156

  157

import java.util.List;

 

public class TabulaPdf {

    private String extraction_method;

    private double top;

    private double left;

    private double width;

    private double height;

    private double right;

    private double bottom;

    private List> data;

 

    public String getExtraction_method() {

        return extraction_method;

    }

 

    public void setExtraction_method(String extraction_method) {

        this.extraction_method = extraction_method;

    }

 

    public double getTop() {

        return top;

    }

 

    public void setTop(double top) {

        this.top = top;

    }

 

    public double getLeft() {

        return left;

    }

 

    public void setLeft(double left) {

        this.left = left;

    }

 

    public double getWidth() {

        return width;

    }

 

    public void setWidth(double width) {

        this.width = width;

    }

 

    public double getHeight() {

        return height;

    }

 

    public void setHeight(double height) {

        this.height = height;

    }

 

    public double getRight() {

        return right;

    }

 

    public void setRight(double right) {

        this.right = right;

    }

 

    public double getBottom() {

        return bottom;

    }

 

    public void setBottom(double bottom) {

        this.bottom = bottom;

    }

 

    public List> getData() {

        return data;

    }

 

    public void setData(List> data) {

        this.data = data;

    }

 

    @Override

    public String toString() {

        return "TabulaPdf2{" +

                "extraction_method='" + extraction_method + '\'' +

                ", top=" + top +

                ", left=" + left +

                ", width=" + width +

                ", height=" + height +

                ", right=" + right +

                ", bottom=" + bottom +

                ", data=" + data +

                '}';

    }

 

    public static class DataBean {

        /**

         * top : 0

         * left : 0

         * width : 0

         * height : 0

         * text :

         */

 

        private int top;

        private int left;

        private int width;

        private int height;

        private String text;

 

        public int getTop() {

            return top;

        }

 

        public void setTop(int top) {

            this.top = top;

        }

 

        public int getLeft() {

            return left;

        }

 

        public void setLeft(int left) {

            this.left = left;

        }

 

        public int getWidth() {

            return width;

        }

 

        public void setWidth(int width) {

            this.width = width;

        }

 

        public int getHeight() {

            return height;

        }

 

        public void setHeight(int height) {

            this.height = height;

        }

 

        public String getText() {

            return text;

        }

 

        public void setText(String text) {

            this.text = text;

        }

 

        @Override

        public String toString() {

            return "DataBean{" +

                    "top=" + top +

                    ", left=" + left +

                    ", width=" + width +

                    ", height=" + height +

                    ", text='" + text + '\'' +

                    '}';

        }

    }

}

 对象结构可能不相同,自己去生成就好了。得到数据后,List接收多个表的结构数据,再用JDK1.8支持的StreamAPI去筛选过滤自己要点属性即可

你可能感兴趣的:(Tabula的使用)