PDFBox 提取段落

问题描述 投票:0回答:6

我是pdfbox新手,我想提取与某些特定单词匹配的段落,并且我能够将整个pdf提取到文本(记事本),但我不知道如何将特定段落提取到我的java程序中。任何人都可以帮助我至少一些教程或示例吗?非常感谢

pdfbox
6个回答
16
投票

PDF 文档中的文本是绝对定位的。因此,只有绝对定位的字符,而不是单词段落

假设您有一个段落:

Neque porro quisquam est qui dolorem ipsum quia dolor sat amet,consectetur,adipisci velit

粗略地说,在 PDF 文件中,它会在某个位置表示为字符

N
、稍微靠右一点的
e
q
u
、更靠右的
e
等等

PDFBox 尝试猜测字符如何组成单词、线条和段落。因此,它将在大约相同的垂直位置查找大量字符,查找彼此靠近且相似的字符组,以尝试找到您需要的内容。它通过从整个页面中提取文本,然后逐个字符地处理它来创建文本(它也可以尝试从页面内的一个矩形区域中提取文本)来实现这一点。请参阅相应的类 PDFTextStripper (或 PDFTextStripperByArea)。有关用法,请参阅 PDFBox 源代码中的

ExtractText.java

这意味着您无法使用 PDFBox 轻松提取段落。这也意味着 PDFBox 在提取文本时可能并且有时会丢失(有很多非常不同的 PDF 文档)。

可以做的是从整个页面中提取文本,然后尝试通过搜索该文本找到您的段落。 正则表达式通常非常适合此类任务(在 Java 中可以通过 PatternMatcher 类,或 String 类上的便捷方法来使用)。


3
投票
public static void main(String[] args) throws InvalidPasswordException, IOException {
    File file = new File("File Path");
    PDDocument document = PDDocument.load(file);        
    PDFTextStripper pdfStripper = new PDFTextStripper();
    pdfStripper.setParagraphStart("/t");
    pdfStripper.setSortByPosition(true);
    
    
    for (String line: pdfStripper.getText(document).split(pdfStripper.getParagraphStart()))
        {
            System.out.println(line);
            System.out.println("********************************************************************");
        }
}

请大家尝试一下上面的代码。这对于 PDFBox-2.0.8 Jar 来说肯定有效


1
投票

我使用以下方法检测到了段落的开头。逐行阅读页面。对于每行:-

  1. 查找“.”的最后一个索引(句号)在行中。
  2. 将此索引与输入行的长度进行比较。
  3. 如果索引较小,则意味着这不是上一段的结尾。
  4. 如果是则表示上一段已经结束,下一行将是新段落的开始。

希望这有帮助。


0
投票

提取文本后,可以考虑以下几点以编程方式构建段落:

  1. 所有以小写字母开头的行都应与前一行连接。但以大写字母开头的行也可能需要与前一行连接。例如:用于引用的表达式。

  2. .,?,!," 包含这些字符的结束行可能是段落的结尾。并非总是如此。

  3. 如果以编程方式确定了一个段落,则测试它是否有偶数个引号。这可能是简单的双引号或 Unicode 双开双引号。


0
投票

您可以先使用pdfbox getText函数来获取文本。每行都以 ' 结尾 ';所以你不能简单地用“分割段落” ”。如果一行满足以下条件:

line.length() > 2 && (int)line.charAt(line.length()-2) == 32

那么这一行就是该段落的最后一行。这里 32 是 unicode 值。


0
投票
private static String getParagraphs(String filePath, int linecount) throws IOException {
    ParagraphDetector paragraphDetector = new ParagraphDetector();
    StringBuilder extracted = new StringBuilder();
    LineIterator it = IOUtils.lineIterator(new BufferedReader(new FileReader(filePath)));
    int i = 0;
    String line;
    for (int lineNumber = 0; it.hasNext(); lineNumber++) {
        line = (String) it.next();
        if (lineNumber == linecount) {
            for (int j = 0; it.hasNext(); j++) {
                extracted.append((String) it.next());
            }
        }
    }
    return paragraphDetector.SentenceSplitter(extracted.toString());
}
© www.soinside.com 2019 - 2024. All rights reserved.