Расширенный парсер PDF для Java - PullRequest
13 голосов
/ 27 марта 2011

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

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

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

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

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

UPDATE

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

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

Но вывод нулевой. Поле «сводка» в порядке.

Следующий фрагмент работает нормально.

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

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

ОБНОВЛЕНИЕ 2

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

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

Ответы [ 5 ]

16 голосов
/ 28 марта 2011

iText - мой любимый инструмент PDF в эти дни.

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

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

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

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

  • images

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

  • ссылки

Да.Ссылки являются «аннотациями» к различным страницам 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 ) );
}

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

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

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

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

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

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

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

5 голосов
/ 27 марта 2011
1 голос
/ 27 марта 2011

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

0 голосов
/ 28 марта 2011

Большую часть этого вы можете сделать с нашей расширенной редакцией библиотеки PDF .

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

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

0 голосов
/ 27 марта 2011

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

ЧТЕНИЕ PDFS

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...