我使用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")
答案 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/
再次,同样的方法...