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

有帮助吗?

解决方案

PDF 文档中的文本是绝对定位的。所以而不是 , 线段落,只有绝对定位 人物.

假设你有一个段落:

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

粗略地说,在PDF文件中它将被表示为字符 N 在某个位置上, e 有点正确, q, u, e 更多向右等等

PDFBox 尝试 猜测 角色如何组成单词、线条和段落。因此,它将在大约相同的垂直位置查找大量字符,查找彼此靠近且相似的字符组,以尝试找到您需要的内容。它通过从整个页面中提取文本,然后逐个字符地处理它来创建文本(它也可以尝试从页面内的一个矩形区域中提取文本)来实现这一点。查看相应的班级 PDF文本剥离器 (或者 PDFTextStripper按区域)。使用方法请参见 ExtractText.java 在 PDFBox 源中。

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

你什么 要做的就是从整个页面中提取文本,然后尝试通过搜索该文本找到您的段落。 常用表达 通常非常适合此类任务(在 Java 中可以通过 图案匹配器 类或便利方法 细绳 班级)。

其他提示

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

guys请尝试上面的代码。这适用于PDFbox-2.0.8 jar

我使用使用以下方法检测了段落的开始。按行读取页面行。每行: -

  1. 找到'。'的最后一个索引(期间)在线。
  2. 将此索引与输入线的长度进行比较。
  3. 如果索引较少,那么这意味着这不是前一段的结束。
  4. 如果是这样,它表示前一段已经结束,下一行将是新段落的开头。

    希望这有帮助。

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

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

  2. 。,?,!,“,”与这些字符的结束行可能是段落的结尾。不总是。

  3. 如果确定了一个段落,则测试它甚至是引号的偶数。这可能是简单的双重报价或Unicode双开和关闭报价。

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

您可以首先使用pdfbox gettext函数来获取文本。每条线都以“\ n”结尾;所以你不能用“\ n”分割段落。如果一行习惯以下条件:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top