Ответ 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
может игнорировать текст на основе любых критериев, которые вы хотите. Размер шрифта звучит правильно, основываясь на вашем комментарии.