如何解析java中的pdf文件并将一些数据保存在mysql数据库中

时间:2017-05-19 06:26:18

标签: java itext

我想在java中解析pdf文件并从中提取一些事务数据。我用iText来阅读pdf。它将整个pdf作为字符串返回。我无法提取数据。处理这个问题的更好方法是什么?

以下是解析我的pdf文件后得到的内容,该文件是字符串格式,我需要过滤事务数据,以便我可以将其插入数据库。

日期交易金额单位价格单位 (INR)(INR)余额 Birla Sun Li [e共同基金 对开编号:1016409683 PAN:AZMPB2802L KYC:OK PAN:好的 B291GZ-Birla Sun Life印度GenNext基金 - 增长直接计划(顾问:DIRECT)注册商:CAMS  期初余额:0.000 2014年3月12日购买5,000.00 146.113 34.22 146.113 2014年4月22日购买 - 通过互联网1,500.00 41.993 35.72 188.106 05-May-2014购买 - 通过互联网1,500.00 42.505 35.29 230.611 2015年1月13日购买 - 通过互联网1,500.00 28.604 52.44 259.215 2015年2月3日购买 - 通过互联网3,000.00 54.835 54.71 314.050 03-Mar-2015购买 - 通过互联网3,000.00 53.476 56.10 367.5260

2016年3月10日的估值:58,956.90卢比 结算单位余额:2016年3月10日1,143.462净资产值:51.56卢比

2 个答案:

答案 0 :(得分:1)

根据您所处的具体情况,您可以尝试各种方法。

  • iText有一个名为pdf2Data的工具,听起来就像你正在寻找的那样。它根据模板处理文档,并为您提供xml文档。这当然更适合商业环境。

  • 您可以编写自己的提取策略,以更聪明的方式处理pdf文档。例如,假设您要从pdf文档中的表中提取信息。

    你将实现IEventListener,并监听两种事件;线条绘制事件(以便在绘制表格时得到通知)和文本呈现事件(以获取表格中的内容)。

    然后,您必须编写几个智能启发式方法来定义构成表的内容。对于简单的概念验证,您可以简单地查找以90度角交叉的线条。确定边界框。然后去查找该框中的所有文本呈现指令。使用另一种能够确定列和行边界的聪明启发式算法。

答案 1 :(得分:0)

实际上你真正需要的是一个字符串,你正在寻找的程序称为解析。一旦你得到包含整个pdf的String,你需要编写一些“智能”(说聪明,因为它取决于你的pdf的内容)代码,它可以将主String拆分成更小,更有用(适合你)的部分。 / p>

之后,您需要使用Java应用程序与数据库建立连接,并提供必要的数据库代码,该代码将使用您使用解析器创建的较小的String部分来填充表。

Bellow,你可以看到我为一个作业编写的一些代码,需要从一个流中解析一个较大的String对象的有用部分(在这种情况下是一个包​​含篮球游戏统计数据的.txt)。

public static ArrayList<HashMap<String, String>> parse (InputStream input) throws IOException {

        output = new ArrayList();
        count = 0;
        atcount = 0;

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
            if (input != null) {
                while ((line = reader.readLine()) != null) {                        
                    if (line.contains("Team")) {
                        playerBounds = false;
                        team2Bounds = true;
                        count = 0;
                    }   

                    if (playerBounds == true && team2Bounds == false) {                             
                        count++;
                        listΑ = line.split("\t");

                        addToList();
                        //printAll();
                    }

                    if ((playerBounds == true) && (team2Bounds == true)) {  
                        count++;
                        listΑ = line.split("\t");

                        addToList();
                        //printAll();
                    }

                    if (line.contains("Player")) {                                  
                        playerBounds = true;
                    }
                    atcount = 0;
                }
            }
        } catch (IOException ex) {
            throw ex;
        } finally {
            try {
                input.close();
            } catch (Throwable ignore) {
            }
        }

        return output;
    }

我希望这可以帮助你:)