【问题标题】:What is the proper way to get a string and int value of it when using itext for reading a PDF?使用 itext 阅读 PDF 时获取字符串和 int 值的正确方法是什么?
【发布时间】:2015-12-24 09:03:07
【问题描述】:

我正在尝试使用 Itext 读取 Java 中的 PDF 文件。在我的 PDF 文件中,我有一些计算结果。在一行中有一个元素和它的两个计算结果,它们不在一个表中。我的 PDF 文件如下所示:

  I. Result X                          12.551.734,75       9.284.925,26
    . A. Result Y                      8.583.482,18        416.187,03
       . 1. result z                   83.708,72           91.220,23
       . 3. result a                   8.499.773,46        324.966,80
     . B. Result B                     0,00                199.942,00
        . 4. result c                  0,00                199.942,00
      . C. Result D                    780.316,81          5.376.366,65
        . 1. result e                  66.041,73           3.962.399,52
        . 2. result f                  685.579,00          1.367.086,66

我要做的是解析字符串及其值。我找不到合适的方法,我尝试了下面的代码。但是这条逻辑的问题是:

. 1. result z 8.583.482,18 416.187,03

它只为字符串打印 ".",然后是 1第一个数字。我无法得到整个 "。1. result z" 部分作为字符串,然后是它的值,因为它在看到 int 值后直接打印并跳过休息。

int page = 1;
PdfReader reader = new PdfReader(pdf);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
strategy = parser.processContent(page, new LocationTextExtractionStrategy());
Scanner scanner = new Scanner(strategy.getResultantText());

...

for (int j = page; j <= reader.getNumberOfPages(); j++) {

            while (scanner.hasNextLine()) {
                String nextToken = scanner.nextLine();

                String rName = "";
                StringTokenizer tok = new StringTokenizer(nextToken);
                while (tok.hasMoreTokens()) {
                    String nToken = tok.nextToken();
                    try {
                        number = fmt.parse(nToken);
                        System.out.println(rName);
                        System.out.println(number);
                        while (tok.hasMoreTokens()) {
                            try {
                                nToken = tok.nextToken();
                                number = fmt.parse(nToken);
                                System.out.println(number);
                            } catch (ParseException e) {
                                if(rName.isEmpty()){
                                    rName = nToken;
                                }else{
                                    rName = rName + " " + nToken;
                                }
                            }
                        }
                        break;
                    } catch (ParseException e) {
                        if(rName.isEmpty()){
                            rName = nToken;
                        }else{
                            rName = rName + " " + nToken;
                        }
                    }                   
                }       
            }
            strategy = parser.processContent(++page, new LocationTextExtractionStrategy());
            scanner = new Scanner(strategy.getResultantText());
        }

如何正确获取这些字符串及其值,您能帮帮我吗?由于我认为这个解决方案不够好,还有其他有用的方法吗?

【问题讨论】:

    标签: java parsing pdf itext java.util.scanner


    【解决方案1】:

    感谢您提供的所有详细信息。通常,您会使用正则表达式来解析复杂的行。尽管有时程序化解析更容易理解。与其使用 StringTokenizer 来拆分行,不如尝试:

    String line = scanner.nextLine();
    
    String[] tokens = line.split("\\s+");
    String value1 = tokens[tokens.length-2];
    String value2 = tokens[tokens.length-1];
    
    String rowTitle = line.substring(0, line.indexOf(value1)).trim();
    
    System.out.print(rowTitle + "\t");
    System.out.print(value1 + "\t");
    System.out.println(value2);
    

    【讨论】:

    • 谢谢,这是一个非常简单的解决方案,它现在解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2014-03-18
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多