简而言之
我一直在研究获取pdf的程序,突出显示一些单词(通过pdfbox Mark Annotation obj)并保存新的pdf。
我希望突出显示的单词显示工具提示,上面带有一些小的描述,如提示。
例如,我要在pdf上将突出显示的单词已激活显示为工具提示找到的重要单词,当我将鼠标停在其上方时。
This是原始测试pdf。
我的代码
简而言之,我有几个抽象:
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文件:
我想要什么
现在,我想在上面添加工具提示,就像我添加超链接时一样,如下所示,但是带有自由文本。如果将它附加到url上,我只能有一个这样的工具提示,即使我添加了我需要的字符串,pdfbox也会在内部从中创建一个uri ...
FYI:这是注释链接代码:
PDAnnotationLink link = new PDAnnotationLink();
link.setAction("www.stackoverflow.com");
link.setRectangle(pdRectangle);
link.setQuadPoints(quads); annotations.add(link);
我尝试过的原因以及为什么我还不满意
1)我尝试添加注释链接,如上所示,但是使用了描述而不是URL,例如找到的重要单词。结果不好,工具提示会转换为类似以下内容:file:/// Users / myproject / root / important word found。
此外,也不建议使用此链接注释,因为在某些情况下,我希望同时具有URL和工具提示。但是,如果我可以解决这个问题,那将是一个真正的考虑。
2)我尝试将内容添加到我的标记注释中,它的工作方式类似于弹出窗口,如下所示:
它的工作原理是...当我将鼠标悬停在它上面时,我的工具提示说明会显示得很漂亮。但是,您会在单词上方看到该气泡图标。这是此解决方案的唯一问题,这些气泡很烦人,最终重叠了文本的重要部分并污染了pdf。如果我能把它们藏起来或让我满意的话。
here是带有此批注的文档。
添加该弹出窗口的代码很简单,添加以下行:
txtMark.setContents("Important word found");
结论
任何很好地添加工具提示或删除该注释气泡的提示,我们将不胜感激。预先感谢。
编辑
正如@Tilman Hausherr在评论中建议的那样,我在代码中添加了以下行:
txtMark.setTitlePopup("Important word found");
未设置内容。我没有烦人的气泡了,但是现在我需要双击我的注释,然后会出现一个不太美观或实用的弹出窗口:
这有一点帮助,因为这是我到目前为止取得的最好成绩。
编辑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时,我才能看到一些东西:在每个文本标记注释上完全空白的弹出窗口。
因此,我最终得到了@Tilman的建议,在不设置内容的情况下将setTitlePopup添加到了我的标记中。为了使注释及其工具提示可通过pdf.js等某些查看器看到,还需要调用ConstructAppearances方法:
txtMark.setTitlePopup("Important word found");
txtMark.constructAppearances();
虽然这不是完美的,但因为它需要双击注释才能显示,并且只有像Adobe这样的更强大的pdf阅读器才能看到,这是到目前为止我所能找到的最好的解决方案,并且已经足够。如果用pdf.js包裹pdf文件,也可以完全满足我的期望,如下所示: