PDFBox提取段落

时间:2012-02-26 07:25:15

标签: pdfbox

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

6 个答案:

答案 0 :(得分:15)

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

假设你有一个段落:

  

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

粗略地说,在PDF文件中,它将在某个位置表示为字符Ne表示正确,qu,{{ 1}}更多在右边,等等。

PDFBox尝试猜测字符如何制作单词,行和段落。因此,它会在大致相同的垂直位置寻找很多字符,对于彼此接近且类似的字符组,尝试找到你需要的东西。它通过从整个页面中提取文本然后逐个字符地处理它来创建文本(它也可以尝试从页面内的一个矩形区域中提取文本)来实现。查看相应的课程PDFTextStripper(或PDFTextStripperByArea)。有关用法,请参阅PDFBox源中的e

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

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

答案 1 :(得分:2)

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

肯定有效

答案 2 :(得分:1)

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

  1. 找到'。'的最后一个索引。 (期间)在行。
  2. 将此索引与输入行的长度进行比较。
  3. 如果索引较小,则表示这不是上一段的结尾。
  4. 如果是,则表示前一段落已结束,下一行将是新段落的开头。
  5. 希望这有帮助。

答案 3 :(得分:0)

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

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

  2. 。,?,!,“带有这些字符的结尾行可能是段落的结尾。并非总是如此。

  3. 如果以编程方式确定了段落,则对其进行测试以获得偶数引号。这可能是简单的双引号或Unicode双开关引用。

答案 4 :(得分:0)

Try this:

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());
    }

答案 5 :(得分:0)

您可以首先使用pdfbox getText函数获取文本。每行以“ \ n”结尾;因此,您无法使用“ \ n”对段落进行简单分割。如果一行满足以下条件:

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

然后此行是其段落的最后一行。这里32是unicode值。