PDFBox извлекает абзацы - PullRequest
       3

PDFBox извлекает абзацы

14 голосов
/ 26 февраля 2012

Я новичок в pdfbox и хочу извлечь абзац, который соответствует некоторым конкретным словам, и я могу извлечь весь pdf в текст (блокнот), но я понятия не имею, как извлечь конкретный абзац в мою java-программу.Может ли кто-нибудь помочь мне с этим, по крайней мере, несколько уроков или примеров. Большое вам спасибо

Ответы [ 6 ]

15 голосов
/ 27 февраля 2012

Текст в PDF документах абсолютно позиционирован. Таким образом, вместо слов , строк и абзацев , только один имеет абсолютно позиционированные символы .

Допустим, у вас есть параграф:

Neque Porro Quisquam Est Qui Dolorem Ipsum Quia Dolor Sit Amet, Concetetur, Adipisci Velit

Грубо говоря, в файле PDF он будет представлен в виде символов N в некоторой позиции, e немного справа от него, q, u, e больше вправо и т. Д.

PDFBox пытается угадать , как символы создают слова, строки и абзацы. Таким образом, он будет искать множество символов в примерно одинаковом вертикальном положении, для групп символов, которые находятся рядом друг с другом и похожи, чтобы попытаться найти то, что вам нужно. Это достигается путем извлечения текста со всей страницы и последующей обработки его символ за символом для создания текста (он также может попытаться извлечь текст только из одной прямоугольной области внутри страницы). См. Соответствующий класс PDFTextStripper (или PDFTextStripperByArea ). Об использовании см. ExtractText.java в источниках PDFBox.

Это означает, что вы не можете легко извлечь абзацы с помощью PDFBox. Это также означает, что PDFBox может и иногда будет отсутствовать при извлечении текста (существует множество очень разных PDF-документов).

Что вы можете сделать - это извлечь текст со всей страницы, а затем попытаться найти свой абзац, ищущий этот текст. Регулярные выражения обычно хорошо подходят для таких задач (доступны в Java через классы Pattern и Matcher или удобные методы в классе String ).

2 голосов
/ 26 января 2017
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 голос
/ 07 апреля 2013

Я обнаружил начало абзаца, используя следующий подход.Читайте страницу построчно.Для каждой строки: -

  1. Найти последний индекс '.'(точка) в строке.
  2. Сравните этот индекс с длиной строки ввода.
  3. Если индекс меньше, это означает, что это не конец предыдущего абзаца.это означает, что предыдущий абзац закончился, а следующая строка будет началом нового абзаца.
0 голосов
/ 13 июня 2019

Вы можете сначала использовать функцию getText pdfbox, чтобы получить текст.Каждая строка заканчивается на \ n;Таким образом, вы не можете сегментировать абзацы просто с помощью "\ n".Если строка соответствует следующему условию:

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

, то эта строка является последней строкой ее абзаца.Здесь 32 - значение Юникода.

0 голосов
/ 01 января 2015
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());
    }
0 голосов
/ 25 августа 2013

После извлечения текста абзац может быть построен программно с учетом следующих пунктов:

  1. Все строки, начинающиеся с маленьких букв, должны быть объединены с предыдущей строкой. Но строка, начинающаяся с заглавной буквы, может также потребовать присоединения к предыдущей строке. например: для выражения в кавычках.

  2. .,?,!, "Конец строки с этими символами может быть концом абзаца. Не всегда.

  3. Если программно определен абзац, проверьте его на четное количество кавычек. Это может быть простая двойная кавычка или двойная открывающая и закрывающая кавычка Unicode.

...