Аннотации и специальный текст с использованием Java

Извлечение выделенного текста

Переберите аннотации страниц и прочитайте выделенный текст из HighlightAnnotation.

  1. Откройте исходный PDF в экземпляре Document.
  2. Переберите объекты Annotation на нужной странице Page.
  3. Проверьте, является ли каждая аннотация HighlightAnnotation, перед приведением её к типу класса аннотации.
  4. Прочитайте помеченный текст из каждой аннотации выделения и выведите его в консоль.
public static void extractHighlightedText(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        for (Annotation annotation : document.getPages().get_Item(1).getAnnotations()) {
            if (annotation instanceof HighlightAnnotation) {
                HighlightAnnotation highlightAnnotation = (HighlightAnnotation) annotation;
                System.out.println(highlightAnnotation.getMarkedText());
            }
        }
    }
}

Извлечение текста из аннотаций штампа

Прочтите поток обычного отображения из аннотации штампа и передайте его объекту TextAbsorber.

  1. Откройте исходный PDF в экземпляре Документ.
  2. Переберите объекты Аннотация на нужной странице Страница.
  3. Отфильтруйте аннотации, тип которых Stamp.
  4. Создайте TextAbsorber и получите запись обычного отображения из словаря отображений аннотации штампа.
  5. Обработайте объект отображения XForm поглотителем и выведите извлечённый текст.
public static void extractStampText(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        for (Annotation annotation : document.getPages().get_Item(1).getAnnotations()) {
            if (annotation.getAnnotationType() == AnnotationType.Stamp) {
                TextAbsorber absorber = new TextAbsorber();
                Object[] xforms = new Object[1];
                if (annotation.getAppearance().tryGetValue("N", xforms) && xforms[0] instanceof XForm) {
                    absorber.visit((XForm) xforms[0]);
                    System.out.println(absorber.getText());
                }
            }
        }
    }
}

Извлечение сведений о надстрочном и подстрочном тексте

Используйте TextFragmentAbsorber, когда вам нужны как извлечённый текст, так и флаги верхнего или нижнего индекса для каждого фрагмента.

  1. Откройте исходный PDF в экземпляре Документ.
  2. Создайте TextFragmentAbsorber для анализа текста на уровне фрагментов.
  3. Обработайте нужную страницу Страница и соберите её объекты TextFragment.
  4. Переберите эти фрагменты и прочитайте текст вместе с флагами надстрочного и подстрочного текста из fragment.getTextState().
  5. Запишите извлечённые детали в выходной файл.
public static void extractSuperSubDetails(Path inputFile, Path outputFile, int pageNumber) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        TextFragmentAbsorber absorber = new TextFragmentAbsorber();
        document.getPages().get_Item(pageNumber).accept(absorber);
        StringBuilder details = new StringBuilder();
        for (TextFragment fragment : absorber.getTextFragments()) {
            details.append("Text: '").append(fragment.getText())
                    .append("' | Superscript: ").append(fragment.getTextState().isSuperscript())
                    .append(" | Subscript: ").append(fragment.getTextState().isSubscript())
                    .append(System.lineSeparator());
        }
        Files.writeString(outputFile, details.toString());
    }
}