Как сделать аннотацию, как подсветку, зачеркивание, подчеркивание, рисование, добавление текста и т.д. В андроид для просмотра PDF?

  • Многие приложения, такие как RepliGo, Aldiko, Mantano, ezPdf на рынке Android, делают этот вид аннотации в своем PDF-приложении, показанном на рисунке ниже.
  • Я попытался во многом реализовать эту аннотацию, но мне не удалось. У меня есть программа просмотра pdf для Android и отдельный код java для аннотаций с использованием iText для рисования линий.
  • Мой вопрос: могу ли я реализовать iText в android. Если это возможно, какой пакет мне нужно импортировать?
  • Также в некоторых приложениях для рисования линий используется метод холста. Можно ли включить этот метод canvas в android вместо использования аннотации?. Целью было бы иметь те же функции, что и аннотации.
  • В приведенном ниже изображении (RepliGo PDF Reader), какой код они использовали для аннотаций? enter image description here

Ответ 1

Кажется, ваш вопрос заключается в том, какие методы позволяют пользователям аннотировать файл PDF в android/java, поэтому для вас это один из методов, хотя это может быть не лучшее решение.

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

Это означает, что он не создаст новый PDF файл с размещенными в нем аннотациями, а вместо этого он просто сохранит данные пользователя для каждого файла PDF, загруженного в ваше приложение, и покажет, когда пользователь загружает файл PDF еще раз. (Таким образом, он, как представляется, аннотируется).

Пример:

  • Прочитайте текст в формате PDF, текстовое форматирование и изображения в своем приложении.
  • Отобразить документ (например, текстовый процессор)
  • Разрешить пользователю редактировать и комментировать документ
  • Сохранение изменений и аннотаций в приложении (а не в файле PDF)
  • При повторной загрузке файла применяйте ранее сохраненные изменения и аннотации.

Ваш класс аннотации может выглядеть примерно так:

class Annotations implements Serializable {

    public Annotations() {
        annotations = new HashSet<Annotation>();
    }

    public ArrayList<Annotation> getAnnotations() {
        return new ArrayList<Annotation>(annotations);
    }

    public Annotation annotate(int starpos, int endpos) {
        Annotation a = new Annotation(startpos, endpos);
        annotations.add(a);
        return a;
    }

    public void unannotate(Annotation a) {
        annotations.remove(a);
    }

    static enum AnnotationTypes {
        HIGHLIGHT, UNDERLINE;
    }

    class Annotation {
        int startPos, endPos;
        AnnotationTypes type;
        Color color;
        Annotation(int start, int end) {
          startPos = start;
          endPos = end;
        }
        public void update(int start, int end) {
          startPos = start;
          endPos = end;
        }
        public void highlight(int red, int green, int blue) {
            type = AnnotationTypes.HIGHLIGHT;
            color = new Color(red, green, blue);
        }
        public void underline(int red, int green, int blue) {
            type = AnnotationTypes.UNDERLINE;
            color = new Color(red, green, blue);
        }
        // getters
        ...
    }

    private Set<Annotation> annotations;
}

Итак, вы просто сохраняете данные для отображения аннотаций здесь, и когда вы загружаете файл и его соответствующий (сериализованный) объект Annotations, вы можете использовать каждую аннотацию, чтобы повлиять на отображение символов между startPos и endPos в вашем документе.

Хотя я использовал int для двух позиций startPos и endPos, вы могли бы также использовать две или более переменных для ссылки на индексы массивов, индексы таблицы базы данных SQLite, позиции char для простых текстовых документов; независимо от вашей реализации, вы можете просто изменить это так, чтобы вы знали, с чего начинать аннотирование и где заканчивать аннотирование с помощью этого объекта AnnotationType.

Кроме того, вы можете настроить слушателей смены свойств, чтобы при изменении свойств аннотации они запускали методы для обновления вашего дисплея/представления.