在特定行之后获取PDF文件的行

时间:2018-07-08 20:45:51

标签: java string file-io pdfbox text-processing

我使用Apache PDFBox来解析pdf文件中的文本。我试图在特定行之后得到一行。

PDDocument document = PDDocument.load(new File("my.pdf"));
if (!document.isEncrypted()) {
    PDFTextStripper stripper = new PDFTextStripper();
    String text = stripper.getText(document);
    System.out.println("Text from pdf:" + text);
} else{
    log.info("File is encrypted!");
}
document.close();

示例:

  

句子1,文件的第n行

     

需要的线

     

句子3,文件的第n + 2行

我试图从数组中的文件中获取所有行,但是它不稳定,因为无法过滤到特定文本。第二个解决方案中也存在问题,这就是为什么我正在寻找基于PDFBox的解决方案。 解决方案1:

String[] lines = myString.split(System.getProperty("line.separator"));

解决方案2:

String neededline = (String) FileUtils.readLines(file).get("n+2th")

1 个答案:

答案 0 :(得分:2)

实际上,PDFTextStripper类的source code使用与您完全相同的行结尾,因此您第一次尝试使用PDFBox尽可能正确。

您会看到,PDFTextStripper getText方法调用了writeText方法,该方法只是与writeString方法逐行写入输出缓冲区,其方式与您已经尝试过了。该方法返回的结果是buffer.toString()。

因此,对于格式正确的PDF,您似乎真正要问的问题是如何为特定文本过滤数组。这里有一些想法:

首先,您要像捕获的那样捕获数组中的行。

import java.io.File;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

public class Main {

    static String[] lines;

    public static void main(String[] args) throws Exception {
        PDDocument document = PDDocument.load(new File("my2.pdf"));
        PDFTextStripper stripper = new PDFTextStripper();
        String text = stripper.getText(document);
        lines = text.split(System.getProperty("line.separator"));
        document.close();
    }
}

这是一种通过任何行号索引获取完整String的方法,很容易:

// returns a full String line by number n
static String getLine(int n) {
    return lines[n];
}

这是一种线性搜索方法,它查找字符串匹配项并返回找到的第一行号。

// searches all lines for first line index containing `filter`
static int getLineNumberWithFilter(String filter) {
    int n = 0;
    for(String line : lines) {
        if(line.indexOf(filter) != -1) {
            return n;
        }
        n++;
    }
    return -1;
}

使用上面的方法,可能只获取匹配搜索的行号:

System.out.println(getLine(8)); // line 8 for example

或者,包含匹配搜索的整个String行:

System.out.println(lines[getLineNumberWithFilter("Cat dog mouse")]);

这一切看起来很简单,并且仅在假定行可以由行分隔符拆分成数组的情况下起作用。如果解决方案不如上述想法那么简单,我相信问题的根源可能不在您使用PDFBox的实现中,而是在您试图发短信的PDF源中

以下是指向教程的链接,该教程也可以完成您尝试做的事情:

https://www.tutorialkart.com/pdfbox/extract-text-line-by-line-from-pdf/

再次,同样的方法...