В PDFBox можно ли добавить подсказку (подсказку) к аннотации метки? - PullRequest
1 голос
/ 14 января 2020

В двух словах

Я работал над программой, которая получает PDF, выделяет некоторые слова (через pdfbox Mark Annotation obj) и сохраняет новый PDF.

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

Например, я хочу, чтобы в моем PDF-файле выделенное слово активировалось показывает всплывающую подсказку найденное важное слово , когда я останавливаю на нем указатель мыши.

Этот является исходным тестовым pdf.

My Код

С парой абстракций, в двух словах, у меня есть:

File file = new File("path/to/myfile/mypdf.pdf");

PDDocument document = PDDocument.load(file);

PDPage page = document.getPage(0);
List<PDAnnotation> annotations = page.getAnnotations();

PDAnnotationTextMarkup txtMark = new PDAnnotationTextMarkup(PDAnnotationTextMarkup.SUB_TYPE_HIGHLIGHT);
txtMark.setRectangle(pdRectangle);
txtMark.setQuadPoints(quadPoints);
txtMark.setColor(getColor());

annotations.add(txtMark);

Текущий результат

В настоящее время он генерирует pdf с пометками пометок, как показано ниже на слове , активировано :

enter image description here

Что я хочу

Теперь я хочу добавить всплывающую подсказку, как и при добавлении гиперссылки, как показано ниже, но вместо этого со свободным текстом. У меня может быть всплывающая подсказка, только если она прикреплена к URL, даже если я добавлю нужную строку, pdfbox внутренне создаст из нее uri ...

enter image description here

К вашему сведению: это код ссылки аннотации:

PDAnnotationLink link = new PDAnnotationLink();
link.setAction("www.stackoverflow.com");
link.setRectangle(pdRectangle);
link.setQuadPoints(quads); annotations.add(link);

Что я пробовал и чем еще не удовлетворен

1) Я попытался добавить ссылку для аннотации, как показано выше, но с описанием вместо URL, например найдено важное слово . Результат не очень хороший, всплывающая подсказка преобразуется во что-то вроде: file: /// Users / myproject / root / важное слово найдено .

Также эта аннотация ссылки не является рекомендуемым способом go, так как в некоторых случаях я хотел бы иметь и URL, и всплывающую подсказку. Но если бы я мог изменить это, это было бы реальным соображением.

2) Я попытался добавить контент к моей аннотации отметки, которая работает как всплывающее окно, как показано ниже:

enter image description here

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

здесь - это do c с этой аннотацией.

И код для добавления этого всплывающего окна было просто добавить строку ниже:

txtMark.setContents("Important word found");

Заключение

Любая подсказка, чтобы либо добавить подсказку, либо удалить этот пузырь с комментариями, будет очень цениться. Заранее спасибо.

РЕДАКТИРОВАТЬ

Как @Tilman Hausherr предложил в комментариях, я добавил следующую строку в свой код:

txtMark.setTitlePopup("Important word found");

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

enter image description here

Это немного помогает, так как это лучшее, что я получил до сих пор.

РЕДАКТИРОВАТЬ 2

Моя попытка с PDAnnotationPopup: добавил в мой код строки ниже, как предложенный @Tilman:

...
PDAnnotationPopup pdAnnotationPopup = new PDAnnotationPopup();
pdAnnotationPopup.setParent(txtMark);
pdAnnotationPopup.setContents("Important word found");

// Just to make sure
pdAnnotationPopup.setInvisible(false);
pdAnnotationPopup.setNoView(false);
pdAnnotationPopup.setNoZoom(false);
pdAnnotationPopup.setLocked(false);
pdAnnotationPopup.setHidden(false);

annotations.add(pdAnnotationPopup);

Я также исследовал другие параметры PDAnnotationPopup, такие как setOpen , setRectangle ... и попытался сохранить его в сосуществовании с txtMark.setTitlePopup .

К сожалению, все это никак не повлияло на мой код. Только когда я установил setOpen (true) плюс setRectangle, я мог видеть что-то: абсолютно пустое всплывающее окно над каждой из моих заметок с текстовыми метками.

1 Ответ

1 голос
/ 10 февраля 2020

Таким образом, я закончил с предложением @Tilman, добавив setTitlePopup к своей отметке без установки содержимого. Чтобы аннотации и их всплывающие подсказки были видны через некоторые средства просмотра, например pdf. js, также необходимо вызвать метод constructAppearances:

txtMark.setTitlePopup("Important word found");
txtMark.constructAppearances(new PDHighlightAppearanceHandler(txtMark, pdDocument));

Хотя это не идеально, так как для него требуется двойное значение нажмите на аннотацию, которая будет отображаться, и она будет видна только более надежным читателям PDF, таким как Adobe. Это лучшее решение, которое я мог найти до сих пор, и этого будет достаточно. Кроме того, он полностью соответствует моим ожиданиям, если вы оберните PDF-файл pdf. js, как показано ниже:

pdf viewed with pdf.js

...