0

我想从 PDF 文件中提取表格数据,我正在使用 Itext,但我不知道如何搜索 dablur 数据,(拆分)任何人都可以给出与搜索表格内容相关的想法。这里的数据是无序格式,如何将该数据转换为可理解的格式。提前致谢。

4

1 回答 1

0

获取页面内容并扫描 MoveTo(x,y) ( tm) 和 text ( tj) 命令。此外,字体更改 ( tf),例如将单词标记为粗体,可能会拆分文本。

        final String NUM = "\\d*\\.?\\d+";
        Pattern tj = Pattern.compile(".*\\((.*)\\) Tj");
        Pattern tm = Pattern.compile("\\d+ \\d+ \\d+ \\d+ ("
            + NUM + ") (" + NUM + ") Tm");
        Pattern tf = Pattern.compile("/(F\\d+) (" + NUM + ") Tf");

        byte[] pageContent = pdfReader.getPageContent(pageno);
        String pc = new String(pageContent, "Cp1252");
        try (BufferedReader pin = new BufferedReader(new StringReader(pc))) {
            for (;;) {
                String cline = pin.readLine();
                if (cline == null) {
                    break;
                }
                Matcher m = tm.matcher(cline);
                if (m.matches()) {

请注意,小数部分 (.123) 可能并不总是存在,因此简单Double.parseDouble(m.group(1))是不够的。


这是如何工作的

在上面的“页面内容”中,您会看到创建页面的 PostScript 命令行:选择一种字体,移动到 (x, y),打印一些字符。

顺便说一句:这些命令采用所谓的后缀表示法:100.0 200.0 Tm(move-to x: 100, y: 200)。首先是参数,然后是命令。对于一个堆栈机处理所有。因此得名“PostScript”。

如果你得到两个具有相同 y 的移动到命令,那么你就在同一行。要么选择了另一种字体,例如一个单词被加粗,要么你在一个表格中。

您可以想象,分析 PDF 是一项有趣的编程工作。我已经羡慕你了。


爪哇 7:

    try (BufferedReader pin = new BufferedReader(new StringReader(pc))) {
        ...
    }

爪哇 6:

    BufferedReader pin = new BufferedReader(new StringReader(pc));
    try {
        ...
    } finally {
       pin.close();
    }
于 2013-09-02T13:40:37.080 回答