在PDFBox中,如何使用"翻转"创建链接注释。 /"鼠标悬停在"效果如何?

时间:2015-01-26 04:48:25

标签: java pdf pdfbox

问题:

使用PDFBox,如何使用"鼠标悬停"来创建链接注释。颜色效果(又名翻转/鼠标悬停)?

这意味着当我将鼠标光标悬停在PDF文件中的链接上(不点击它)时,链接会变为其他颜色。如果我将光标移开,链接会变回原来的颜色。

例如:

我正在寻找的效果类似于stackoverflow网站上的链接。当您将鼠标光标悬停在(而不点击)上时,"询问问题"按钮,链接从灰色变为橙色。将光标移开时,颜色会变回灰色。请参见下图:我希望在PDF文件中实现完全相同的效果

Example

我尝试了什么:

在PDF参考文献第六版中,描述了:

  

当用户将光标移动到注释的活动区域而不按下鼠标按钮时,使用翻转外观"

   [rollover appearance]在外观字典中定义,而外观字典又是注释字典中AP条目的值

此外,

在PDFBox中,有一个PDAppearanceDictionary类,它有一个setRolloverAppearance()方法。

这是我能得到的最远的。我不知道如何使用PDAppearanceDictionary类(如果这确实是正确使用的类)与PDAnnotationLink类一起使用,以达到我想要的结果。

我试图在谷歌上找到例子是徒劳的。

2 个答案:

答案 0 :(得分:3)

简而言之

关于这种翻滚效果是否可能存在一些不确定性。使用相当当前的Adobe PDF查看器(Reader XI和Acrobat 9.5)进行显示,所需的翻转效果没有出现在链接注释中。但是,对于按钮小部件(带有相同的URL动作),效果确实出现了。

详细

test code将自定义的PDAnnotationLinkPDAnnotationWidget作为按钮提供给方法,该方法将相应的注释嵌入到文档中,并为其添加正常和翻转外观:

void createRollover(PDAnnotation annotation, String filename) throws IOException, COSVisitorException
{
    PDDocument document = new PDDocument();
    PDPage page = new PDPage();
    document.addPage(page);
    List<PDAnnotation> annotations = page.getAnnotations();

    float x = 100;
    float y = 500;
    String text = "PDFBox";
    PDFont font = PDType1Font.HELVETICA_BOLD;
    float textWidth = font.getStringWidth(text) / 1000 * 18;

    PDPageContentStream contents = new PDPageContentStream(document, page);
    contents.beginText();
    contents.setFont(font, 18);
    contents.moveTextPositionByAmount(x, y);
    contents.drawString(text);
    contents.endText();
    contents.close();

    PDAppearanceDictionary appearanceDictionary = new PDAppearanceDictionary();
    PDAppearanceStream normal = createAppearanceStream(document, textWidth, font, "0.5 0.5 0.5 rg");
    PDAppearanceStream rollover = createAppearanceStream(document, textWidth, font, "1 0.7 0.5 rg");
    PDAppearanceStream down = createAppearanceStream(document, textWidth, font, "0 0 0 rg");
    appearanceDictionary.setNormalAppearance(normal);
    appearanceDictionary.setRolloverAppearance(rollover);
    appearanceDictionary.setDownAppearance(down);
    annotation.setAppearance(appearanceDictionary);

    PDRectangle position = new PDRectangle();
    position.setLowerLeftX(x);
    position.setLowerLeftY(y - 5);
    position.setUpperRightX(x + textWidth);
    position.setUpperRightY(y + 20);
    annotation.setRectangle(position);

    annotations.add(annotation);
    document.save(new File(RESULT_FOLDER, filename));
    document.close();
}

如果是PDAnnotationLink

annotation normal annotation rollover

如果是按钮PDAnnotationWidget

pushbutton normal pushbutton rollover

背景:

OP在他的问题和@Tilman的评论中提到了PDF规范:

  
    

注释可以定义多达三个单独的外观:[...]

         

•当用户将光标移动到注释的活动区域而不按下鼠标按钮时,将使用翻转外观。 [...]

         

正常,翻转和缩小外观应在外观词典中定义,而外观词典又是注释词典中AP条目的值

  

,因此,想:

  

所以它应该是可能的

但他们并未考虑该规范将外观词典引入:

  
    

AP 字典(可选; PDF 1.2)一个外观字典,指定如何在页面上以可视方式显示注释(请参阅12.5.5,“外观流”) 。单个注释处理程序可以忽略此条目并提供自己的外观。

  

因此,乍一看似乎是一个无条件的要求(如果......的话,“翻转外观将被使用”)如果PDF查看器中的注释处理程序具有它自己的想法。

tl; dr:完全由相关的PDF查看器来决定它使用哪些外观流以及它以自己的方式忽略和替换的内容。

如果使用注释外观流,则应始终确保如果忽略给定外观,则还提供最合理使用的信息,例如:在链接注释下面有常规页面内容。

答案 1 :(得分:2)

了解一个&#34;链接&#34;非常重要。 PDF中的注释仅代表可选区域。它是一个矩形,可能有也可能没有文本,并且不以任何方式与任何特定文本绑定(&#34;超链接&#34;文本恰好位于文档的链接区域中)。 Acrobat和Reader有一些&#34;额外的&#34;功能到&#34;猜测&#34;在链接中使用哪个文本,并且使用的标记链接不同的颜色,但从PDF透视图链接只是一个矩形。你可以为链接注释本身提供翻转效果,这可以改变链接矩形本身的外观。示例包括在鼠标悬停时显示先前不可见的矩形轮廓,或者具有可见的矩形轮廓更改颜色。您可以在Acrobat的链接属性菜单中使用它们以更好地理解。

但是,这是您使用链接注释可以实现的唯一滚动类型。要重现Web链接所发生的情况,您需要查看其他解决方法。示例包括创建具有备用翻转外观的文本的Xobject形式,将文本创建为具有翻转外观的基于图像的按钮,甚至使用Flash。我希望这有助于解释链接注释本身是什么和不可能的!