Расширенный PDF-парсер для Java

Я хочу извлечь другой контент из файла PDF в Java:

  • Полный видимый текст
  • изображения
  • ссылки

Можно ли также получить следующее?

  • метатеги документов, такие как название, описание или автор.
  • только заголовки
  • если документ содержит форму

Мне не нужно манипулировать или делать PDF файлы. Какая библиотека лучше всего подходит для этой цели?

UPDATE

ОК, я попробовал PDFBox:

Document luceneDocument = LucenePDFDocument.getDocument(new File(path));
Field contents = luceneDocument.getField("contents");
System.out.println(contents.stringValue());

Но вывод равен null. Поле "summary" в порядке, хотя.

Следующий снипп отлично работает.

PDDocument doc = PDDocument.load(path);
PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(doc);
System.out.println(text);
doc.close();

Но тогда я не знаю, как извлечь изображения, ссылки и т.д.

ОБНОВЛЕНИЕ 2

Я нашел пример, как извлечь изображения, но я до сих пор не получил ответа о том, как извлечь:

  • ссылки
  • метатеги документов, такие как название, описание или автор.
  • только заголовки
  • если документ содержит форму

Ответ 1

iText - это мой инструмент PDF в наши дни.

  • Полный видимый текст

"Видимый" - жесткий. Вы можете разобрать весь анализируемый текст с помощью классов пакетов com.itextpdf.text.pdf.parse... но эти классы не знают о CLIPPING. Вы можете достаточно ограничить парсер размером страницы.

// all text on the page, regardless of position
PdfTextExtractor.getTextFromPage(reader, pageNum);

Вам действительно нужно переопределение, которое принимает стратегию TextExtractionStrategy, отфильтрованную стратегию. Он становится интересным довольно быстро, но я думаю, что вы можете получить все, что хотите, здесь "из коробки".

  • изображения

Да, через те же классы пакетов. Слушатели изображений не так хорошо поддерживаются, как текстовые прослушиватели, но существуют.

  • ссылки

Да. Ссылки - это "аннотации" к различным страницам PDF. Поиск их - это простой вопрос, связанный с каждым массивом аннотаций каждой страницы и выделением аннотаций ссылок.

PdfDictionary pageDict = myReader.getPageN(1);
PdfArray annots = pageDict.getAsArray(PdfName.ANNOTS);
ArrayList<String> dests = new ArrayList<String>();
if (annots != null) {
  for (int i = 0; i < annots.size(); ++i) {
    PdfDictionary annotDict = annots.getAsDict(i);
    PdfName subType = annotDict.getAsName(PdfName.SUBTYPE);
    if (subType != null && PdfName.LINK.equals(subType)) {
      PdfDictionary action = annotDict.getAsDict(PdfName.A);
      if (action != null && PdfName.URI.equals(action.getAsName(PdfName.S)) {
        dests.add(action.getAsString(PdfName.URI).toString());
      } // else { its an internal link, meh }
    }
  }
}

Здесь вы можете найти PDF Spec здесь.

  • Элементы ввода

Конечно. Для XFA (LiveCycle Designer) или более старых технологий AcroForm, iText может найти все поля и их значения.

AcroFields fields = myReader.getAcroFields();

Set<String> fieldNames = fields.getFields().keySet();
for (String fldName : fieldNames) {
  System.out.println( fldName + ": " + fields.getField( fldName ) );
}

Списки выбора Мутли не будут обрабатываться так хорошо. После двоеточия вы получите пустое пространство для пустых текстовых полей и кнопок. Нет слишком информативного... но это поможет вам начать.

  • метатеги документов, такие как название, описание или автор.

Довольно тривиально. Да.

Map<String, String> info = myPdfReader.getInfo();
System.out.println( info );

В дополнение к основному автору/названию/и т.д. существует довольно сложная схема XML, к которой вы можете получить доступ через reader.getMetadata().

  • только заголовки

A TextRenderFilter может игнорировать текст на основе любых критериев, которые вы хотите. Размер шрифта звучит правильно, основываясь на вашем комментарии.

Ответ 3

Вы также можете использовать JPedal для всех этих задач извлечения.

Ответ 4

Да, Alp, iText предлагает предлагаемые вами функции.

ЧТЕНИЕ PDFS

iText не является программой просмотра PDF, iText не может конвертировать PDF в изображение, а также iText для печати PDF, но Класс PdfReader может предоставить вам доступ к объекты, которые образуют документ PDF и в поток контента каждого стр. Этот поток контента может быть разобран и если контент не был добавлен как растрированный текст, вы можете преобразовать на обычный текст. Обратите внимание, что iText не выполняет OCR.

Используйте класс com.itextpdf.text.pdf.PdfReader;.

Ответ 5

В большинстве случаев вы можете сделать нашу расширенную версию PDF-библиотеки.

Какое бы решение вы ни выбрали, помните, что для некоторых PDF-документов извлечение текста невозможно из-за способа построения PDF (глифы на странице иногда не имеют никакого смыслового значения, связанного с ними). ​​

Быстрый способ проверить это - открыть документ в Acrobat и попробовать скопировать/вставить текст. Если это встречается там как тарабарщина, скорее всего, это будет тарабарщина в любом другом экстракторе PDF.