Я новичок в pdfbox, и я хочу извлечь абзац, который соответствует некоторым словам, и я могу извлечь весь текст в текст (блокнот), но я не знаю, как извлечь конкретный абзац в мою программу java. Может ли кто-нибудь помочь мне с этим, по крайней мере, некоторыми учебниками или примерами. Большое вам спасибо.
PDFBox, извлечение абзацев
Ответ 1
Текст в документах PDF абсолютно позиционируется. Поэтому вместо слов, строк и абзацев у одного есть только позиционированные символы.
Скажем, у вас есть параграф:
Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit
Грубо говоря, в файле PDF он будет представлен как символы N
в некоторой позиции, e
немного правее к нему, q
, u
, e
больше справа и т.д.
PDFBox пытается угадать, как символы делают слова, строки и абзацы. Таким образом, он будет искать множество персонажей в примерно одинаковой вертикальной позиции, для групп персонажей, которые находятся рядом друг с другом, и похоже на попытку найти то, что вам нужно. Он делает это, извлекая текст со всей страницы, а затем обрабатывая его символом по символу для создания текста (он также может попытаться извлечь текст из одной прямоугольной области внутри страницы). См. Соответствующий класс PDFTextStripper (или PDFTextStripperByArea). Для использования см. ExtractText.java
в источниках PDFBox.
Это означает, что вы не можете легко извлекать абзацы, используя PDFBox. Это также означает, что PDFBox может и иногда пропустить при извлечении текста (там есть много разных документов PDF).
Что вы можете сделать, это извлечь текст со всей страницы, а затем попытаться найти ваш абзац, просматривая этот текст. Регулярные выражения обычно хорошо подходят для таких задач (доступны в Java либо через Pattern и Matcher или удобные методы на String).
Ответ 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
Ответ 3
Я обнаружил начало абзаца, используя следующий подход. Прочитайте страницу по строкам. Для каждой строки: -
- Найдите последний индекс '.' (период) в строке.
- Сравните этот индекс с длиной строки ввода.
- Если индекс меньше, это означает, что это не конец предыдущего абзаца.
- Если это так, это указывает на то, что предыдущий абзац закончился, а следующая строка будет началом нового абзаца.
Надеюсь, что это поможет.
Ответ 4
После извлечения текста абзац может быть запрограммирован с учетом следующих точек:
-
Все строки, начинающиеся с маленьких букв, должны быть соединены с предыдущей строкой. Но строка, начинающаяся с заглавной буквы, может также потребовать присоединиться к предыдущей строке. например: для цитируемого выражения.
-
.,?,!, "конечная строка с этими символами может быть концом абзаца. Не всегда.
-
Если программно определен абзац, тогда проверьте его на четное количество кавычек. Это может быть простая двойная кавычка или двойная кавычка открытия и закрытия Unicode.
Ответ 5
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());
}
Ответ 6
Вы можете сначала использовать функцию getText pdfbox, чтобы получить текст. Каждая строка заканчивается на \n; Таким образом, вы не можете сегментировать абзацы просто с помощью "\n". Если строка удовлетворяет следующему условию:
line.length() > 2 && (int)line.charAt(line.length()-2) == 32
тогда эта строка является последней строкой своего абзаца. Здесь 32 - значение Юникода.